From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 05EE41DC991 for ; Wed, 9 Apr 2025 06:10:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179056; cv=none; b=nBklLcOHm7Gvz3ATH7NucVNxIpmYhmqvkUb5pjndk7NKC/oKTMYyVLW2j99rJLS04z8ThhVQ/hE4H9uVN+RbAw7v37qFNJvapz2VDLL57yLf+qlWZTWdx9jwoBAkvMSM/Z3nmyMLEPnbtqo+CO3B/edpyy2lDbw1jgR+soa5GAY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179056; c=relaxed/simple; bh=oTGRBpcL/2sIHNUD+/BM6BV/LmnMI5XK3yo3xDS6KyQ=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=EcCsmV7imSsuy5EjCZeM2asr3UDy40qhiHm2quAD+4PDwHBXa5WynwGpxN+S1UiSCfcKCHqZ+G/+hKh/Qdmpol9eL7oscUR3VGaiL65ki/29yBqF8ZyqJqI4gCkfwGzdwqZFZ/L03W5WeyCQUfu5xtncmUA86nxWafk9whFwuAE= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=utc5F+p5; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="utc5F+p5" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2241ae15dcbso75124375ad.0 for ; Tue, 08 Apr 2025 23:10:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179054; x=1744783854; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=pClnDyLnT+OkOC5ziZK4pcS5wTXzmuK+3iocOmka5vs=; b=utc5F+p5i8vGgDi7rk2VOnkRn2aBXxGKW0y0hlcIOKmS6h9rFaCVAp5mXDPNj4dYy0 QK+w0IzcgZfmjWjJhn58gozjTMjwtLbUSuWazE2cMhezg57AT5pNiP6vxPAkDMJvFOr8 dLi60j4BzYhvbk8uUege1ntniM4wSq1Rwqb0OqcMgj3XIgfjgKF4s3kLVPMHRdmGJ7g3 7B+R04sIgUfNWRbrlLzmc36knsx2QkB5HuYCh7K8EfAz2l7FrXds5r2cGhowwDYT32Zq GNpPd+91DsZpK/jYvfa1q5jC7WiPa59v1kvfagiZGdstBVvmlMscl1ouYxcivWH1t8mG xhJw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179054; x=1744783854; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=pClnDyLnT+OkOC5ziZK4pcS5wTXzmuK+3iocOmka5vs=; b=Fy8ywh25tz1S9ycbo/12NAVo6ZISfC5vLwNZ4BqVO/wKYY1j9i/ljDpDgvEj6mxu9M f3IGnsYUGXwuSE8BVLh7nzLNXVuvhHsWnoJkjiJVs/YQ4wQI3gxv8fG6Xa5WwawSKGrL j5sEemKil+lN+85N418gicw9a84PA4N+wIErytGxQwH79iIuRUzKpWcYHgK5VahDlO2i sB3NKmJ1y9sJ65Bv23Cdg52CGES2RxNHDIZnJq2YUX9B6ZtsN/BsUD5JneXjaiTEEhGm Zzgm1qoeViIpRF4KB73btRtJKABUF5rWSkAdIF9Stj60qJT2xCiln+KIeyNqxsLlHc+M /RxQ== X-Forwarded-Encrypted: i=1; AJvYcCXNrMWgwtM6H8GG13hp+fd3aPoEJMUb6vUbCAk0Vz+57bBcxi/KqwgzdvwkydzewV99fP6cB4ZhRg2w9yw=@vger.kernel.org X-Gm-Message-State: AOJu0YzGUQuxmt/UquwGUcbXqquQpiVZSp1QNqxm5vXYCgPhjcsJx06V cZvoswnKiW2SE2xFSpRq5wj8xzXWaX35YAZCOrYTqY5+RGZyN9A/tgJCupXvuhstcrn6TidKJic 77zjrUA== X-Google-Smtp-Source: AGHT+IHJ7OZd30Pwnp9LWB65mMC8ePjlrwbBobAW63Dt1IVdQiKqKLmW2rrxhqIOsCAyzqlVhIjp4+dUdqxj X-Received: from pjtu11.prod.google.com ([2002:a17:90a:c88b:b0:2f4:4222:ebba]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2acd:b0:21f:1202:f2f5 with SMTP id d9443c01a7336-22ac3f2dd64mr17492915ad.8.1744179054277; Tue, 08 Apr 2025 23:10:54 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:28 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-2-irogers@google.com> Subject: [PATCH v4 01/16] perf intel-tpebs: Cleanup header From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Remove arch conditional compilation. Arch conditional compilation belongs in the arch/ directory. Tidy header guards to match other files. Remove unneeded includes and switch to forward declarations when necesary. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/Build | 2 +- tools/perf/util/intel-tpebs.c | 1 + tools/perf/util/intel-tpebs.h | 30 ++++++------------------------ 3 files changed, 8 insertions(+), 25 deletions(-) diff --git a/tools/perf/util/Build b/tools/perf/util/Build index 946bce6628f3..815274b199fd 100644 --- a/tools/perf/util/Build +++ b/tools/perf/util/Build @@ -161,7 +161,7 @@ perf-util-y +=3D clockid.o perf-util-y +=3D list_sort.o perf-util-y +=3D mutex.o perf-util-y +=3D sharded_mutex.o -perf-util-$(CONFIG_X86_64) +=3D intel-tpebs.o +perf-util-y +=3D intel-tpebs.o =20 perf-util-$(CONFIG_LIBBPF) +=3D bpf_map.o perf-util-$(CONFIG_PERF_BPF_SKEL) +=3D bpf_counter.o diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index 2c421b475b3b..3503da28a12f 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -19,6 +19,7 @@ #include "tool.h" #include "cpumap.h" #include "metricgroup.h" +#include "stat.h" #include #include #include diff --git a/tools/perf/util/intel-tpebs.h b/tools/perf/util/intel-tpebs.h index 766b3fbd79f1..63c16e759a71 100644 --- a/tools/perf/util/intel-tpebs.h +++ b/tools/perf/util/intel-tpebs.h @@ -2,34 +2,16 @@ /* * intel_tpebs.h: Intel TEPBS support */ -#ifndef INCLUDE__PERF_INTEL_TPEBS_H__ -#define INCLUDE__PERF_INTEL_TPEBS_H__ +#ifndef __INTEL_TPEBS_H +#define __INTEL_TPEBS_H =20 -#include "stat.h" -#include "evsel.h" - -#ifdef HAVE_ARCH_X86_64_SUPPORT +struct evlist; +struct evsel; =20 extern bool tpebs_recording; + int tpebs_start(struct evlist *evsel_list); void tpebs_delete(void); int tpebs_set_evsel(struct evsel *evsel, int cpu_map_idx, int thread); =20 -#else - -static inline int tpebs_start(struct evlist *evsel_list __maybe_unused) -{ - return 0; -} - -static inline void tpebs_delete(void) {}; - -static inline int tpebs_set_evsel(struct evsel *evsel __maybe_unused, - int cpu_map_idx __maybe_unused, - int thread __maybe_unused) -{ - return 0; -} - -#endif -#endif +#endif /* __INTEL_TPEBS_H */ --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-oa1-f73.google.com (mail-oa1-f73.google.com [209.85.160.73]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 5B2951DE4EF for ; Wed, 9 Apr 2025 06:10:57 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.73 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179058; cv=none; b=IHuQSGhfLaQwQAuohCItcCU946IcUwfKA3FL6C4qjWPUM1/lCwfRpHyroLEK7J9CxdPLEGvfNSY4g18gaNccal+o4N51/X7974vesPpDoAy540LTSfdsKU8q3dj3HKgOazHfLd907y/PL6Z3LyAuBobxcLbAtFZNR2tiLpbsYGM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179058; c=relaxed/simple; bh=ifUhHpvB3YWjewd+FCiG+bnPL8N1hMQyEOj1ALhK2zo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=enSkIod9zjS9m/hdbDE7hQnkM3NqQjoU7+hRUSv4yyuWQDZ1ZN9LqqNk5mYnkMaJ8KJLZP6ocdMqA40dISc9ul5j4zfDWJu+td7JDlAp/es5Uj/20MhXQEpQFhPNiI7IX47sw+ApbNFiUeahEjvvVlYLMd0t7TYMbyhCfhpWuyQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=fpVVhA44; arc=none smtp.client-ip=209.85.160.73 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="fpVVhA44" Received: by mail-oa1-f73.google.com with SMTP id 586e51a60fabf-2c268416ff5so1498482fac.3 for ; Tue, 08 Apr 2025 23:10:57 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179056; x=1744783856; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=Kljzr7zwrGyBJiGR5feDDMzqEBYffKkoUZPkiCSQTN4=; b=fpVVhA44Y2m2+TlzZGUrbfOSvev7enE20WJmJNTdDXDFMERa97HZjuxoP6SR06IvQY PemvLwfB7shm1C+TTf8ygs2QdkLkCEPPEGYpmtust1fvXQ+JJpYFKc+C9a7Lmdmno1sw eWL3DNyZIRYIli0tkdfI0xzWCOl4DcAnGKFD9l9Rrrvhp0hC8YDsMV46wyijjG4si7Ok A6dDnjKG3faPp2iayK+JGdaJrUNWCQ4HaQzWbEtFZDPLHP1pnaNTzuGflS1lkDF72wTO Pvs/JzEYFzKPKZlaVxhdi/jilz1Qyrx6MGn5cVqWNWHijOZipjLBp00j03qC+YEggqFh Bpqg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179056; x=1744783856; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=Kljzr7zwrGyBJiGR5feDDMzqEBYffKkoUZPkiCSQTN4=; b=RSbZ/B/2oNZIsZBiBPR/snjjqmEg4E6/94BwjzlmLOFp44TlMmYsfogp2Nv1qTMsTw CcHCew5MFV3e+ItJqUu+EANOtdNNoriIMOlnhi8BehdYwkx91o5Y6vU7483Q36kwGt5u 4gK7V4m86pUftkUOKVCDiTfTpfhSlLJfYOo65g3MRUUrkc9Pl0yrF/+sGkMEjlRLnYH8 yi+SvmKDK9IeQ124doRVogcwQEtiaxcqnPVzDvp7RFwiZ8waZ8f+BQCSv6+ZuEKRKBxL zpOHvj3FBx/fI34BgowU/XlKKk/HOf3EjXNIJq0Yw0YedrqPL3f5JGol/MxtoEJ5qD72 CutQ== X-Forwarded-Encrypted: i=1; AJvYcCVc5WfkNe7130Tt9xSSgr+/ar4vrWFUIrT6GiUaF/HNMzco2+JbsMeKnQXfjA0JrsNhySNOJMCWYcNqMaM=@vger.kernel.org X-Gm-Message-State: AOJu0YxL0thPHwIwxAIBbea0LEwQhn6ga5eOQiY9EeiYQz5Wnue1UQKv Nqgr0vu19iw/6egM1106WemuFGIGiXXaK+gks9vUN7FvcX98zyO2Uar3UBhDb7s1GlmMeiEBah+ KSUM8Wg== X-Google-Smtp-Source: AGHT+IEpAbci5D2K+zrEKBctEU7OjBR99gLmABLkKFhH8ddfFXAcjMioCvNvAVxx/8hAxWgkTErdlti5tTxo X-Received: from oabwh16.prod.google.com ([2002:a05:6871:a690:b0:2c2:13d6:cf76]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6871:3a85:b0:297:2479:a35b with SMTP id 586e51a60fabf-2d0917334f5mr642451fac.1.1744179056381; Tue, 08 Apr 2025 23:10:56 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:29 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-3-irogers@google.com> Subject: [PATCH v4 02/16] perf intel-tpebs: Simplify tpebs_cmd From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" No need to dynamically allocate when there is 1. tpebs_pid duplicates tpebs_cmd.pid, so remove. Use 0 as the uninitialized value (PID =3D=3D 0 is reserved for the kernel) rather than -1. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/intel-tpebs.c | 55 ++++++++++++----------------------- 1 file changed, 18 insertions(+), 37 deletions(-) diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index 3503da28a12f..74b43faab986 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -28,11 +28,10 @@ #define PERF_DATA "-" =20 bool tpebs_recording; -static pid_t tpebs_pid =3D -1; static size_t tpebs_event_size; static LIST_HEAD(tpebs_results); static pthread_t tpebs_reader_thread; -static struct child_process *tpebs_cmd; +static struct child_process tpebs_cmd; =20 struct tpebs_retire_lat { struct list_head nd; @@ -83,16 +82,6 @@ static int get_perf_record_args(const char **record_argv= , char buf[], return 0; } =20 -static int prepare_run_command(const char **argv) -{ - tpebs_cmd =3D zalloc(sizeof(struct child_process)); - if (!tpebs_cmd) - return -ENOMEM; - tpebs_cmd->argv =3D argv; - tpebs_cmd->out =3D -1; - return 0; -} - static int start_perf_record(int control_fd[], int ack_fd[], const char *cpumap_buf) { @@ -110,10 +99,10 @@ static int start_perf_record(int control_fd[], int ack= _fd[], if (ret) goto out; =20 - ret =3D prepare_run_command(record_argv); - if (ret) - goto out; - ret =3D start_command(tpebs_cmd); + assert(tpebs_cmd.pid =3D=3D 0); + tpebs_cmd.argv =3D record_argv; + tpebs_cmd.out =3D -1; + ret =3D start_command(&tpebs_cmd); out: free(record_argv); return ret; @@ -156,14 +145,13 @@ static int process_feature_event(struct perf_session = *session, return 0; } =20 -static void *__sample_reader(void *arg) +static void *__sample_reader(void *arg __maybe_unused) { - struct child_process *child =3D arg; struct perf_session *session; struct perf_data data =3D { .mode =3D PERF_DATA_MODE_READ, .path =3D PERF_DATA, - .file.fd =3D child->out, + .file.fd =3D tpebs_cmd.out, }; struct perf_tool tool; =20 @@ -189,12 +177,12 @@ static int tpebs_stop(void) int ret =3D 0; =20 /* Like tpebs_start, we should only run tpebs_end once. */ - if (tpebs_pid !=3D -1) { - kill(tpebs_cmd->pid, SIGTERM); - tpebs_pid =3D -1; + if (tpebs_cmd.pid !=3D 0) { + kill(tpebs_cmd.pid, SIGTERM); pthread_join(tpebs_reader_thread, NULL); - close(tpebs_cmd->out); - ret =3D finish_command(tpebs_cmd); + close(tpebs_cmd.out); + ret =3D finish_command(&tpebs_cmd); + tpebs_cmd.pid =3D 0; if (ret =3D=3D -ERR_RUN_COMMAND_WAITPID_SIGNAL) ret =3D 0; } @@ -219,7 +207,7 @@ int tpebs_start(struct evlist *evsel_list) * We should only run tpebs_start when tpebs_recording is enabled. * And we should only run it once with all the required events. */ - if (tpebs_pid !=3D -1 || !tpebs_recording) + if (tpebs_cmd.pid !=3D 0 || !tpebs_recording) return 0; =20 cpu_map__snprint(evsel_list->core.user_requested_cpus, cpumap_buf, sizeof= (cpumap_buf)); @@ -284,10 +272,11 @@ int tpebs_start(struct evlist *evsel_list) ret =3D start_perf_record(control_fd, ack_fd, cpumap_buf); if (ret) goto out; - tpebs_pid =3D tpebs_cmd->pid; - if (pthread_create(&tpebs_reader_thread, NULL, __sample_reader, tpebs_cm= d)) { - kill(tpebs_cmd->pid, SIGTERM); - close(tpebs_cmd->out); + + if (pthread_create(&tpebs_reader_thread, /*attr=3D*/NULL, __sample_reade= r, + /*arg=3D*/NULL)) { + kill(tpebs_cmd.pid, SIGTERM); + close(tpebs_cmd.out); pr_err("Could not create thread to process sample data.\n"); ret =3D -1; goto out; @@ -416,18 +405,10 @@ void tpebs_delete(void) { struct tpebs_retire_lat *r, *rtmp; =20 - if (tpebs_pid =3D=3D -1) - return; - tpebs_stop(); =20 list_for_each_entry_safe(r, rtmp, &tpebs_results, nd) { list_del_init(&r->nd); tpebs_retire_lat__delete(r); } - - if (tpebs_cmd) { - free(tpebs_cmd); - tpebs_cmd =3D NULL; - } } --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pg1-f202.google.com (mail-pg1-f202.google.com [209.85.215.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id D240D1DDA1E for ; Wed, 9 Apr 2025 06:10:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.215.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179060; cv=none; b=GrjURZCmcW0ibp2JZ2foBoBiXL3/+4dATzYHeD9oUUU8wTquisQB5ZVEOOHMIsAwXvfcBofQHgxKbVSFJ12/HA7cZBtTJhy47Ko42Z7Zogkjg+YA0yj6FJ7w+xCWa+uTuHulu8rJ9MMsU3+4wORiNOFG1pPJ7XdTYpWOtdmbcno= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179060; c=relaxed/simple; bh=2l/1oKHeKrpT+PnW/axoFCb0/bWcsP4vJAsPyglQu90=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=I5VF7OX2bNseSoqOgk/8zvHGEmYfgrpKxZQam5gPh0BoPg4cFkbffFTsmI4wwnM5FbPYnu5DkgN5QBpH6vsoJCG8Uf2KneF0rAeOEIDu3wDn3rTTvKVo8SskGKObt3q/Yh5VbYlx52IUusi+40DI86CLhOKFggVTVB9Cm04tMsU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=u4efb/rU; arc=none smtp.client-ip=209.85.215.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="u4efb/rU" Received: by mail-pg1-f202.google.com with SMTP id 41be03b00d2f7-af8a4410816so5278145a12.1 for ; Tue, 08 Apr 2025 23:10:58 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179058; x=1744783858; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=n0w8p9z7uIDU2rw9JTfItdCw1PZrvXFzExYD6rhP3a4=; b=u4efb/rUv7bxkQ8Xbdbjdia3aiCSfzVfB2CPXmeZlk7NDz5iVSKXFhndvhKtGY1Qrd w42YY5fduSxqlkUdQ5lbo1SZnC/xOIyuwRQZJVz+q+1Fehqi5pM3iqNHEY1ahupbNOAy ZrxlhmAfczPm9tK0Frn//BnxDuMCIqkfIGIz4eM2M+2e+AHDPiq27HsAccWcUNVMJm3z lV+KRjiYfVxFV54JWq2saXRUy4v7TQz8WcO8t45VNONQnNs0JrJMOCbunvArP/cei6aP fg/OYmCweasFjuKyOQdAUi2Hia8mCUr/2k9CzmUzThKTpo6VX13hinep02JNE3ubc7hb AnKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179058; x=1744783858; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=n0w8p9z7uIDU2rw9JTfItdCw1PZrvXFzExYD6rhP3a4=; b=AamAwOIfw0bT4A66OCNCiT4P+24bfueE6TBuQwQqGPh9v6Qt0sT/KrQczkpj+WSLo5 5s3b4SUsy93b6GaIjWoedPRYiUCROmVkkpOOH0WZdatDItSJBx5cWIySr0Y6KI724gve knySMRtkZYFzwCNClGxA/BZeY38on2gcluTYbSLM1vfvuMqDLx2s9mJCUkcOPWXKeLJK btVryIf3wtTnSkEJV8DXtSTydvqaVWvPZeIjwF6ok1bMTQjEHCedeLWhHxMzK3arz9hX naicp4Lckbqle5MWX9i42Su5gIuRjzR9DS+tddOi42meoDVW5qv9tzOj+SDLa02Q7OBf /FGw== X-Forwarded-Encrypted: i=1; AJvYcCUWmSkFH0justhMvsr8SMBTip2OolvsyUNxdDiOt1cT4yFnWIOFaxvjaTirEJOW4D5aFhymE/7Sf9oW9wI=@vger.kernel.org X-Gm-Message-State: AOJu0YzcOi2IstqvThv9P2ImU5a7inpOEwQJUrNllXmUublGipzcGcoA Ujrw+x/gydNSCw9zPzDMCL+etYFb7Qhal1qpGg29C/7sQ5ePuS4WO1Lt1tyTQAQ4Ne90Jz+4QmS TbvQOcA== X-Google-Smtp-Source: AGHT+IGc+7BVyntdU4p0HeIsWvtKzQBSgCNB0GNk0awJtPTye95FSjH/7LTIWpEujW8ers20zhFBSaddcB1O X-Received: from plth11.prod.google.com ([2002:a17:902:704b:b0:220:e84e:350c]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2444:b0:224:1609:a747 with SMTP id d9443c01a7336-22ac29be769mr31883425ad.31.1744179057966; Tue, 08 Apr 2025 23:10:57 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:30 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-4-irogers@google.com> Subject: [PATCH v4 03/16] perf intel-tpebs: Rename tpebs_start to evsel__tpebs_open From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Try to add more consistency to evsel by having tpebs_start renamed to evsel__tpebs_open, passing the evsel that is being opened. The unusual behavior of evsel__tpebs_open opening all events on the evlist is kept and will be cleaned up further in later patches. The comments are cleaned up as tpebs_start isn't called from evlist. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/evsel.c | 2 +- tools/perf/util/intel-tpebs.c | 33 ++++++++++++++++----------------- tools/perf/util/intel-tpebs.h | 2 +- 3 files changed, 18 insertions(+), 19 deletions(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 1974395492d7..121283f2f382 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -2595,7 +2595,7 @@ static int evsel__open_cpu(struct evsel *evsel, struc= t perf_cpu_map *cpus, struct perf_cpu cpu; =20 if (evsel__is_retire_lat(evsel)) - return tpebs_start(evsel->evlist); + return evsel__tpebs_open(evsel); =20 err =3D __evsel__prepare_open(evsel, cpus, threads); if (err) diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index 74b43faab986..566e0ddcad88 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -12,6 +12,7 @@ #include #include #include "sample.h" +#include "counts.h" #include "debug.h" #include "evlist.h" #include "evsel.h" @@ -189,18 +190,16 @@ static int tpebs_stop(void) return ret; } =20 -/* - * tpebs_start - start tpebs execution. - * @evsel_list: retire_latency evsels in this list will be selected and sa= mpled - * to get the average retire_latency value. - * - * This function will be called from evlist level later when evlist__open(= ) is - * called consistently. +/** + * evsel__tpebs_open - starts tpebs execution. + * @evsel: retire_latency evsel, all evsels on its list will be selected. = Each + * evsel is sampled to get the average retire_latency value. */ -int tpebs_start(struct evlist *evsel_list) +int evsel__tpebs_open(struct evsel *evsel) { int ret =3D 0; - struct evsel *evsel; + struct evsel *pos; + struct evlist *evsel_list =3D evsel->evlist; char cpumap_buf[50]; =20 /* @@ -215,25 +214,25 @@ int tpebs_start(struct evlist *evsel_list) * Prepare perf record for sampling event retire_latency before fork and * prepare workload */ - evlist__for_each_entry(evsel_list, evsel) { + evlist__for_each_entry(evsel_list, pos) { int i; char *name; struct tpebs_retire_lat *new; =20 - if (!evsel->retire_lat) + if (!pos->retire_lat) continue; =20 - pr_debug("tpebs: Retire_latency of event %s is required\n", evsel->name); - for (i =3D strlen(evsel->name) - 1; i > 0; i--) { - if (evsel->name[i] =3D=3D 'R') + pr_debug("tpebs: Retire_latency of event %s is required\n", pos->name); + for (i =3D strlen(pos->name) - 1; i > 0; i--) { + if (pos->name[i] =3D=3D 'R') break; } - if (i <=3D 0 || evsel->name[i] !=3D 'R') { + if (i <=3D 0 || pos->name[i] !=3D 'R') { ret =3D -1; goto err; } =20 - name =3D strdup(evsel->name); + name =3D strdup(pos->name); if (!name) { ret =3D -ENOMEM; goto err; @@ -247,7 +246,7 @@ int tpebs_start(struct evlist *evsel_list) goto err; } new->name =3D name; - new->tpebs_name =3D evsel->name; + new->tpebs_name =3D pos->name; list_add_tail(&new->nd, &tpebs_results); tpebs_event_size +=3D 1; } diff --git a/tools/perf/util/intel-tpebs.h b/tools/perf/util/intel-tpebs.h index 63c16e759a71..cc98203719c8 100644 --- a/tools/perf/util/intel-tpebs.h +++ b/tools/perf/util/intel-tpebs.h @@ -10,7 +10,7 @@ struct evsel; =20 extern bool tpebs_recording; =20 -int tpebs_start(struct evlist *evsel_list); +int evsel__tpebs_open(struct evsel *evsel); void tpebs_delete(void); int tpebs_set_evsel(struct evsel *evsel, int cpu_map_idx, int thread); =20 --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id DB12B1DF98B for ; Wed, 9 Apr 2025 06:11:00 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179064; cv=none; b=KOE6fMMj8qzbS91f+64/SYnI7Nn5v4qIBUCK2ODFup87RI9Cs9lCy2GijWmIoKoOcurHv2m2LKvF1UOVnXPNlBwfqnJkawRywYeH5rwbTeZlWylVtHRbgX/GprMdczf2Z4v06OiNRJGMegydnln2e0JgWVIoa+xi76lfMsNo3mk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179064; c=relaxed/simple; bh=JVanJEDpcMknG2x/X1wULUkE8JUqUZb8O7VIacDzqk4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=rznlcuUzuIItzRFJAJH4Pxfa+jowSZ3KLIDagstQ+HLihsd58beN+VMMZ5MAWlhszs3hffZTj2LN7QvQkQuvuqNTyJ5+TawB+ozVLKHEKFxwk4kTx0rNj2YuCNm5HcJhakzv9GshKbP1qLr7JpGi6rOdUYJnkprjUD/tjQF55L8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=bxidZXyG; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="bxidZXyG" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2254e500a73so50101825ad.0 for ; Tue, 08 Apr 2025 23:11:00 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179060; x=1744783860; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=EpNqTL2jhuFhMzQj4yTZFm6mW4YS6L/CEY0JlzRGbe8=; b=bxidZXyGo/w9wsSfKSKPUtqKSoqljEBNS5RNNPKVVkUvmU2cqZfBsmBnRFCdcl+EN6 se/GxLhzMg6r/cFdAfrJfJjnIHIThuL+hqJK8//CrbtCBgrtMFUDFHRYuEqr7cnYO9IX xe0I0qcqBTP0Nzn14BWP1vrviJyCRU/iP3GVdjSRyxLrKvom9dqhrlWFfYlZP0E3UPOh 3ojuWl8htt2I65fvwwkCbNbmNwM/JNtp5kDaHoq+8w5ipJJVvLR0da8x24HaeGIUHlqr VbjwG8gDvMJZXjo+4aWAAfK1FENnnuWTrO0Hb//C2SW2zTodRLPGrSgYN9H5W6APPPoI ESOQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179060; x=1744783860; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=EpNqTL2jhuFhMzQj4yTZFm6mW4YS6L/CEY0JlzRGbe8=; b=THTBeueONG36uHIlq68SLObs8r9SDFnJ7YzQS/c3Li/bH5Mc8f5JWLqXZSfIHJaBYP jk9fqnFqq/6pY7LkG2yTxvHB7D9jFPPqqdYMQ8jRWwH9Iq/vYT3P5uQeOPIzOd/dsRiZ 5zwfVKGDCiFbElP0IHc4faw2SEUfahoRFyXrBRJpnhlijXafOg7MbXf8Bd2TdYVXYv0r vyf3A4es/nIxpjxGMSwWnTmM/fOLzE8iiWjFbDsq7NW1YJHYzv+Zhco9XGXqJbrQaRGf aE0fOwGM18BA02h3MyhBpfnT4qIBGn5WnVpj1sMYUSUnDFDoc1EnoPuhhRj68V2VHZ7Z jZmw== X-Forwarded-Encrypted: i=1; AJvYcCW9r4hc17JyT+kIv5N6YeT9VUWQj5bNGSF1aIhgWoiJ1UiJe9z8Q7Ey3EbiFAVolo3F/l4Fv9h+eKGRZQk=@vger.kernel.org X-Gm-Message-State: AOJu0YyFcvxRY+kqrHol9sSA+bwleYw+PUNpEW2sw+Rg7pq2IqHLgJ+y VOBETFamXGV+MFQ2uzwGXevTp116wJLNt0RIx4JBKoJqLBF6VeW/DeY3wwVFvXsA9/yYyP/0+bq hVpm2+g== X-Google-Smtp-Source: AGHT+IErAnuwCeBZmsAOzHhsP16PjdkMPY2pHH2AhY36Fl2RSK5pWlpIq5/WuBh19xUKYE8JuHUefEIkZNqY X-Received: from plbbb5.prod.google.com ([2002:a17:902:bc85:b0:220:ecac:27e5]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d507:b0:224:1579:5e8e with SMTP id d9443c01a7336-22ac296e733mr26282625ad.1.1744179060093; Tue, 08 Apr 2025 23:11:00 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:31 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-5-irogers@google.com> Subject: [PATCH v4 04/16] perf intel-tpebs: Separate evsel__tpebs_prepare out of evsel__tpebs_open From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Separate the creation of the tpebs_retire_lat result out of the opening step. This is in preparation for adding a prepare operation for evlists. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/intel-tpebs.c | 133 ++++++++++++++++++++++------------ 1 file changed, 86 insertions(+), 47 deletions(-) diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index 566e0ddcad88..2186818b2c9b 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -37,7 +37,7 @@ static struct child_process tpebs_cmd; struct tpebs_retire_lat { struct list_head nd; /* Event name */ - const char *name; + char *name; /* Event name with the TPEBS modifier R */ const char *tpebs_name; /* Count of retire_latency values found in sample data */ @@ -190,6 +190,82 @@ static int tpebs_stop(void) return ret; } =20 +static char *evsel__tpebs_name(struct evsel *evsel) +{ + char *name, *modifier; + + name =3D strdup(evsel->name); + if (!name) + return NULL; + + modifier =3D strrchr(name, 'R'); + if (!modifier) { + pr_err("Tpebs event missing modifier '%s'\n", name); + free(name); + return NULL; + } + + *modifier =3D 'p'; + return name; +} + +static struct tpebs_retire_lat *tpebs_retire_lat__new(struct evsel *evsel) +{ + struct tpebs_retire_lat *result =3D zalloc(sizeof(*result)); + + if (!result) + return NULL; + + result->tpebs_name =3D evsel->name; + result->name =3D evsel__tpebs_name(evsel); + if (!result->name) { + free(result); + return NULL; + } + list_add_tail(&result->nd, &tpebs_results); + tpebs_event_size++; + return result; +} + +/** + * evsel__tpebs_prepare - create tpebs data structures ready for opening. + * @evsel: retire_latency evsel, all evsels on its list will be prepared. + */ +static int evsel__tpebs_prepare(struct evsel *evsel) +{ + struct evsel *pos; + struct tpebs_retire_lat *tpebs_event; + + list_for_each_entry(tpebs_event, &tpebs_results, nd) { + if (!strcmp(tpebs_event->tpebs_name, evsel->name)) { + /* + * evsel, or an identically named one, was already + * prepared. + */ + return 0; + } + } + tpebs_event =3D tpebs_retire_lat__new(evsel); + if (!tpebs_event) + return -ENOMEM; + + /* + * Eagerly prepare all other evsels on the list to try to ensure that by + * open they are all known. + */ + evlist__for_each_entry(evsel->evlist, pos) { + int ret; + + if (pos =3D=3D evsel || !pos->retire_lat) + continue; + + ret =3D evsel__tpebs_prepare(pos); + if (ret) + return ret; + } + return 0; +} + /** * evsel__tpebs_open - starts tpebs execution. * @evsel: retire_latency evsel, all evsels on its list will be selected. = Each @@ -197,10 +273,7 @@ static int tpebs_stop(void) */ int evsel__tpebs_open(struct evsel *evsel) { - int ret =3D 0; - struct evsel *pos; - struct evlist *evsel_list =3D evsel->evlist; - char cpumap_buf[50]; + int ret; =20 /* * We should only run tpebs_start when tpebs_recording is enabled. @@ -209,49 +282,13 @@ int evsel__tpebs_open(struct evsel *evsel) if (tpebs_cmd.pid !=3D 0 || !tpebs_recording) return 0; =20 - cpu_map__snprint(evsel_list->core.user_requested_cpus, cpumap_buf, sizeof= (cpumap_buf)); - /* - * Prepare perf record for sampling event retire_latency before fork and - * prepare workload - */ - evlist__for_each_entry(evsel_list, pos) { - int i; - char *name; - struct tpebs_retire_lat *new; - - if (!pos->retire_lat) - continue; - - pr_debug("tpebs: Retire_latency of event %s is required\n", pos->name); - for (i =3D strlen(pos->name) - 1; i > 0; i--) { - if (pos->name[i] =3D=3D 'R') - break; - } - if (i <=3D 0 || pos->name[i] !=3D 'R') { - ret =3D -1; - goto err; - } - - name =3D strdup(pos->name); - if (!name) { - ret =3D -ENOMEM; - goto err; - } - name[i] =3D 'p'; - - new =3D zalloc(sizeof(*new)); - if (!new) { - ret =3D -1; - zfree(&name); - goto err; - } - new->name =3D name; - new->tpebs_name =3D pos->name; - list_add_tail(&new->nd, &tpebs_results); - tpebs_event_size +=3D 1; - } + ret =3D evsel__tpebs_prepare(evsel); + if (ret) + return ret; =20 if (tpebs_event_size > 0) { + struct evlist *evsel_list =3D evsel->evlist; + char cpumap_buf[50]; struct pollfd pollfd =3D { .events =3D POLLIN, }; int control_fd[2], ack_fd[2], len; char ack_buf[8]; @@ -268,6 +305,9 @@ int evsel__tpebs_open(struct evsel *evsel) goto out; } =20 + cpu_map__snprint(evsel_list->core.user_requested_cpus, cpumap_buf, + sizeof(cpumap_buf)); + ret =3D start_perf_record(control_fd, ack_fd, cpumap_buf); if (ret) goto out; @@ -321,7 +361,6 @@ int evsel__tpebs_open(struct evsel *evsel) close(ack_fd[0]); close(ack_fd[1]); } -err: if (ret) tpebs_delete(); return ret; --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B1BB91E0DFE for ; Wed, 9 Apr 2025 06:11:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179064; cv=none; b=ppEK8JgR1uS+cDnXNOn8v3Q+CddY7HJ+YmhoHBKq4g36847IN9Xp9U3Lb+UGtE7NEKkbLMPAC8koGKLlWqSGOvS9dmV5xrRAQrxS+I5oh/yUWF+ZYOQeNfl8zhfJ7IPqJfcOWvBsnGkshEzddBIMf5hkQP1rTDwiw+yiPtT/cUY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179064; c=relaxed/simple; bh=yUglDtEpwZVjaGPveMCOEFvdP87AB0tTSBss9c6TB98=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=p1d8W4RLZC8MZTNUKpNW92i96AwL8l73aD1yWseBxpO+qLkRse0Js3F5JVI4ZqbBEq0PEI5f1S9WameCgubPV5gQP5Q0Rt1VT/Gbc03xZaoYCY707ZlMttchm5CzJZFjCS9+ySnZs/gV1VVMYpeZBuQZWVyiLWOShEpRd2Qgt1k= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=w3//U1kr; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="w3//U1kr" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-2241e7e3addso52836425ad.1 for ; Tue, 08 Apr 2025 23:11:02 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179062; x=1744783862; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=XafRrptC07unstJw1HreG0n5lBFJ2gSj/BsZTF4fwvk=; b=w3//U1krDENNW54Mgc8dkdn/RH1PBFufqJbfe9aftDkaLfuNVJcihdI0Ln/ENHqOiE lJ8gZIlXVGSAJ44o2RrWl0zqzjCwBFkPzjamAN7wXshSZ6VzXhOOq9xFgDmQhE6eHzgM Cs8QGPQn+xtRftvmCQRDHjDSfOxxjJJbJL0eXHfdD6IqA9RrHEIdVWuVpEHd0BRS22SB +77kzi3HyLLWBFNf+tcQim23rwUYC/KdSSkvyyp3LwvipMPhxOZRBmNMMnN53W19RgbN sxZh/EOCvMr32uMsLXxs/VujxGL3xI2HngfehIQdqG71Tm48hfFee15rrkkJevf+p8xC 1Rew== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179062; x=1744783862; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=XafRrptC07unstJw1HreG0n5lBFJ2gSj/BsZTF4fwvk=; b=EiUGFr1JGKtY99hNelMRiJ5UFLKX+FGqnaVj8Iw+TfQ4ESE5hyGdF07GhhSrhRNIYi ExuEDlwprELzK/cCQPiuTBn4EXJRcRaJI4THMbj/sa0S71MK130oQTJazf6Os9I0bJQQ A1pJ7CUSZArzVyZDgBThaoE4Jn0ECE5SZ2phJms+m4avrq+JJ0G6tuPw3pDs2Z5taVsX 1b0WEF8o/i7j0e9VExIFpHSjjBS4V1GeXJ9xPrSw9d8MB5yCxKY07P1uDTZxRL+9BVBX ntrqU/nm9JUGiw2erl1/yG3pk1IkgCXJqzKVSkN+tucHJhIrGxqk2w3vgRaxcvj2D4eb hYig== X-Forwarded-Encrypted: i=1; AJvYcCUZtDacXsRPlgtJpcgI0A603Ge6kbP2AcnWT3Bdbj+WJU3eiwJwM6Y4eMiRSaFUkwhiaSJYmmZ6d0oBSyU=@vger.kernel.org X-Gm-Message-State: AOJu0YwCHNkTdOViUrrvOPXTLzebXGv6rTt5geab9jmIGzgAfCahqVVw gimTotZbW464D44RJ+bjpvXetPjrCz91W8TXHBQ4kliD0Jq8hcZYVLJmhdJEzKrUfH7zel1U6Hh X8tTX4w== X-Google-Smtp-Source: AGHT+IEBeLFisPAqUiTchaGbpoO4ST/mLlKRoEISv+smJtgjEjtjnZMTLV06vQsaAYIzaoP6don6AGG5jumO X-Received: from pltl6.prod.google.com ([2002:a17:902:70c6:b0:223:4c5f:3494]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:98b:b0:224:910:23f6 with SMTP id d9443c01a7336-22ac2a2e856mr28630585ad.45.1744179062007; Tue, 08 Apr 2025 23:11:02 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:32 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-6-irogers@google.com> Subject: [PATCH v4 05/16] perf intel-tpebs: Move cpumap_buf out of evsel__tpebs_open From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The buffer holds the cpumap to pass to the perf record command, so move it down to the perf record function. Make this function an evsel function given the need for the evsel for the cpumap. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/intel-tpebs.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index 2186818b2c9b..2b04deaf66ff 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -83,12 +83,15 @@ static int get_perf_record_args(const char **record_arg= v, char buf[], return 0; } =20 -static int start_perf_record(int control_fd[], int ack_fd[], - const char *cpumap_buf) +static int evsel__tpebs_start_perf_record(struct evsel *evsel, int control= _fd[], int ack_fd[]) { const char **record_argv; int ret; char buf[32]; + char cpumap_buf[50]; + + cpu_map__snprint(evsel->evlist->core.user_requested_cpus, cpumap_buf, + sizeof(cpumap_buf)); =20 scnprintf(buf, sizeof(buf), "--control=3Dfd:%d,%d", control_fd[0], ack_fd= [1]); =20 @@ -287,8 +290,6 @@ int evsel__tpebs_open(struct evsel *evsel) return ret; =20 if (tpebs_event_size > 0) { - struct evlist *evsel_list =3D evsel->evlist; - char cpumap_buf[50]; struct pollfd pollfd =3D { .events =3D POLLIN, }; int control_fd[2], ack_fd[2], len; char ack_buf[8]; @@ -305,10 +306,7 @@ int evsel__tpebs_open(struct evsel *evsel) goto out; } =20 - cpu_map__snprint(evsel_list->core.user_requested_cpus, cpumap_buf, - sizeof(cpumap_buf)); - - ret =3D start_perf_record(control_fd, ack_fd, cpumap_buf); + ret =3D evsel__tpebs_start_perf_record(evsel, control_fd, ack_fd); if (ret) goto out; =20 --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 36E5A1E1A17 for ; Wed, 9 Apr 2025 06:11:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179065; cv=none; b=NFOlpDLum1VoIJFlJ3ip5vWZh/ECKKaytkAunXtjwXbjHk0JV4DNNeA6wBs0tlOwIC1OY7myquIjN5ws5cBRuck8EjfLcn41E3dp71qIBNJ4FKd5lBBaK2ggwkZCNGVJsJ/mp5BYFYH5oyt7sQmzbk6LrAIyqCbqfh5IEbPw/is= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179065; c=relaxed/simple; bh=uzrqNAXM/KeEjp8qWr6xTf3VLWW7e0MNaK/cvBjUNjU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=GBu1dX+ww1o7jHjVf4FF2BPbEAwZ+r0Y8L/CogHaRc4tRWbjLcAA/gUUZarw17Tj8sFvseNDFAnLhQTqccgOsowmb4y1S3BqJ/Z+H4g+dkmv7AeBA+0eQsDGy8I3s6nINlzqLDtj0gHFdiRuaIdXkH5pzXCuNMB/v3QIz3oa/Q8= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=myj2VGBz; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="myj2VGBz" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2242ce15cc3so57888705ad.1 for ; Tue, 08 Apr 2025 23:11:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179063; x=1744783863; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=fqf5UWKI2N4Og32+0x3lkK0y6IoadYAF1NX3nVy0tDA=; b=myj2VGBzUEMh9WWBl8PbndsnolpHgWAFjY+H89MlE4NCQDk/nYGLm50jWfoc5TZm7a OJwWE2D/YQcMXiXHN5/8Btg8cnxPWXv9YdsavlPvWNxi17+7LZYJdSS6DLKH6AaVd92G FjnKd00JRbhPPE7oqcoGEyueKA/y8broW+VwFY5xLgnHH/NHRerovynrmf1Ry6WYNK6x JNnJ1UhporZKoIpHSkvjyjVyQRLoVBpUtY7VW9F5NEXsgb7bMU2CYu1LIDJ9GHTtpBAW L9agZBtxjPGR3Spv3ldU+YPSk78k9C8L9FSXMCiLSpBTnKaU7r879cbjgKuakGvhsuna YsUA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179063; x=1744783863; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=fqf5UWKI2N4Og32+0x3lkK0y6IoadYAF1NX3nVy0tDA=; b=HfRFq60OaTIbjMimvMAonvq6VJV8KtHvgiXmH4VmQImeLvaSIuvMfAseL5JBpL5xV6 BeuJGPtLonQ54rckEz2qFRFQiffcqcJUuyFpKIa9inovEsj/RKIDE8z4Y0tf4bNn0LiS PrJupBxliCTJd4J1T68OOfG3zxukP392eOIVvJfct8oJeH017mqBLA+EzQJjkuaci404 AaGeT4ippKc8VWc/bj7K9vcc1OBjIBqkRq1KHHyHmBVeUlj/SnFPsywdhMs+hT9XzP0G 9mqLw40FgAS3wL0fjw0sZFxw+49Dplcfc7hZA7sSti0ci6JlM9PpaDl4hANB9QGiiMPH rCQw== X-Forwarded-Encrypted: i=1; AJvYcCVjQD2lce01nrrTKs0hd/+5IkjxP/JM2Dhr9GmWDVokUtv/FbNrYz9QyPHjGOBhvosVC0hFopvWxvcQclk=@vger.kernel.org X-Gm-Message-State: AOJu0YzDhnq92+2sxrpiaovyvhoeUrccNCkEQYw2mLn2Q9mmtFX/YRpI X0mll3aAfN5e5UFSioyQgQypMWkgfzZBnAWlCKXJDHr/L7cGvAZFjZCb+TlsG0BcEnyXGKsTinL zYBPhAg== X-Google-Smtp-Source: AGHT+IGTJmhyKoOQj5ofXOm1qSdH7c8rI40Gef8T69sqKGe8/stfnPpqWWQ8Denfs/4DODYgAhfMLIhSLSVj X-Received: from pltf12.prod.google.com ([2002:a17:902:74cc:b0:224:2ae9:b271]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:d2d0:b0:223:5525:6239 with SMTP id d9443c01a7336-22ac2a1a660mr27592605ad.38.1744179063507; Tue, 08 Apr 2025 23:11:03 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:33 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-7-irogers@google.com> Subject: [PATCH v4 06/16] perf intel-tpebs: Reduce scope of tpebs_events_size From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Moved to record argument computation rather than being global. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/intel-tpebs.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index 2b04deaf66ff..e3bed86145b9 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -29,7 +29,6 @@ #define PERF_DATA "-" =20 bool tpebs_recording; -static size_t tpebs_event_size; static LIST_HEAD(tpebs_results); static pthread_t tpebs_reader_thread; static struct child_process tpebs_cmd; @@ -86,15 +85,20 @@ static int get_perf_record_args(const char **record_arg= v, char buf[], static int evsel__tpebs_start_perf_record(struct evsel *evsel, int control= _fd[], int ack_fd[]) { const char **record_argv; + size_t tpebs_event_size =3D 0; int ret; char buf[32]; char cpumap_buf[50]; + struct tpebs_retire_lat *t; =20 cpu_map__snprint(evsel->evlist->core.user_requested_cpus, cpumap_buf, sizeof(cpumap_buf)); =20 scnprintf(buf, sizeof(buf), "--control=3Dfd:%d,%d", control_fd[0], ack_fd= [1]); =20 + list_for_each_entry(t, &tpebs_results, nd) + tpebs_event_size++; + record_argv =3D calloc(12 + 2 * tpebs_event_size, sizeof(char *)); if (!record_argv) return -ENOMEM; @@ -226,7 +230,6 @@ static struct tpebs_retire_lat *tpebs_retire_lat__new(s= truct evsel *evsel) return NULL; } list_add_tail(&result->nd, &tpebs_results); - tpebs_event_size++; return result; } =20 @@ -289,7 +292,7 @@ int evsel__tpebs_open(struct evsel *evsel) if (ret) return ret; =20 - if (tpebs_event_size > 0) { + if (!list_empty(&tpebs_results)) { struct pollfd pollfd =3D { .events =3D POLLIN, }; int control_fd[2], ack_fd[2], len; char ack_buf[8]; --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pf1-f201.google.com (mail-pf1-f201.google.com [209.85.210.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 72BEB1E2614 for ; Wed, 9 Apr 2025 06:11:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.210.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179068; cv=none; b=YyNYWTmkmPWbcMXxRJ9TGEYTOk5UM68crP9VA/NctBhMEEIkPtFsZamnCurScGLhJI4craqzCjmL8+ZDs8S613L3xdcmyja3Z9dQnZQ863Y6oBJZbX8s0qyp48HcUJkpj8o1VrS85t1kSlcoSpMu9JrmEyNgqc3cyVzhhH29gB0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179068; c=relaxed/simple; bh=dmk99xLT8Nx0mz4ddF1+mWBkWibkJI69saN0P2VeVFI=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=OY9deZmAQO7XusJ93kCABlkqm1MX1Yc0rXaAnj7J4JsGXGK4SUPI9JC3YEABQvp1Y25VGoLu2+s43/62N4indcl+iOAqv2WrPPAMg0ukm0agoEKU8XWgH3ZJ9HPIAXaGjrFoOLSi/J16MTP95RN1TldSonyV7V2Y3fUBJvrWgho= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=HS2Y1X/E; arc=none smtp.client-ip=209.85.210.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="HS2Y1X/E" Received: by mail-pf1-f201.google.com with SMTP id d2e1a72fcca58-736cd36189bso8421302b3a.2 for ; Tue, 08 Apr 2025 23:11:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179066; x=1744783866; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=hurkMSaqLGDLbW/1AFRFsncWr/nyXd3OBuzAUIRrz+4=; b=HS2Y1X/EG1Sp5u4SEeGgcVMwvO3Ut/k9JuB1Og3hL55ND258S8N5H4m960RDmo4WGT oISP7EhofptxGj6QqeKfrynRfo1eGfTRuOcM1xKVc0emKZYeLJpbED3xkkLL54zTwa/y p/6yhfKvCL9NCq3i+ZDwaVSKPjIGhGJpB/a5SHxif781OkYLrW6ZDy5zxLnDDHoEq3b4 m1OyXMGmfI2nRsCM0NVQ137tgknTS1d0efNeZ/9Ww1UEYQNMGLKjvT7smRupQK6sQGGB 9FsS3aCD5hVN6xO/MiSGdMnabbvs+1HvuP+s0M/SYoYKbOdXaRTFSMlfa9ei5IwUpk4p B3fA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179066; x=1744783866; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=hurkMSaqLGDLbW/1AFRFsncWr/nyXd3OBuzAUIRrz+4=; b=tGTphDJFvDtEcpDYXdmgROrnrMy2GvehmwzxOLz3SxpFeew6kfp8DV/8qCVDukGfLW 7uvhB+fPS1sPvv88/gPsK3RMwJ/pXqbAlHiigzclh9EE4SLuzEYw9WRTnZlH963XaZeI ARRPw3Ita89i/l2aIdtPvhs3DVAcri4nk8LJpq4I8CFsD5b8X/n1Y9ck0wUGjBsJNoZR ZTJItOcKg/LpB4pxI82wRke19SXeT1oOc8y9RgbKBS+xxX95CSEo35h/p0QgQmdNAvti WzdO38ZMyksITPLk4rceBOkNuCPYmMqYaqMixzP3yy7gSyQtwEdJgLMrBxAyOqiXJe2Z Basw== X-Forwarded-Encrypted: i=1; AJvYcCWpI4H4/o4ALmujq/bMGyE+v+BI/4mldcRBHsmpPzuMiRPPAt+Wci65xEYmPVSlbjsQQuwvo+80aNsNP3U=@vger.kernel.org X-Gm-Message-State: AOJu0Ywel6YrKZrRNFLCTxwRVyxKrFoedMCAOL+w/tkyVLi5XjUGNWP/ 6J4PpNsBmiCSgcFXNfpZNHqS7rbLH2CC/pNm1OESsuCvc5ilKdBvqq3r1vsTcmcMD+vIhZQ70qi Givvx9g== X-Google-Smtp-Source: AGHT+IHIlVWKyvLN9AtN+rEwT88vbBZNLzA5K1Liojv7je6hNLCGDN0pW+2T2x4f89F1wPSVYdpKiuST2b/v X-Received: from pfbgp2.prod.google.com ([2002:a05:6a00:3b82:b0:736:4ad6:1803]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6a00:1310:b0:736:34ff:be8 with SMTP id d2e1a72fcca58-73bafd3181bmr1423652b3a.19.1744179065639; Tue, 08 Apr 2025 23:11:05 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:34 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-8-irogers@google.com> Subject: [PATCH v4 07/16] perf intel-tpebs: Inline get_perf_record_args From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Code is short enough to be inlined and there are no error cases when made inline. Make the implicit NULL pointer at the end of the argv explicit. Move the fixed number of arguments before the variable number of arguments. Correctly size the argv allocation and zero when feeing to avoid a dangling pointer. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/intel-tpebs.c | 75 +++++++++++++---------------------- 1 file changed, 28 insertions(+), 47 deletions(-) diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index e3bed86145b9..c4c818f32239 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -47,72 +47,53 @@ struct tpebs_retire_lat { double val; }; =20 -static int get_perf_record_args(const char **record_argv, char buf[], - const char *cpumap_buf) +static int evsel__tpebs_start_perf_record(struct evsel *evsel, int control= _fd[], int ack_fd[]) { - struct tpebs_retire_lat *e; - int i =3D 0; + const char **record_argv; + int tpebs_event_size =3D 0, i =3D 0, ret; + char control_fd_buf[32]; + char cpumap_buf[50]; + struct tpebs_retire_lat *t; + + list_for_each_entry(t, &tpebs_results, nd) + tpebs_event_size++; =20 - pr_debug("tpebs: Prepare perf record for retire_latency\n"); + record_argv =3D malloc((10 + 2 * tpebs_event_size) * sizeof(*record_argv)= ); + if (!record_argv) + return -ENOMEM; =20 record_argv[i++] =3D "perf"; record_argv[i++] =3D "record"; record_argv[i++] =3D "-W"; record_argv[i++] =3D "--synth=3Dno"; - record_argv[i++] =3D buf; =20 - if (!cpumap_buf) { - pr_err("tpebs: Require cpumap list to run sampling\n"); - return -ECANCELED; - } - /* Use -C when cpumap_buf is not "-1" */ - if (strcmp(cpumap_buf, "-1")) { + scnprintf(control_fd_buf, sizeof(control_fd_buf), "--control=3Dfd:%d,%d", + control_fd[0], ack_fd[1]); + record_argv[i++] =3D control_fd_buf; + + record_argv[i++] =3D "-o"; + record_argv[i++] =3D PERF_DATA; + + if (!perf_cpu_map__is_any_cpu_or_is_empty(evsel->evlist->core.user_reques= ted_cpus)) { + cpu_map__snprint(evsel->evlist->core.user_requested_cpus, cpumap_buf, + sizeof(cpumap_buf)); record_argv[i++] =3D "-C"; record_argv[i++] =3D cpumap_buf; } =20 - list_for_each_entry(e, &tpebs_results, nd) { + list_for_each_entry(t, &tpebs_results, nd) { record_argv[i++] =3D "-e"; - record_argv[i++] =3D e->name; + record_argv[i++] =3D t->name; } - - record_argv[i++] =3D "-o"; - record_argv[i++] =3D PERF_DATA; - - return 0; -} - -static int evsel__tpebs_start_perf_record(struct evsel *evsel, int control= _fd[], int ack_fd[]) -{ - const char **record_argv; - size_t tpebs_event_size =3D 0; - int ret; - char buf[32]; - char cpumap_buf[50]; - struct tpebs_retire_lat *t; - - cpu_map__snprint(evsel->evlist->core.user_requested_cpus, cpumap_buf, - sizeof(cpumap_buf)); - - scnprintf(buf, sizeof(buf), "--control=3Dfd:%d,%d", control_fd[0], ack_fd= [1]); - - list_for_each_entry(t, &tpebs_results, nd) - tpebs_event_size++; - - record_argv =3D calloc(12 + 2 * tpebs_event_size, sizeof(char *)); - if (!record_argv) - return -ENOMEM; - - ret =3D get_perf_record_args(record_argv, buf, cpumap_buf); - if (ret) - goto out; + record_argv[i++] =3D NULL; + assert(i =3D=3D 10 + 2 * tpebs_event_size || i =3D=3D 8 + 2 * tpebs_event= _size); + /* Note, no workload given so system wide is implied. */ =20 assert(tpebs_cmd.pid =3D=3D 0); tpebs_cmd.argv =3D record_argv; tpebs_cmd.out =3D -1; ret =3D start_command(&tpebs_cmd); -out: - free(record_argv); + zfree(&tpebs_cmd.argv); return ret; } =20 --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B45A01E3793 for ; Wed, 9 Apr 2025 06:11:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179069; cv=none; b=qrO3fC8iXW7j8FcLnIW8j0GyExhbUHMH2EoblP2EpzVf7Zl44v9Fgb9k1U8R3Y2O6LfmgfY/ODpGk8lkVtg66NUTmQ8DaHOPuwiEJa/H2S/vGm1/JbW+NhXlK1ei31i85D93YXI1Bb7fKvrL3Rkn4lpOJyhetxAUZMB6AzZYJII= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179069; c=relaxed/simple; bh=6EEZTd9lf9aeTITKws4CXHLVcUfJH0Aqr7eXP+eg5Q0=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=j1depXMHvfYBjUqw/LUxe8uXjN7sOR0JOUeoXb0psxmZS+0fhgiqrfw/rc8xFeUzv77q+j7FBEaQjhaz+3XDBK19XgFsZbHqaBRmu6CO6OcNgkKYRE6m96H69Jqk8PbK1YAwgJqMJNwQsTM/8UDyCU8dVCCuvleRrHa7Zx6WtDc= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=Ha0LfPb3; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="Ha0LfPb3" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-2241ae15dcbso75127285ad.0 for ; Tue, 08 Apr 2025 23:11:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179067; x=1744783867; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=O4eUmflRE5uebU4/SNO43FiJCwVtS3ISrTa0e4ce5bk=; b=Ha0LfPb3kjIPBE2h+l0SwGjTbYwD/osRantbRTFcaKXcN2IXJXH+UuHTGPwqmE1sAN OPT9+44uNWZKPDTMGR+iq2qZUxSnUeiy739Cbp+6vYC/rdGkcG1tqEsrNpio9KdOmpM9 iGmImQkzx2V+YscdSVADh8txgQOExCd4TJ/5frqGhRozCyJ/9M2ujMKNTY+7zOw2X9jx i9JBWrq1/+R4qnhy9JsKIAzzuv1xQyw0/++t0X8Gl5hnsRYHK3/uteT2dZC9ogy6tPSn RCAx8SmUTLOk8t399u4Iystq6x7nMiRGUfjXxFnXnN3TTE/tlu0HtsaND+zds5+DQwke /+4A== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179067; x=1744783867; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=O4eUmflRE5uebU4/SNO43FiJCwVtS3ISrTa0e4ce5bk=; b=mzLwEtlJc/9Hw81XV7LKzFh+smUoQ4lkTqFygSg+ENQXviTNImP1WIaGn7SlemkgU9 EouHm+tKBBqxfrQUjx46/gciY3t0Wv/Svi9AIJS8lcy3gCbg57XEZelNy/Pp1n/e1uxF zqEKOw6/lCpRSztuX0dnH6Z1UGiA0WDVqAOak79hvY1vCIOJB+I9x6u/hcrhiQzJhwTT V0WeedfoQW7GmGqQl5IYGm/0yPkjfA563Aczi6bMnNynMMit2zdO8tIq0naYutX3vesL Q3o794EUcCpQiJJrTnep8DFXLoFjfTgZZz8pUtr6gqdDuuzpUCbASIiziQs1uQAn48sr hBrA== X-Forwarded-Encrypted: i=1; AJvYcCX70lgT1zmaHDLGwD+cSGzPsHBEIBxqGkJ/PCweW1g4no+/awy/mkbnWLGjCsRuvEePOe+OXKb1xXp6IMQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxaLXTzDnFuWSTg2yBQ6998WJSU7Vkh0gLY+icgtPHy4pyLZQwX ThoMGuclSyBc4CVt8701vvtRXvfwyo6PEwkP5WwgTZJE2zP6CEJufyBB445uoqhIChriKxNPl7B htkSnpQ== X-Google-Smtp-Source: AGHT+IGV2SIOtm4Sd/ugRfmKy7/RZhK8aFGnp7ffz5MI2gMIKEoBwi3D2d0ZLkxtbbOLymHM0N6z9CAq29kU X-Received: from plth11.prod.google.com ([2002:a17:902:704b:b0:220:e84e:350c]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:902:ce0e:b0:21f:c67:a68a with SMTP id d9443c01a7336-22ac3f9d5a3mr25229815ad.31.1744179067271; Tue, 08 Apr 2025 23:11:07 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:35 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-9-irogers@google.com> Subject: [PATCH v4 08/16] perf intel-tpebs: Ensure events are opened, factor out finding From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Factor out finding an tpebs_retire_lat from an evsel. Don't blindly return when ignoring an open request, which happens after the first open request, ensure the event was started on a fork of perf record. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/intel-tpebs.c | 61 +++++++++++++++++++++-------------- 1 file changed, 37 insertions(+), 24 deletions(-) diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index c4c818f32239..e42f3ec39a64 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -45,6 +45,8 @@ struct tpebs_retire_lat { int sum; /* Average of retire_latency, val =3D sum / count */ double val; + /* Has the event been sent to perf record? */ + bool started; }; =20 static int evsel__tpebs_start_perf_record(struct evsel *evsel, int control= _fd[], int ack_fd[]) @@ -94,6 +96,9 @@ static int evsel__tpebs_start_perf_record(struct evsel *e= vsel, int control_fd[], tpebs_cmd.out =3D -1; ret =3D start_command(&tpebs_cmd); zfree(&tpebs_cmd.argv); + list_for_each_entry(t, &tpebs_results, nd) + t->started =3D true; + return ret; } =20 @@ -214,6 +219,19 @@ static struct tpebs_retire_lat *tpebs_retire_lat__new(= struct evsel *evsel) return result; } =20 +static struct tpebs_retire_lat *tpebs_retire_lat__find(struct evsel *evsel) +{ + struct tpebs_retire_lat *t; + + list_for_each_entry(t, &tpebs_results, nd) { + if (t->tpebs_name =3D=3D evsel->name || + !strcmp(t->tpebs_name, evsel->name) || + (evsel->metric_id && !strcmp(t->tpebs_name, evsel->metric_id))) + return t; + } + return NULL; +} + /** * evsel__tpebs_prepare - create tpebs data structures ready for opening. * @evsel: retire_latency evsel, all evsels on its list will be prepared. @@ -221,16 +239,11 @@ static struct tpebs_retire_lat *tpebs_retire_lat__new= (struct evsel *evsel) static int evsel__tpebs_prepare(struct evsel *evsel) { struct evsel *pos; - struct tpebs_retire_lat *tpebs_event; - - list_for_each_entry(tpebs_event, &tpebs_results, nd) { - if (!strcmp(tpebs_event->tpebs_name, evsel->name)) { - /* - * evsel, or an identically named one, was already - * prepared. - */ - return 0; - } + struct tpebs_retire_lat *tpebs_event =3D tpebs_retire_lat__find(evsel); + + if (tpebs_event) { + /* evsel, or an identically named one, was already prepared. */ + return 0; } tpebs_event =3D tpebs_retire_lat__new(evsel); if (!tpebs_event) @@ -262,12 +275,19 @@ int evsel__tpebs_open(struct evsel *evsel) { int ret; =20 - /* - * We should only run tpebs_start when tpebs_recording is enabled. - * And we should only run it once with all the required events. - */ - if (tpebs_cmd.pid !=3D 0 || !tpebs_recording) + /* We should only run tpebs_start when tpebs_recording is enabled. */ + if (!tpebs_recording) return 0; + /* Only start the events once. */ + if (tpebs_cmd.pid !=3D 0) { + struct tpebs_retire_lat *t =3D tpebs_retire_lat__find(evsel); + + if (!t || !t->started) { + /* Fail, as the event wasn't started. */ + return -EBUSY; + } + return 0; + } =20 ret =3D evsel__tpebs_prepare(evsel); if (ret) @@ -352,7 +372,6 @@ int evsel__tpebs_open(struct evsel *evsel) int tpebs_set_evsel(struct evsel *evsel, int cpu_map_idx, int thread) { __u64 val; - bool found =3D false; struct tpebs_retire_lat *t; struct perf_counts_values *count; =20 @@ -367,19 +386,13 @@ int tpebs_set_evsel(struct evsel *evsel, int cpu_map_= idx, int thread) tpebs_stop(); count =3D perf_counts(evsel->counts, cpu_map_idx, thread); =20 - list_for_each_entry(t, &tpebs_results, nd) { - if (t->tpebs_name =3D=3D evsel->name || - (evsel->metric_id && !strcmp(t->tpebs_name, evsel->metric_id))) { - found =3D true; - break; - } - } + t =3D tpebs_retire_lat__find(evsel); =20 /* Set ena and run to non-zero */ count->ena =3D count->run =3D 1; count->lost =3D 0; =20 - if (!found) { + if (!t) { /* * Set default value or 0 when retire_latency for this event is * not found from sampling data (record_tpebs not set or 0 --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id C49B01DE4DB for ; Wed, 9 Apr 2025 06:11:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179071; cv=none; b=e/Xq4CB51OsSx+2x0gEmwCQxeBArhh9O7WH1qHeNiB4GFw+y4JMUqq3vXB5ivHsl4/7u3xPHVxvSAYOmmoyYkwJnCf0NNALpfj/cEKAt+33TVHVUKfolhxNp3lElZ6vqnP28TUBvSbfGHNxGIUbthhBWJqKmbK8mE/e94vohIVs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179071; c=relaxed/simple; bh=x712Sf+REbTmULA7rLtp2gm66BCVWDC8OsSNLy0MlXs=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=bjuEYjApksV6Rew2HkTw51c1CZMicpIv08EO0qOPjPxsjVr2umizfUPZ0txE4+Y/2zhO+0pKgN0fAtv+nEd6uIMxuctvNyY8adn6lMacOYLzRyinyUcBX0BN2oqaYSU9ETnlgalNYdcv+RaNu0vGJQkp3ddeSG6rn91/J+1JLjM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=KtsSN2OX; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="KtsSN2OX" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-225429696a9so90816895ad.1 for ; Tue, 08 Apr 2025 23:11:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179069; x=1744783869; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=P1svmlgZ1hdj/s5BLTsbiEJmcy0BtMBOLnzcKMtls/k=; b=KtsSN2OX7GExEAeAYR5RBdI09WSXUdyd9jMrfBXEO5NzyhKi6CI1rhqO2oc7lzO9Ix G10VA9tCD5yQnE6Q6QaZl1nJzo13MQ36oUpOcxLd8RyFCDuKy/XZKgKleJ+WqylNme5b 3mmr8iU9Yk3qcQIb1Rv2UxkiV7TahUzF9X1CRmR3AEWIBgJklgo/BWxlELLXIvCSEdJs 3LCfhjPA6QPxzPdxNt7PfW5rsG1sleEQ45BHGlHt1ZMrHyrTyJUEyNoe6dIeJ7KsB0p8 qTdD6VzlnSH2CugkjDksMxieSNTBkTqSOu31T8i9jwerIxBz3OhOS8fbmSLR9E+L34Kf NvKQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179069; x=1744783869; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=P1svmlgZ1hdj/s5BLTsbiEJmcy0BtMBOLnzcKMtls/k=; b=CYSdjwy/rj1JdvFrpIZrAb/mIwtvx/8U/QSjaEeiBdgbwfq9JfsknvPLGheM1A9LaC dEbmpSJz/uco1NdC+Qy4wWtF2jDGeTfOpic1FJeEfesSwsrHwB/7IrHD/A1PbOECbPYn 3IAvwiqJrhTjmfW2P/kEgL/NaqOQ6bVzXenbZligkdPFN7URnR5DspO9KsY1wfMMjaeU yrf8RifprYjwBQIGWzBD2TUgE5Bqaf173go5Jlqxkb6QMukIydjck3IXLPOlv1t5bAsv pyRj3LA0nL6imQlBP2Ig1AREq3/yh6GsQrPJmX2zIC6/0jaDUZueFCmT3uL6ccKSfDGD tEzg== X-Forwarded-Encrypted: i=1; AJvYcCXvCkKZSIGVwdfLz4Z0IKMGeT9+vcx+1YqPeReBNM1/qw1gC3oC3XrNMDqZUOiBAAWB44vjTU+kVwb7t/Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwXIj6cqn0bozsTC4rKxYvSNWvbXGsXPbvA+mRxnkgAoP4bezYb xVEU2gTgCrzVOul8dpB9UV+xZ5wazrrDncR5+hTcTnyHVuDH/yR2QXHnIM40rtmfrZWsqqIPwqa MR2AdEQ== X-Google-Smtp-Source: AGHT+IFF5rSsLbQXg74UiA+QXkKwvMWAdG0+WZXaU5j0Dn35HdDSRmPwA+yJWVbuHYTSNqVsLoSGr+B7RzDC X-Received: from pltg4.prod.google.com ([2002:a17:902:6b44:b0:223:37b7:2388]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:2f04:b0:223:5379:5e4e with SMTP id d9443c01a7336-22ac3f2dd7amr24757125ad.10.1744179069189; Tue, 08 Apr 2025 23:11:09 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:36 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-10-irogers@google.com> Subject: [PATCH v4 09/16] perf intel-tpebs: Refactor tpebs_results list From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" evsel names and metric-ids are used for matching but this can be problematic, for example, multiple occurrences of the same retirement latency event become a single event for the record. Change the name of the record events so they are unique and reflect the evsel of the retirement latency event that opens them (the retirement latency event's evsel address is embedded within them). This allows an evsel based close to close the event when the retirement latency event is closed. This is important as perf stat has an evlist and the session listen to the record events has an evlist, knowing which event should remove the tpebs_retire_lat can't be tied to an evlist list as there is more than 1, so closing which evlist should cause the tpebs to stop? Using the evsel and the last one out doing the tpebs_stop is cleaner. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/builtin-stat.c | 2 - tools/perf/util/evlist.c | 1 - tools/perf/util/evsel.c | 2 +- tools/perf/util/intel-tpebs.c | 150 +++++++++++++++++++++------------- tools/perf/util/intel-tpebs.h | 2 +- 5 files changed, 93 insertions(+), 64 deletions(-) diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 68ea7589c143..80e491bd775b 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -681,8 +681,6 @@ static enum counter_recovery stat_handle_error(struct e= vsel *counter) if (child_pid !=3D -1) kill(child_pid, SIGTERM); =20 - tpebs_delete(); - return COUNTER_FATAL; } =20 diff --git a/tools/perf/util/evlist.c b/tools/perf/util/evlist.c index c1a04141aed0..0a21da4f990f 100644 --- a/tools/perf/util/evlist.c +++ b/tools/perf/util/evlist.c @@ -183,7 +183,6 @@ void evlist__delete(struct evlist *evlist) if (evlist =3D=3D NULL) return; =20 - tpebs_delete(); evlist__free_stats(evlist); evlist__munmap(evlist); evlist__close(evlist); diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 121283f2f382..554252ed1aab 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -2759,7 +2759,7 @@ int evsel__open(struct evsel *evsel, struct perf_cpu_= map *cpus, void evsel__close(struct evsel *evsel) { if (evsel__is_retire_lat(evsel)) - tpebs_delete(); + evsel__tpebs_close(evsel); perf_evsel__close(&evsel->core); perf_evsel__free_id(&evsel->core); } diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index e42f3ec39a64..a723687e67f6 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -35,10 +35,10 @@ static struct child_process tpebs_cmd; =20 struct tpebs_retire_lat { struct list_head nd; - /* Event name */ - char *name; - /* Event name with the TPEBS modifier R */ - const char *tpebs_name; + /** @evsel: The evsel that opened the retire_lat event. */ + struct evsel *evsel; + /** @event: Event passed to perf record. */ + char *event; /* Count of retire_latency values found in sample data */ size_t count; /* Sum of all the retire_latency values in sample data */ @@ -49,6 +49,8 @@ struct tpebs_retire_lat { bool started; }; =20 +static struct tpebs_retire_lat *tpebs_retire_lat__find(struct evsel *evsel= ); + static int evsel__tpebs_start_perf_record(struct evsel *evsel, int control= _fd[], int ack_fd[]) { const char **record_argv; @@ -85,7 +87,7 @@ static int evsel__tpebs_start_perf_record(struct evsel *e= vsel, int control_fd[], =20 list_for_each_entry(t, &tpebs_results, nd) { record_argv[i++] =3D "-e"; - record_argv[i++] =3D t->name; + record_argv[i++] =3D t->event; } record_argv[i++] =3D NULL; assert(i =3D=3D 10 + 2 * tpebs_event_size || i =3D=3D 8 + 2 * tpebs_event= _size); @@ -108,27 +110,20 @@ static int process_sample_event(const struct perf_too= l *tool __maybe_unused, struct evsel *evsel, struct machine *machine __maybe_unused) { - int ret =3D 0; - const char *evname; struct tpebs_retire_lat *t; =20 - evname =3D evsel__name(evsel); - + t =3D tpebs_retire_lat__find(evsel); + if (!t) + return -EINVAL; /* * Need to handle per core results? We are assuming average retire * latency value will be used. Save the number of samples and the sum of * retire latency value for each event. */ - list_for_each_entry(t, &tpebs_results, nd) { - if (!strcmp(evname, t->name)) { - t->count +=3D 1; - t->sum +=3D sample->retire_lat; - t->val =3D (double) t->sum / t->count; - break; - } - } - - return ret; + t->count +=3D 1; + t->sum +=3D sample->retire_lat; + t->val =3D (double) t->sum / t->count; + return 0; } =20 static int process_feature_event(struct perf_session *session, @@ -183,50 +178,98 @@ static int tpebs_stop(void) return ret; } =20 -static char *evsel__tpebs_name(struct evsel *evsel) +/** + * evsel__tpebs_event() - Create string event encoding to pass to `perf re= cord`. + */ +static int evsel__tpebs_event(struct evsel *evsel, char **event) { char *name, *modifier; + int ret; =20 name =3D strdup(evsel->name); if (!name) - return NULL; + return -ENOMEM; =20 modifier =3D strrchr(name, 'R'); if (!modifier) { - pr_err("Tpebs event missing modifier '%s'\n", name); - free(name); - return NULL; + ret =3D -EINVAL; + goto out; } - *modifier =3D 'p'; - return name; + modifier =3D strchr(name, ':'); + if (!modifier) + modifier =3D strrchr(name, '/'); + if (!modifier) { + ret =3D -EINVAL; + goto out; + } + *modifier =3D '\0'; + if (asprintf(event, "%s/name=3Dtpebs_event_%p/%s", name, evsel, modifier = + 1) > 0) + ret =3D 0; + else + ret =3D -ENOMEM; +out: + if (ret) + pr_err("Tpebs event modifier broken '%s'\n", evsel->name); + free(name); + return ret; } =20 static struct tpebs_retire_lat *tpebs_retire_lat__new(struct evsel *evsel) { struct tpebs_retire_lat *result =3D zalloc(sizeof(*result)); + int ret; =20 if (!result) return NULL; =20 - result->tpebs_name =3D evsel->name; - result->name =3D evsel__tpebs_name(evsel); - if (!result->name) { + ret =3D evsel__tpebs_event(evsel, &result->event); + if (ret) { free(result); return NULL; } + result->evsel =3D evsel; list_add_tail(&result->nd, &tpebs_results); return result; } =20 +static void tpebs_retire_lat__delete(struct tpebs_retire_lat *r) +{ + zfree(&r->event); + free(r); +} + static struct tpebs_retire_lat *tpebs_retire_lat__find(struct evsel *evsel) { struct tpebs_retire_lat *t; + uint64_t num; + const char *evsel_name; =20 + /* + * Evsels will match for evlist with the retirement latency event. The + * name with "tpebs_event_" prefix will be present on events being read + * from `perf record`. + */ + if (evsel__is_retire_lat(evsel)) { + list_for_each_entry(t, &tpebs_results, nd) { + if (t->evsel =3D=3D evsel) + return t; + } + return NULL; + } + evsel_name =3D strstr(evsel->name, "tpebs_event_"); + if (!evsel_name) { + /* Unexpected that the perf record should have other events. */ + return NULL; + } + errno =3D 0; + num =3D strtoull(evsel_name + 12, NULL, 16); + if (errno) { + pr_err("Bad evsel for tpebs find '%s'\n", evsel->name); + return NULL; + } list_for_each_entry(t, &tpebs_results, nd) { - if (t->tpebs_name =3D=3D evsel->name || - !strcmp(t->tpebs_name, evsel->name) || - (evsel->metric_id && !strcmp(t->tpebs_name, evsel->metric_id))) + if ((uint64_t)t->evsel =3D=3D num) return t; } return NULL; @@ -363,8 +406,12 @@ int evsel__tpebs_open(struct evsel *evsel) close(ack_fd[0]); close(ack_fd[1]); } - if (ret) - tpebs_delete(); + if (ret) { + struct tpebs_retire_lat *t =3D tpebs_retire_lat__find(evsel); + + list_del_init(&t->nd); + tpebs_retire_lat__delete(t); + } return ret; } =20 @@ -414,34 +461,19 @@ int tpebs_set_evsel(struct evsel *evsel, int cpu_map_= idx, int thread) return 0; } =20 -static void tpebs_retire_lat__delete(struct tpebs_retire_lat *r) -{ - zfree(&r->name); - free(r); -} - - -/* - * tpebs_delete - delete tpebs related data and stop the created thread and - * process by calling tpebs_stop(). - * - * This function is called from evlist_delete() and also from builtin-stat - * stat_handle_error(). If tpebs_start() is called from places other then = perf - * stat, need to ensure tpebs_delete() is also called to safely free mem a= nd - * close the data read thread and the forked perf record process. +/** + * evsel__tpebs_close() - delete tpebs related data. If the last event, st= op the + * created thread and process by calling tpebs_stop(). * - * This function is also called in evsel__close() to be symmetric with - * tpebs_start() being called in evsel__open(). We will update this call s= ite - * when move tpebs_start() to evlist level. + * This function is called in evsel__close() to be symmetric with + * evsel__tpebs_open() being called in evsel__open(). */ -void tpebs_delete(void) +void evsel__tpebs_close(struct evsel *evsel) { - struct tpebs_retire_lat *r, *rtmp; + struct tpebs_retire_lat *t =3D tpebs_retire_lat__find(evsel); =20 - tpebs_stop(); + tpebs_retire_lat__delete(t); =20 - list_for_each_entry_safe(r, rtmp, &tpebs_results, nd) { - list_del_init(&r->nd); - tpebs_retire_lat__delete(r); - } + if (list_empty(&tpebs_results)) + tpebs_stop(); } diff --git a/tools/perf/util/intel-tpebs.h b/tools/perf/util/intel-tpebs.h index cc98203719c8..5c671181ec60 100644 --- a/tools/perf/util/intel-tpebs.h +++ b/tools/perf/util/intel-tpebs.h @@ -11,7 +11,7 @@ struct evsel; extern bool tpebs_recording; =20 int evsel__tpebs_open(struct evsel *evsel); -void tpebs_delete(void); +void evsel__tpebs_close(struct evsel *evsel); int tpebs_set_evsel(struct evsel *evsel, int cpu_map_idx, int thread); =20 #endif /* __INTEL_TPEBS_H */ --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id CD5A01E5214 for ; Wed, 9 Apr 2025 06:11:11 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179074; cv=none; b=BokPklSXmjTafXZgNaxokYCsylF6QfiTCdQrEM0Q5zBtME0d9VSxh2RVzxpZkvBwqWXMl7ltHAmLxa1C1YiK/dsKY07EGzWpI89O9i3uX/5S3zIfXIHy8g5gcp4JjJMyqG2SkDMCeRMfTuepTYozHBUm5kaUHRtGzqsVQIcjLD4= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179074; c=relaxed/simple; bh=midHO3Z3byxoUBHfKzM92TodrGzwSNi/xUV5ijTnPeg=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=OKNmyEhuX8MJ61TXEOIjEprR2kDRSF5pndjFXJ2VcgZyqRUobgbFbY0LH0nsx1oj0SVIaC0q/wz2mA7HoB/tgR4eaTcIXG+M6G+D/l8llraxs5A3E451x27nloOBIJpWq9Hwa8rek1j8ly45riDv398ijRk+zZXZQTci1nMrcb0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=0McdWFul; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="0McdWFul" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ff55176edcso6240832a91.1 for ; Tue, 08 Apr 2025 23:11:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179071; x=1744783871; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=w1vjvtqlcWS/+dNR0OE++xaid1m3UsjjNffN8GtQ4ds=; b=0McdWFul/Wi25VdqgeYmYPN7JG746DbMtBGFY8efs4P/DjGWvFiUeOvRMzOC+1+szp wL+bDCO88/wsFcaJoQ7PNrNlJM8G+LAfRouqp5Rl5wUhO3hPc4HS8nvjr/zmMDxlgACM w29OJL8UIzDQSqjJBwfgOnM35uWbP7t9PCPa5JELTPN968NK04bIuEk2f6n9zA6zCciq LeCX9tPdXYW9okDtHP16D3AWV0AQtUa0DXpg3zuijf747mQ3SzAg+2zH33vkj/WtieCu FzAK9wN6UrAAzE0RpCZtZomv7FkF+DOrYJcufCPfcvZ9koKc1M5ecn6vSjz1ouw8lpeI GbyQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179071; x=1744783871; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=w1vjvtqlcWS/+dNR0OE++xaid1m3UsjjNffN8GtQ4ds=; b=Tlb9GLZVsMSUVnfYcOraahXxC4zH1X7BwAWGODKnpOzlti1lZX5cxHp1BC8lrVicjD MUPwdPDRbygj42I13X2HnGw/YHeIbvVTZkrWUiasO+saVgIFlxcwQKCtioafGT2/wKU1 8jqN07AySh+dHxU5oTeV4FgdGF01gCpcTZb1xj8+OMk40NgandRJtBwB+5aHCYvM6Wh2 Q68Ry79cBMNmNF8Sf9+NilP/BX9oUOAxoR2Wo7qox1Jhb0XDWdLtJoyYaaqlt3pvpIz7 Gu0qj3aOipxoWt5He67hXTuS+vx6wSy2Tst8iZ/MiZmqld1ITS4VVdqr8oNzEsHg6mQY rq7Q== X-Forwarded-Encrypted: i=1; AJvYcCW1JRuWJ7YYErp16ra6/aTueBqyTSuuQEJxBI6IJWR02DB4Fw8i03IDZZxkAq9AhMym0YAzMhmigfHKq1o=@vger.kernel.org X-Gm-Message-State: AOJu0Yzoiwhueur44+e5Q7D1IdAIVGS49S9aFhDRtpyFMvZz8CkW9MzE K9Q5d9C7mS1GMpUQ3uau4dlvdu4//vfv3jLEjipBUYOCE1UTmiXS7tau2Y7pzw+Cw12iymuWWJ3 L82Q54Q== X-Google-Smtp-Source: AGHT+IFUqriEnNWkji09+BChNslJUIhYxFT9jFxGPtzLHIA6YRE0+DT7QXaOh2FImmCJKdJLSPcdpVpP0l+G X-Received: from pjoo16.prod.google.com ([2002:a17:90b:5830:b0:2ef:82c0:cb8d]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5251:b0:2ff:618c:a1e0 with SMTP id 98e67ed59e1d1-306dbc3a097mr2703541a91.29.1744179071202; Tue, 08 Apr 2025 23:11:11 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:37 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-11-irogers@google.com> Subject: [PATCH v4 10/16] perf intel-tpebs: Add support for updating counts in evsel__tpebs_read From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Rename to reflect evsel argument and for consistency with other tpebs functions. Update count from prev_raw_counts when available. Eventually this will allow inteval mode support. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/evsel.c | 11 ++------ tools/perf/util/intel-tpebs.c | 52 ++++++++++++++--------------------- tools/perf/util/intel-tpebs.h | 2 +- 3 files changed, 25 insertions(+), 40 deletions(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 554252ed1aab..1d343f51225b 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1718,11 +1718,6 @@ static int evsel__read_one(struct evsel *evsel, int = cpu_map_idx, int thread) return perf_evsel__read(&evsel->core, cpu_map_idx, thread, count); } =20 -static int evsel__read_retire_lat(struct evsel *evsel, int cpu_map_idx, in= t thread) -{ - return tpebs_set_evsel(evsel, cpu_map_idx, thread); -} - static void evsel__set_count(struct evsel *counter, int cpu_map_idx, int t= hread, u64 val, u64 ena, u64 run, u64 lost) { @@ -1730,8 +1725,8 @@ static void evsel__set_count(struct evsel *counter, i= nt cpu_map_idx, int thread, =20 count =3D perf_counts(counter->counts, cpu_map_idx, thread); =20 - if (counter->retire_lat) { - evsel__read_retire_lat(counter, cpu_map_idx, thread); + if (evsel__is_retire_lat(counter)) { + evsel__tpebs_read(counter, cpu_map_idx, thread); perf_counts__set_loaded(counter->counts, cpu_map_idx, thread, true); return; } @@ -1889,7 +1884,7 @@ int evsel__read_counter(struct evsel *evsel, int cpu_= map_idx, int thread) return evsel__hwmon_pmu_read(evsel, cpu_map_idx, thread); =20 if (evsel__is_retire_lat(evsel)) - return evsel__read_retire_lat(evsel, cpu_map_idx, thread); + return evsel__tpebs_read(evsel, cpu_map_idx, thread); =20 if (evsel->core.attr.read_format & PERF_FORMAT_GROUP) return evsel__read_group(evsel, cpu_map_idx, thread); diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index a723687e67f6..f648fca17556 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -415,49 +415,39 @@ int evsel__tpebs_open(struct evsel *evsel) return ret; } =20 - -int tpebs_set_evsel(struct evsel *evsel, int cpu_map_idx, int thread) +int evsel__tpebs_read(struct evsel *evsel, int cpu_map_idx, int thread) { - __u64 val; + struct perf_counts_values *count, *old_count =3D NULL; struct tpebs_retire_lat *t; - struct perf_counts_values *count; + uint64_t val; + + /* Only set retire_latency value to the first CPU and thread. */ + if (cpu_map_idx !=3D 0 || thread !=3D 0) + return 0; + + if (evsel->prev_raw_counts) + old_count =3D perf_counts(evsel->prev_raw_counts, cpu_map_idx, thread); =20 - /* Non reitre_latency evsel should never enter this function. */ - if (!evsel__is_retire_lat(evsel)) - return -1; + count =3D perf_counts(evsel->counts, cpu_map_idx, thread); =20 /* * Need to stop the forked record to ensure get sampled data from the * PIPE to process and get non-zero retire_lat value for hybrid. */ tpebs_stop(); - count =3D perf_counts(evsel->counts, cpu_map_idx, thread); =20 t =3D tpebs_retire_lat__find(evsel); - - /* Set ena and run to non-zero */ - count->ena =3D count->run =3D 1; - count->lost =3D 0; - - if (!t) { - /* - * Set default value or 0 when retire_latency for this event is - * not found from sampling data (record_tpebs not set or 0 - * sample recorded). - */ - count->val =3D 0; - return 0; + val =3D rint(t->val); + + if (old_count) { + count->val =3D old_count->val + val; + count->run =3D old_count->run + 1; + count->ena =3D old_count->ena + 1; + } else { + count->val =3D val; + count->run++; + count->ena++; } - - /* - * Only set retire_latency value to the first CPU and thread. - */ - if (cpu_map_idx =3D=3D 0 && thread =3D=3D 0) - val =3D rint(t->val); - else - val =3D 0; - - count->val =3D val; return 0; } =20 diff --git a/tools/perf/util/intel-tpebs.h b/tools/perf/util/intel-tpebs.h index 5c671181ec60..218a82866cee 100644 --- a/tools/perf/util/intel-tpebs.h +++ b/tools/perf/util/intel-tpebs.h @@ -12,6 +12,6 @@ extern bool tpebs_recording; =20 int evsel__tpebs_open(struct evsel *evsel); void evsel__tpebs_close(struct evsel *evsel); -int tpebs_set_evsel(struct evsel *evsel, int cpu_map_idx, int thread); +int evsel__tpebs_read(struct evsel *evsel, int cpu_map_idx, int thread); =20 #endif /* __INTEL_TPEBS_H */ --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B58111E5B84 for ; Wed, 9 Apr 2025 06:11:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179075; cv=none; b=XmAflpHoPi/LXEARC29AipmX3q44CfXVgeYXjzHroNz1uGdUjT2tr1mWexVHbnkwCdbxY7AmLp9aSHtOen2JMX4l2p84oh++93/Vci+c74nix29LDe2m1Fnd87YiS7kknyVgzyL0p2/zdhtsJLTtk6hOCF+jRX/2kXH2gVv3t/Q= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179075; c=relaxed/simple; bh=ljmD0cTVkTPSjeRTew6uc5xLS1AYn1ipDaRrb9bphs4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=jxncmoNY8zBWVnEtdvM6jMFJBn7qOPIxI2N53aD/khMGmlhdh8qB3bVlKIuds5k0TduwpGVuIPq9c/ZHJe9Utn2urXPFakkC4utf70ApnYK9uHol714QyfRXMaUUl0KEoDs1Atnkz7zVF/gicNZaTs9UL0uawpnAyomG5anQMkg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=XP96Vg/A; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="XP96Vg/A" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3032ea03448so6620596a91.2 for ; Tue, 08 Apr 2025 23:11:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179073; x=1744783873; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=n0AuvTirY7qrM/gCswfIrUXj0T0vw1kKdRIHGiOGwYc=; b=XP96Vg/AvWJq7YaRXIKd7wZe6B73DLqln6ATyxzuPba7RDYea4gpD/hq45VhpZ8zzN K91LyMENsvm+lXL0jy6So/VU7hZz64WleSLuQM1CfR9Q51G06mARVH0qC4816hwQuic+ Y0KCSiMCIpPUNWBr1yl2PFZbDRGdNtP6HH3Un4SzOG49l4wZHoskkCW8gtqin3FkBwEy gk+x/KO7E3U6S702FE2/LD2+ed8bUIJZn7izL+rSxOwUYRJngykI+zWF2ohAg0ZO8cWc 7adlLLTRvKSD6Gj9wuuUZefbb2Xi27izfJjcXUgLFe9V8gVv+rSZHNB+iOLtP7TAzKk3 lgMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179073; x=1744783873; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=n0AuvTirY7qrM/gCswfIrUXj0T0vw1kKdRIHGiOGwYc=; b=RwGvvzPtpZ/t9LFhqM71HLaoMhvLo7gaAJabREOf4Chukb4Ss5a/Xts6w38Fk7yM6c 9vCBdl3VuJqlOFGs4vpxL4iGHUS8m67UECN0nhZb994iCdvdW2qtXn77ZZQdAt24Q9KF WJTZ5M+zlV0KDuNj3KG11QdbjLnEAK2DkCitaIVXtg8QJqeB4LJWMmU1zmSq4+8zrcd9 W/HBqnQJDGGdYfjuXCYHecnNrHKtNtEPrHhzXFsei4MKZP2qWWYtxueNeXrgRJsPpj9D Q82vQWtBzqeJGIKEISwChg3Qm+mOjS2/TUYgnzVkYvhrfhxZXbJ9JmqJalTp15a8NgP0 e67A== X-Forwarded-Encrypted: i=1; AJvYcCWZ+rtHo2LAlnnSPADy716STMb1iYz7oSsLPOiEkHbJl6ilE7nhVyN1C8YZ/EYIXIJz4PVnaPdqjFzz+f8=@vger.kernel.org X-Gm-Message-State: AOJu0YyOkO46g0qxjF+gADRf871rgWbNspZXGdSubi0haqUJ2iMk09ni VzKduliC5rBZsYGVG+GK2oZw7FVb7IlAoq00pdAoIa0Niy3AyksWgQy9bXsaW3lAqtC9mu3NHM0 csW/4hw== X-Google-Smtp-Source: AGHT+IE6E+kla50Tl/fT5vurmHugITe6quGzXucOvI6VehiiOztSsptMxDmcUi/HFuSBEyL4l9QcD6k50nj5 X-Received: from pjbsl16.prod.google.com ([2002:a17:90b:2e10:b0:2fe:800f:23a]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:270b:b0:301:1bce:c26f with SMTP id 98e67ed59e1d1-306dd324830mr1406134a91.3.1744179073095; Tue, 08 Apr 2025 23:11:13 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:38 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-12-irogers@google.com> Subject: [PATCH v4 11/16] perf intel-tpebs: Add mutex for tpebs_results From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Ensure sample reader isn't racing with events being added/removed. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/intel-tpebs.c | 51 ++++++++++++++++++++++++++++++----- 1 file changed, 44 insertions(+), 7 deletions(-) diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index f648fca17556..c5ccdbc42dc6 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -16,6 +16,7 @@ #include "debug.h" #include "evlist.h" #include "evsel.h" +#include "mutex.h" #include "session.h" #include "tool.h" #include "cpumap.h" @@ -32,6 +33,7 @@ bool tpebs_recording; static LIST_HEAD(tpebs_results); static pthread_t tpebs_reader_thread; static struct child_process tpebs_cmd; +static struct mutex tpebs_mtx; =20 struct tpebs_retire_lat { struct list_head nd; @@ -51,6 +53,19 @@ struct tpebs_retire_lat { =20 static struct tpebs_retire_lat *tpebs_retire_lat__find(struct evsel *evsel= ); =20 +static void tpebs_mtx_init(void) +{ + mutex_init(&tpebs_mtx); +} + +static struct mutex *tpebs_mtx_get(void) +{ + static pthread_once_t tpebs_mtx_once =3D PTHREAD_ONCE_INIT; + + pthread_once(&tpebs_mtx_once, tpebs_mtx_init); + return &tpebs_mtx; +} + static int evsel__tpebs_start_perf_record(struct evsel *evsel, int control= _fd[], int ack_fd[]) { const char **record_argv; @@ -59,13 +74,15 @@ static int evsel__tpebs_start_perf_record(struct evsel = *evsel, int control_fd[], char cpumap_buf[50]; struct tpebs_retire_lat *t; =20 + mutex_lock(tpebs_mtx_get()); list_for_each_entry(t, &tpebs_results, nd) tpebs_event_size++; =20 record_argv =3D malloc((10 + 2 * tpebs_event_size) * sizeof(*record_argv)= ); - if (!record_argv) + if (!record_argv) { + mutex_unlock(tpebs_mtx_get()); return -ENOMEM; - + } record_argv[i++] =3D "perf"; record_argv[i++] =3D "record"; record_argv[i++] =3D "-W"; @@ -101,6 +118,7 @@ static int evsel__tpebs_start_perf_record(struct evsel = *evsel, int control_fd[], list_for_each_entry(t, &tpebs_results, nd) t->started =3D true; =20 + mutex_unlock(tpebs_mtx_get()); return ret; } =20 @@ -112,9 +130,12 @@ static int process_sample_event(const struct perf_tool= *tool __maybe_unused, { struct tpebs_retire_lat *t; =20 + mutex_lock(tpebs_mtx_get()); t =3D tpebs_retire_lat__find(evsel); - if (!t) + if (!t) { + mutex_unlock(tpebs_mtx_get()); return -EINVAL; + } /* * Need to handle per core results? We are assuming average retire * latency value will be used. Save the number of samples and the sum of @@ -123,6 +144,7 @@ static int process_sample_event(const struct perf_tool = *tool __maybe_unused, t->count +=3D 1; t->sum +=3D sample->retire_lat; t->val =3D (double) t->sum / t->count; + mutex_unlock(tpebs_mtx_get()); return 0; } =20 @@ -229,7 +251,6 @@ static struct tpebs_retire_lat *tpebs_retire_lat__new(s= truct evsel *evsel) return NULL; } result->evsel =3D evsel; - list_add_tail(&result->nd, &tpebs_results); return result; } =20 @@ -282,16 +303,22 @@ static struct tpebs_retire_lat *tpebs_retire_lat__fin= d(struct evsel *evsel) static int evsel__tpebs_prepare(struct evsel *evsel) { struct evsel *pos; - struct tpebs_retire_lat *tpebs_event =3D tpebs_retire_lat__find(evsel); + struct tpebs_retire_lat *tpebs_event; =20 + mutex_lock(tpebs_mtx_get()); + tpebs_event =3D tpebs_retire_lat__find(evsel); if (tpebs_event) { /* evsel, or an identically named one, was already prepared. */ + mutex_unlock(tpebs_mtx_get()); return 0; } tpebs_event =3D tpebs_retire_lat__new(evsel); if (!tpebs_event) return -ENOMEM; =20 + list_add_tail(&tpebs_event->nd, &tpebs_results); + mutex_unlock(tpebs_mtx_get()); + /* * Eagerly prepare all other evsels on the list to try to ensure that by * open they are all known. @@ -317,6 +344,7 @@ static int evsel__tpebs_prepare(struct evsel *evsel) int evsel__tpebs_open(struct evsel *evsel) { int ret; + bool tpebs_empty; =20 /* We should only run tpebs_start when tpebs_recording is enabled. */ if (!tpebs_recording) @@ -336,7 +364,10 @@ int evsel__tpebs_open(struct evsel *evsel) if (ret) return ret; =20 - if (!list_empty(&tpebs_results)) { + mutex_lock(tpebs_mtx_get()); + tpebs_empty =3D list_empty(&tpebs_results); + mutex_unlock(tpebs_mtx_get()); + if (!tpebs_empty) { struct pollfd pollfd =3D { .events =3D POLLIN, }; int control_fd[2], ack_fd[2], len; char ack_buf[8]; @@ -436,8 +467,10 @@ int evsel__tpebs_read(struct evsel *evsel, int cpu_map= _idx, int thread) */ tpebs_stop(); =20 + mutex_lock(tpebs_mtx_get()); t =3D tpebs_retire_lat__find(evsel); val =3D rint(t->val); + mutex_unlock(tpebs_mtx_get()); =20 if (old_count) { count->val =3D old_count->val + val; @@ -460,9 +493,13 @@ int evsel__tpebs_read(struct evsel *evsel, int cpu_map= _idx, int thread) */ void evsel__tpebs_close(struct evsel *evsel) { - struct tpebs_retire_lat *t =3D tpebs_retire_lat__find(evsel); + struct tpebs_retire_lat *t; =20 + mutex_lock(tpebs_mtx_get()); + t =3D tpebs_retire_lat__find(evsel); + list_del_init(&t->nd); tpebs_retire_lat__delete(t); + mutex_unlock(tpebs_mtx_get()); =20 if (list_empty(&tpebs_results)) tpebs_stop(); --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-oa1-f74.google.com (mail-oa1-f74.google.com [209.85.160.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id EB2A21E5B87 for ; Wed, 9 Apr 2025 06:11:15 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.160.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179078; cv=none; b=KTzUQ/XjqCg0ucXzedmjlUOKvA3BxaGeLiZNMYgcxsU0+TRdPu5/AgWqtneQcNbjJMOEkB+k/GrtFuI7RtzPcsT34zoz8TXOSS71hA60w6xlTKLk4gd3GUWE+W8t4jdLftZ/SDMPjmTZGBwDaBbIcZG2HyHG7ycXnfyeTOECHIs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179078; c=relaxed/simple; bh=rq1T4nW3ptF3rW6w1vwJRYhMU8sLO7lL7UaD2qb6LQE=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=iIOqI/Gl7PWo7Y7VS/cB5dJwEGJ0mFFesSnKUUbDHB9CO/vLUQNw5jn1b2oDUP87K8LBtDZNVXatoJhQVYt/eYEMyfbKoNT5zn+RwQk8qTzSCFa319rb607a+9Z2kAVwd0HVgtbGsEFWAiud40RKxiSjx52mSPyhKFtMVFl93KU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=3egEC5KQ; arc=none smtp.client-ip=209.85.160.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="3egEC5KQ" Received: by mail-oa1-f74.google.com with SMTP id 586e51a60fabf-2c2d24b3947so273144fac.0 for ; Tue, 08 Apr 2025 23:11:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179075; x=1744783875; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=dJnQ6O5jw867vwmHrVw3vRVHN/Cs2sIpYKycpB+54Lg=; b=3egEC5KQyYbDhM54iMhbjHYe09DnilekQo8Zy+fYUuHmY6mLVciAQRfXEE6B0psBAT hqfpLXVeKoqEln5NKgPIDqNkOGEkBjJSQjqpHR6W0WJ2Ww8daSELSmRPf/s5jj+wsVKY iVGZvtLyIY9Vb8I4bc2SsHLkBHkWf1qR8zR807Pbxw1gffiGtHdOwJ4IRdwC1fB1Od8v Whh2g8LSYTl2u30YODd8flwogaQSIR+NMYpsOqwXeSrQmyuFBFVVBmprFK6o3gQrcYx8 /h7ocX3NtR++ghndHWYz+qpF2y0QOKuh+i+1peW4ZXly4zqGCf2fMxEIfEI5X3G3xpfs JQiw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179075; x=1744783875; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=dJnQ6O5jw867vwmHrVw3vRVHN/Cs2sIpYKycpB+54Lg=; b=jBq4w/5XfLyhfeTSrHe6TvlSgrnbtpPog6qw+rTjI75gGJRykoimMJO6YD19mD+/F8 deHq08UDw39xFGkZrXi+yG05XGL8Fa6ny4o5LMbvFXCJNOz7d73E4y/FJEATrcZiH8eb JVs6vTolOxRcVGFxhEaStKUzd4VJyZ+3nLjReie2vtR/AyTlnpjYrwguHHnPO7oxCwFK ne8YrDXYG0N6YWk/vHP5+xCQD6iF47nRtXreXsDbmjrJWVOcc6JUiH0Z8ZTFOk2lg7r+ 1TfOiKRGn5fjZXtdZO14M6Lq+VxMpixz+6eAgzMBHvSkqvFQxA2DuOIIwP72usVowpA7 uo8g== X-Forwarded-Encrypted: i=1; AJvYcCX1o5M8gQvc52lGomleJHW9uTELgPZNhwV8xJFWINZjCR+HonJdWJbhoirAvIX4NgaBbNcC6TejfuFYVyo=@vger.kernel.org X-Gm-Message-State: AOJu0YwYsagRYA00WBNkwP/o1rqHEmqC1fFoOAWP27K/lbihhDNOL/DY N+rcQbXwv9r6aqaowYpTQxfSrlDNTQz5SdBVQx379593K57dO9QFqWqBvp3dl53W7B24E9GRfpH M44Xbqw== X-Google-Smtp-Source: AGHT+IEA4FNz14C9SCd3gosH3h70eBXlQ1G/Rj1j6Sn+KNhKAediT5APeDAQupLYgQ1xtidmzw4K8qAhyyEf X-Received: from oabvz10.prod.google.com ([2002:a05:6871:a40a:b0:2c1:5dcb:42ac]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a05:6871:7405:b0:2c4:1b1c:42c3 with SMTP id 586e51a60fabf-2d08dda3d96mr1084670fac.9.1744179075078; Tue, 08 Apr 2025 23:11:15 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:39 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-13-irogers@google.com> Subject: [PATCH v4 12/16] perf intel-tpebs: Don't close record on read From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Factor sending record control fd code into its own function. Rather than killing the record process send it a ping when reading. Timeouts were witnessed if done too frequently, so only ping for the first tpebs events. Don't kill the record command send it a stop command. As close isn't reliably called also close on evsel__exit. Add extra checks on the record being terminated to avoid warnings. Adjust the locking as needed and incorporate extra -Wthread-safety checks. Check to do six 500ms poll timeouts when sending commands, rather than the larger 3000ms, to allow the record process terminating to be better witnessed. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/evsel.c | 2 + tools/perf/util/intel-tpebs.c | 205 +++++++++++++++++++++------------- 2 files changed, 132 insertions(+), 75 deletions(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 1d343f51225b..661a07cbdb25 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1656,6 +1656,8 @@ void evsel__exit(struct evsel *evsel) { assert(list_empty(&evsel->core.node)); assert(evsel->evlist =3D=3D NULL); + if (evsel__is_retire_lat(evsel)) + evsel__tpebs_close(evsel); bpf_counter__destroy(evsel); perf_bpf_filter__destroy(evsel); evsel__free_counts(evsel); diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index c5ccdbc42dc6..a9446e7a1c5c 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -33,6 +33,7 @@ bool tpebs_recording; static LIST_HEAD(tpebs_results); static pthread_t tpebs_reader_thread; static struct child_process tpebs_cmd; +static int control_fd[2], ack_fd[2]; static struct mutex tpebs_mtx; =20 struct tpebs_retire_lat { @@ -51,8 +52,6 @@ struct tpebs_retire_lat { bool started; }; =20 -static struct tpebs_retire_lat *tpebs_retire_lat__find(struct evsel *evsel= ); - static void tpebs_mtx_init(void) { mutex_init(&tpebs_mtx); @@ -66,7 +65,10 @@ static struct mutex *tpebs_mtx_get(void) return &tpebs_mtx; } =20 -static int evsel__tpebs_start_perf_record(struct evsel *evsel, int control= _fd[], int ack_fd[]) +static struct tpebs_retire_lat *tpebs_retire_lat__find(struct evsel *evsel) + EXCLUSIVE_LOCKS_REQUIRED(tpebs_mtx_get()); + +static int evsel__tpebs_start_perf_record(struct evsel *evsel) { const char **record_argv; int tpebs_event_size =3D 0, i =3D 0, ret; @@ -74,15 +76,13 @@ static int evsel__tpebs_start_perf_record(struct evsel = *evsel, int control_fd[], char cpumap_buf[50]; struct tpebs_retire_lat *t; =20 - mutex_lock(tpebs_mtx_get()); list_for_each_entry(t, &tpebs_results, nd) tpebs_event_size++; =20 record_argv =3D malloc((10 + 2 * tpebs_event_size) * sizeof(*record_argv)= ); - if (!record_argv) { - mutex_unlock(tpebs_mtx_get()); + if (!record_argv) return -ENOMEM; - } + record_argv[i++] =3D "perf"; record_argv[i++] =3D "record"; record_argv[i++] =3D "-W"; @@ -118,7 +118,6 @@ static int evsel__tpebs_start_perf_record(struct evsel = *evsel, int control_fd[], list_for_each_entry(t, &tpebs_results, nd) t->started =3D true; =20 - mutex_unlock(tpebs_mtx_get()); return ret; } =20 @@ -131,6 +130,11 @@ static int process_sample_event(const struct perf_tool= *tool __maybe_unused, struct tpebs_retire_lat *t; =20 mutex_lock(tpebs_mtx_get()); + if (tpebs_cmd.pid =3D=3D 0) { + /* Record has terminated. */ + mutex_unlock(tpebs_mtx_get()); + return 0; + } t =3D tpebs_retire_lat__find(evsel); if (!t) { mutex_unlock(tpebs_mtx_get()); @@ -180,17 +184,98 @@ static void *__sample_reader(void *arg __maybe_unused) return NULL; } =20 +static int tpebs_send_record_cmd(const char *msg) EXCLUSIVE_LOCKS_REQUIRED= (tpebs_mtx_get()) +{ + struct pollfd pollfd =3D { .events =3D POLLIN, }; + int ret, len, retries =3D 0; + char ack_buf[8]; + + /* Check if the command exited before the send, done with the lock held. = */ + if (tpebs_cmd.pid =3D=3D 0) + return 0; + + /* + * Let go of the lock while sending/receiving as blocking can starve the + * sample reading thread. + */ + mutex_unlock(tpebs_mtx_get()); + + /* Send perf record command.*/ + len =3D strlen(msg); + ret =3D write(control_fd[1], msg, len); + if (ret !=3D len) { + pr_err("perf record control write control message '%s' failed\n", msg); + ret =3D -EPIPE; + goto out; + } + + if (!strcmp(msg, EVLIST_CTL_CMD_STOP_TAG)) { + ret =3D 0; + goto out; + } + + /* Wait for an ack. */ + pollfd.fd =3D ack_fd[0]; + + /* + * We need this poll to ensure the ack_fd PIPE will not hang + * when perf record failed for any reason. The timeout value + * 3000ms is an empirical selection. + */ +again: + if (!poll(&pollfd, 1, 500)) { + if (check_if_command_finished(&tpebs_cmd)) { + ret =3D 0; + goto out; + } + + if (retries++ < 6) + goto again; + pr_err("tpebs failed: perf record ack timeout for '%s'\n", msg); + ret =3D -ETIMEDOUT; + goto out; + } + + if (!(pollfd.revents & POLLIN)) { + if (check_if_command_finished(&tpebs_cmd)) { + ret =3D 0; + goto out; + } + + pr_err("tpebs failed: did not received an ack for '%s'\n", msg); + ret =3D -EPIPE; + goto out; + } + + ret =3D read(ack_fd[0], ack_buf, sizeof(ack_buf)); + if (ret > 0) + ret =3D strcmp(ack_buf, EVLIST_CTL_CMD_ACK_TAG); + else + pr_err("tpebs: perf record control ack failed\n"); +out: + /* Re-take lock as expected by caller. */ + mutex_lock(tpebs_mtx_get()); + return ret; +} + /* * tpebs_stop - stop the sample data read thread and the perf record proce= ss. */ -static int tpebs_stop(void) +static int tpebs_stop(void) EXCLUSIVE_LOCKS_REQUIRED(tpebs_mtx_get()) { int ret =3D 0; =20 /* Like tpebs_start, we should only run tpebs_end once. */ if (tpebs_cmd.pid !=3D 0) { - kill(tpebs_cmd.pid, SIGTERM); + tpebs_send_record_cmd(EVLIST_CTL_CMD_STOP_TAG); + tpebs_cmd.pid =3D 0; + mutex_unlock(tpebs_mtx_get()); pthread_join(tpebs_reader_thread, NULL); + mutex_lock(tpebs_mtx_get()); + close(control_fd[0]); + close(control_fd[1]); + close(ack_fd[0]); + close(ack_fd[1]); close(tpebs_cmd.out); ret =3D finish_command(&tpebs_cmd); tpebs_cmd.pid =3D 0; @@ -313,9 +398,10 @@ static int evsel__tpebs_prepare(struct evsel *evsel) return 0; } tpebs_event =3D tpebs_retire_lat__new(evsel); - if (!tpebs_event) + if (!tpebs_event) { + mutex_unlock(tpebs_mtx_get()); return -ENOMEM; - + } list_add_tail(&tpebs_event->nd, &tpebs_results); mutex_unlock(tpebs_mtx_get()); =20 @@ -351,13 +437,15 @@ int evsel__tpebs_open(struct evsel *evsel) return 0; /* Only start the events once. */ if (tpebs_cmd.pid !=3D 0) { - struct tpebs_retire_lat *t =3D tpebs_retire_lat__find(evsel); + struct tpebs_retire_lat *t; + bool valid; =20 - if (!t || !t->started) { - /* Fail, as the event wasn't started. */ - return -EBUSY; - } - return 0; + mutex_lock(tpebs_mtx_get()); + t =3D tpebs_retire_lat__find(evsel); + valid =3D t && t->started; + mutex_unlock(tpebs_mtx_get()); + /* May fail as the event wasn't started. */ + return valid ? 0 : -EBUSY; } =20 ret =3D evsel__tpebs_prepare(evsel); @@ -366,12 +454,7 @@ int evsel__tpebs_open(struct evsel *evsel) =20 mutex_lock(tpebs_mtx_get()); tpebs_empty =3D list_empty(&tpebs_results); - mutex_unlock(tpebs_mtx_get()); if (!tpebs_empty) { - struct pollfd pollfd =3D { .events =3D POLLIN, }; - int control_fd[2], ack_fd[2], len; - char ack_buf[8]; - /*Create control and ack fd for --control*/ if (pipe(control_fd) < 0) { pr_err("tpebs: Failed to create control fifo"); @@ -384,7 +467,7 @@ int evsel__tpebs_open(struct evsel *evsel) goto out; } =20 - ret =3D evsel__tpebs_start_perf_record(evsel, control_fd, ack_fd); + ret =3D evsel__tpebs_start_perf_record(evsel); if (ret) goto out; =20 @@ -396,53 +479,16 @@ int evsel__tpebs_open(struct evsel *evsel) ret =3D -1; goto out; } - /* Wait for perf record initialization.*/ - len =3D strlen(EVLIST_CTL_CMD_ENABLE_TAG); - ret =3D write(control_fd[1], EVLIST_CTL_CMD_ENABLE_TAG, len); - if (ret !=3D len) { - pr_err("perf record control write control message failed\n"); - goto out; - } - - /* wait for an ack */ - pollfd.fd =3D ack_fd[0]; - - /* - * We need this poll to ensure the ack_fd PIPE will not hang - * when perf record failed for any reason. The timeout value - * 3000ms is an empirical selection. - */ - if (!poll(&pollfd, 1, 3000)) { - pr_err("tpebs failed: perf record ack timeout\n"); - ret =3D -1; - goto out; - } - - if (!(pollfd.revents & POLLIN)) { - pr_err("tpebs failed: did not received an ack\n"); - ret =3D -1; - goto out; - } - - ret =3D read(ack_fd[0], ack_buf, sizeof(ack_buf)); - if (ret > 0) - ret =3D strcmp(ack_buf, EVLIST_CTL_CMD_ACK_TAG); - else { - pr_err("tpebs: perf record control ack failed\n"); - goto out; - } -out: - close(control_fd[0]); - close(control_fd[1]); - close(ack_fd[0]); - close(ack_fd[1]); + ret =3D tpebs_send_record_cmd(EVLIST_CTL_CMD_ENABLE_TAG); } +out: if (ret) { struct tpebs_retire_lat *t =3D tpebs_retire_lat__find(evsel); =20 list_del_init(&t->nd); tpebs_retire_lat__delete(t); } + mutex_unlock(tpebs_mtx_get()); return ret; } =20 @@ -451,6 +497,7 @@ int evsel__tpebs_read(struct evsel *evsel, int cpu_map_= idx, int thread) struct perf_counts_values *count, *old_count =3D NULL; struct tpebs_retire_lat *t; uint64_t val; + int ret; =20 /* Only set retire_latency value to the first CPU and thread. */ if (cpu_map_idx !=3D 0 || thread !=3D 0) @@ -461,14 +508,20 @@ int evsel__tpebs_read(struct evsel *evsel, int cpu_ma= p_idx, int thread) =20 count =3D perf_counts(evsel->counts, cpu_map_idx, thread); =20 - /* - * Need to stop the forked record to ensure get sampled data from the - * PIPE to process and get non-zero retire_lat value for hybrid. - */ - tpebs_stop(); - mutex_lock(tpebs_mtx_get()); t =3D tpebs_retire_lat__find(evsel); + /* + * If reading the first tpebs result, send a ping to the record + * process. Allow the sample reader a chance to read by releasing and + * reacquiring the lock. + */ + if (&t->nd =3D=3D tpebs_results.next) { + ret =3D tpebs_send_record_cmd(EVLIST_CTL_CMD_PING_TAG); + mutex_unlock(tpebs_mtx_get()); + if (ret) + return ret; + mutex_lock(tpebs_mtx_get()); + } val =3D rint(t->val); mutex_unlock(tpebs_mtx_get()); =20 @@ -497,10 +550,12 @@ void evsel__tpebs_close(struct evsel *evsel) =20 mutex_lock(tpebs_mtx_get()); t =3D tpebs_retire_lat__find(evsel); - list_del_init(&t->nd); - tpebs_retire_lat__delete(t); - mutex_unlock(tpebs_mtx_get()); + if (t) { + list_del_init(&t->nd); + tpebs_retire_lat__delete(t); =20 - if (list_empty(&tpebs_results)) - tpebs_stop(); + if (list_empty(&tpebs_results)) + tpebs_stop(); + } + mutex_unlock(tpebs_mtx_get()); } --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 35FE21EB9FA for ; Wed, 9 Apr 2025 06:11:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179078; cv=none; b=ANQXPpcXinm4sQc/A9FL7kDx+r40fVqWUZAyQq6FHAW2vNS3mSncKholp3RGyIiRV8XZan77BRH42tBs42Acle5QybmI6yn6AJBwR6ImPl2+4EBot2AetsMUho+dpLyCoLi8yXzpVC+2f9bG66fe9tsBjCtp5lAHXdb5GoPiIYs= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179078; c=relaxed/simple; bh=DOdUTxLI7/zQjgCEpln88RgVE7J5L5+nYgmvVB4LmPU=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Jk16N4L8Ka/nvrGnp16zOW7PH2vt1+qraIDZhNLl+mf4lp0la08BEdXwq107tvb7wB5QNiymXOauCvKbToDRGWTzA3cQkHaelz5Gp2H1dODjjZujzEhjZYxInEiP9TUM7Zm0VMxIkQsJeyaBRrM2KHuZPIba7WqGnRUfXGDxxWg= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=tiYopxWL; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="tiYopxWL" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-3011bee1751so6019695a91.1 for ; Tue, 08 Apr 2025 23:11:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179076; x=1744783876; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=bbV+FoNiQvVRc13/UCAfNK3Jak/b5U1tJ5tpMxpqA0g=; b=tiYopxWLTVW9GlcaBpiyVJ+d/pvbALD6fJ6/voKX3tS2BnL6QZjtKyfU3NakGiR/oJ 5bvOInU+dJBS12/s1CxPqde4rDbeC8alpA3E0+d0egO9eiSuIVoeklTCaCzEOwsKfdej SP+Ptheb2WVS5l+uQ78HDURAzNKVOuVr5++Vv5HOEgI+PM6fj3u9oySawNVV6Yyz0xGL LMavk2JbeIMJ49T76uhBZ0ELQgZ1FlPnODYa04gSDtY2mvRZYvmWzu1T/7aYf24akyHu wTjM3M4K1C9g28AsuBit/TVowFinLFtzkH3GGbT0Pki5fJaq5KMw9rv41vhXpYI1wt8L 2wug== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179076; x=1744783876; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=bbV+FoNiQvVRc13/UCAfNK3Jak/b5U1tJ5tpMxpqA0g=; b=awUpLeOBUc0lubJVQ8CNy2cN+avisYBSLRdhWXS+1iIo4uE/IaLE90PlNUtI8X2EDH Fn7tKGzGl88vt3hIIiszxuHLVYl/EZSztaq47d9f1pn6oMzQA6OGKExGgveUmVeSFyXT n+OYGaSo8JM4gWE7Ud17xkkpYd60YSDWzXvqZVd0ejBNsxB9WANO9XVsXm/5tKLtyVs1 l0yi6mt2JOqSOfyG8gqffy7fWo5hiLqIAxrxd0dm6kkmLKi0V/qpL89NDLb2wKcl7/Ua NZ72f+tSdtNM2CuICZ2xdWYfryHtQegmuyPlhSDXXUb8HDUwGstqEhVKojNpq3Lch/JN 5O6A== X-Forwarded-Encrypted: i=1; AJvYcCX0GyWyEn0ZHofKFhvbrc9H72Z6jU724dd24FXtQxN0ydvpg7bpxWMRXys/Bx0Fps69xsumjA7MDPNx1WE=@vger.kernel.org X-Gm-Message-State: AOJu0YxhQG95KSoYYEsyYQTMWRNXMT33OwGZX7SgIfGvlHN2bpellYMP FSV6airVd1p3FnLvPVY2xsCf31+tn9wvBTB4DN7vK2lznsbRwwCoFySnQdfKuAfMcx53revjl3f /vCFuvA== X-Google-Smtp-Source: AGHT+IG140Zd6/7lVXAjnge1pa3Un7YaR/FXpKWuwkcmM+zdDiv8SQSei2XhleF7r5K3eMIAKQY2frnqpZoe X-Received: from pjbsv7.prod.google.com ([2002:a17:90b:5387:b0:2ff:5df6:7e03]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5243:b0:2ff:64a0:4a57 with SMTP id 98e67ed59e1d1-306dd5565damr1543288a91.26.1744179076598; Tue, 08 Apr 2025 23:11:16 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:40 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-14-irogers@google.com> Subject: [PATCH v4 13/16] perf intel-tpebs: Use stats for retirement latency statistics From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" struct stats provides access to mean, min and max. It also provides uniformity with statistics code used elsewhere in perf. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/util/intel-tpebs.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index a9446e7a1c5c..de9fea601964 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -18,6 +18,7 @@ #include "evsel.h" #include "mutex.h" #include "session.h" +#include "stat.h" #include "tool.h" #include "cpumap.h" #include "metricgroup.h" @@ -42,12 +43,8 @@ struct tpebs_retire_lat { struct evsel *evsel; /** @event: Event passed to perf record. */ char *event; - /* Count of retire_latency values found in sample data */ - size_t count; - /* Sum of all the retire_latency values in sample data */ - int sum; - /* Average of retire_latency, val =3D sum / count */ - double val; + /** @stats: Recorded retirement latency stats. */ + struct stats stats; /* Has the event been sent to perf record? */ bool started; }; @@ -145,9 +142,7 @@ static int process_sample_event(const struct perf_tool = *tool __maybe_unused, * latency value will be used. Save the number of samples and the sum of * retire latency value for each event. */ - t->count +=3D 1; - t->sum +=3D sample->retire_lat; - t->val =3D (double) t->sum / t->count; + update_stats(&t->stats, sample->retire_lat); mutex_unlock(tpebs_mtx_get()); return 0; } @@ -522,7 +517,7 @@ int evsel__tpebs_read(struct evsel *evsel, int cpu_map_= idx, int thread) return ret; mutex_lock(tpebs_mtx_get()); } - val =3D rint(t->val); + val =3D rint(t->stats.mean); mutex_unlock(tpebs_mtx_get()); =20 if (old_count) { --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pj1-f74.google.com (mail-pj1-f74.google.com [209.85.216.74]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 294DC1DF735 for ; Wed, 9 Apr 2025 06:11:19 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.216.74 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179080; cv=none; b=SWbqvBoIQEbpyj7C/kr9o7K2gSH5dXh0dzmIWmjdfddRcymOcUGF9SnIephUD09zyj1bCMboDQjgyxQFj2Zw1eMrrWwjx4yYpe1GmOnvBRtMaPXVFzs+j3Q+9FpmkI5bICpLhZpoSND9ajZR6Fu/0gcAsrqpSN6HdtQpTiGUmpU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179080; c=relaxed/simple; bh=j+ajFhze8XNvNedW0+qQsxa4xJpNyLgqbtH3uNHZnh4=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=Ipi2uq917xQ7pOU4tNoDiBJq5/Po3GP837NePwsyouuSX+ypTq7vuUNZGx+p0i+joliId3bmG9Gk3hQOv+0hxd7+AiSkvSZyZ56yGN225EAZs8NXUoPgeEZxu6rVb+Bvdx1yf5qmaGyU1AjiQO852jq7nlVsiOh/HTAn9QcnEzI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=rXhWyLPy; arc=none smtp.client-ip=209.85.216.74 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="rXhWyLPy" Received: by mail-pj1-f74.google.com with SMTP id 98e67ed59e1d1-2ff605a7a43so9855752a91.3 for ; Tue, 08 Apr 2025 23:11:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179078; x=1744783878; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=CHpmhSJgyl8CfNQkTk9ozGn6lbmpXan8KmxzNdnU62A=; b=rXhWyLPysaQYBQ0ieVesEH6ygF3/xP4eK6U1pcYm5mOm5wU2VgGrPvVfKYTd6XAffG nspDjLuI59LEo+ZjXAVlEtJdP76M17J2Ej2B2TqYvx89x7vkQ3OrEdMtVmKSWcC+Gmsd nORiTnsTav1B2tHJ0X03M/p/T/s5VQk6u/GR51kCycVoEfvMqBeakg4FyaJvPnJgG/6I iutytKRxtOiSTin9TYCPmIMWeuOXnC3j0mvuie5+6o24zjoINsYqy9amKn9NSu+Bw8eF UI0JqKjMKPjysLVLGvmT7kAF5wE396F5kFB9GDhlcSa8ys+vLwZ1QMCKfbWAtnZVXwxC LmCQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179078; x=1744783878; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=CHpmhSJgyl8CfNQkTk9ozGn6lbmpXan8KmxzNdnU62A=; b=pAbpUQjKVU8SHFmjocoXvDIkO40mkQclD5HQtMv9yeYXr2ptO+KeBZ2vUfig373uBx RC4sVZa2xk3r0EG/uonE97bpE2dUvQtT42CwA2bGimhNx9HRDbdb74ZzEssvgCRMg5S1 6qnCvbtA++KYRkjvpITi9wfvb9HT5fXG+wY/xrL4x/nZTyLk6pxTe1lhvWJ1QjbKUMqw dfZGDENinspJn9uqqV71apfFQadi52wXqsJGvbW6ZAocLQm8azLY1RnxYQovm2iuSPWJ mrBNST9/tyrQ/rsMDAPUKqRHs5lyAXXgsa5NAXU5+C8mXGE+5Fne4Y94SC+kVyt15WFv v9VA== X-Forwarded-Encrypted: i=1; AJvYcCUHWZjuhU+bz/lOTxWE7xPAnK5l0X7+Yt6ozN2e5jBPbN1gaBE3dOxcRT1LPf6TpVEbBrf8Bv8U63Wmxso=@vger.kernel.org X-Gm-Message-State: AOJu0YxCizz2qj9qOoB0tCpFizx760DB1TL4WJS+J8hiSrzO+EbGB4ub wptCoM9ZcbMVjdQH+dMvGyPZSNyHeUwAdUZL+Ue1j7qWNC8OFEvtqnYDVzVMy759uAoSxlCvz5E vXYrmdg== X-Google-Smtp-Source: AGHT+IGdvPE4F53XVdwo/U3wL0FozvzxXNLjuDuOddsx+hzCG+0dueONRQ1yvtowNc8rrzczZUGLSQxJO5Xi X-Received: from pjbsz16.prod.google.com ([2002:a17:90b:2d50:b0:2ef:786a:1835]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:90b:5344:b0:2ea:712d:9a82 with SMTP id 98e67ed59e1d1-306dbc3ba42mr2486031a91.29.1744179078561; Tue, 08 Apr 2025 23:11:18 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:41 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-15-irogers@google.com> Subject: [PATCH v4 14/16] perf stat: Add mean, min, max and last --tpebs-mode options From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Add command line configuration option for how retirement latency events are combined. The default "mean" gives the average of retirement latency. "min" or "max" give the smallest or largest retirment latency times respectively. "last" uses the last retirment latency sample's time. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/Documentation/perf-stat.txt | 7 +++++++ tools/perf/builtin-stat.c | 27 ++++++++++++++++++++++++++ tools/perf/util/intel-tpebs.c | 20 ++++++++++++++++++- tools/perf/util/intel-tpebs.h | 8 ++++++++ 4 files changed, 61 insertions(+), 1 deletion(-) diff --git a/tools/perf/Documentation/perf-stat.txt b/tools/perf/Documentat= ion/perf-stat.txt index 2bc063672486..61d091670dee 100644 --- a/tools/perf/Documentation/perf-stat.txt +++ b/tools/perf/Documentation/perf-stat.txt @@ -506,6 +506,13 @@ this option is not set. The TPEBS hardware feature sta= rts from Intel Granite Rapids microarchitecture. This option only exists in X86_64 and is meaning= ful on Intel platforms with TPEBS feature. =20 +--tpebs-mode=3D[mean|min|max|last]:: +Set how retirement latency events have their sample times +combined. The default "mean" gives the average of retirement +latency. "min" or "max" give the smallest or largest retirment latency +times respectively. "last" uses the last retirment latency sample's +time. + --td-level:: Print the top-down statistics that equal the input level. It allows users to print the interested top-down metrics level instead of the diff --git a/tools/perf/builtin-stat.c b/tools/perf/builtin-stat.c index 80e491bd775b..4adf2ae53b11 100644 --- a/tools/perf/builtin-stat.c +++ b/tools/perf/builtin-stat.c @@ -2327,6 +2327,30 @@ static void setup_system_wide(int forks) } } =20 +static int parse_tpebs_mode(const struct option *opt, const char *str, + int unset __maybe_unused) +{ + enum tpebs_mode *mode =3D opt->value; + + if (!strcasecmp("mean", str)) { + *mode =3D TPEBS_MODE__MEAN; + return 0; + } + if (!strcasecmp("min", str)) { + *mode =3D TPEBS_MODE__MIN; + return 0; + } + if (!strcasecmp("max", str)) { + *mode =3D TPEBS_MODE__MAX; + return 0; + } + if (!strcasecmp("last", str)) { + *mode =3D TPEBS_MODE__LAST; + return 0; + } + return -1; +} + int cmd_stat(int argc, const char **argv) { struct opt_aggr_mode opt_mode =3D {}; @@ -2431,6 +2455,9 @@ int cmd_stat(int argc, const char **argv) #ifdef HAVE_ARCH_X86_64_SUPPORT OPT_BOOLEAN(0, "record-tpebs", &tpebs_recording, "enable recording for tpebs when retire_latency required"), + OPT_CALLBACK(0, "tpebs-mode", &tpebs_mode, "tpebs-mode", + "Mode of TPEBS recording: mean, min or max", + parse_tpebs_mode), #endif OPT_UINTEGER(0, "td-level", &stat_config.topdown_level, "Set the metrics level for the top-down statistics (0: max level)"), diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index de9fea601964..6b00bd5b0af1 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -31,6 +31,7 @@ #define PERF_DATA "-" =20 bool tpebs_recording; +enum tpebs_mode tpebs_mode; static LIST_HEAD(tpebs_results); static pthread_t tpebs_reader_thread; static struct child_process tpebs_cmd; @@ -45,6 +46,8 @@ struct tpebs_retire_lat { char *event; /** @stats: Recorded retirement latency stats. */ struct stats stats; + /** @last: Last retirement latency read. */ + uint64_t last; /* Has the event been sent to perf record? */ bool started; }; @@ -142,6 +145,7 @@ static int process_sample_event(const struct perf_tool = *tool __maybe_unused, * latency value will be used. Save the number of samples and the sum of * retire latency value for each event. */ + t->last =3D sample->retire_lat; update_stats(&t->stats, sample->retire_lat); mutex_unlock(tpebs_mtx_get()); return 0; @@ -517,7 +521,21 @@ int evsel__tpebs_read(struct evsel *evsel, int cpu_map= _idx, int thread) return ret; mutex_lock(tpebs_mtx_get()); } - val =3D rint(t->stats.mean); + switch (tpebs_mode) { + case TPEBS_MODE__MIN: + val =3D rint(t->stats.min); + break; + case TPEBS_MODE__MAX: + val =3D rint(t->stats.max); + break; + case TPEBS_MODE__LAST: + val =3D t->last; + break; + default: + case TPEBS_MODE__MEAN: + val =3D rint(t->stats.mean); + break; + } mutex_unlock(tpebs_mtx_get()); =20 if (old_count) { diff --git a/tools/perf/util/intel-tpebs.h b/tools/perf/util/intel-tpebs.h index 218a82866cee..9475e2e6ea74 100644 --- a/tools/perf/util/intel-tpebs.h +++ b/tools/perf/util/intel-tpebs.h @@ -8,7 +8,15 @@ struct evlist; struct evsel; =20 +enum tpebs_mode { + TPEBS_MODE__MEAN, + TPEBS_MODE__MIN, + TPEBS_MODE__MAX, + TPEBS_MODE__LAST, +}; + extern bool tpebs_recording; +extern enum tpebs_mode tpebs_mode; =20 int evsel__tpebs_open(struct evsel *evsel); void evsel__tpebs_close(struct evsel *evsel); --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pl1-f202.google.com (mail-pl1-f202.google.com [209.85.214.202]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 8F7F5202F6D for ; Wed, 9 Apr 2025 06:11:21 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.202 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179084; cv=none; b=FqkaUQRNUTftIniiPi3/86OjZ4TcNyiL2gqfWqBRDuCS0hfNYcprFZ4gBjT8SSKiESDHTc8lrvAvKkD4Z9PPESxajM3yjWsqYTFle2M3sS6OgS2jVkTYLBhpaeFvmZmHUZUUuojK7O6FyiLZchw188USJ4vqA9SSuUWfEm3XCms= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179084; c=relaxed/simple; bh=SNGiNhl3DrgFCvxGGPb8DnX9crh6HpsqooXUMWzR8Bo=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=R53oHD4/OT6DK7gFHSIIj2mA1Emnve4Eb9io6fMDlfzPGaDo+PxHcAKJ7esHv0gGyxLZhMlDmMabZDYsN39xFF2AL/70GotC3M56uHrPrYBEwv49aorJXuHZwO403CISTEAE0l6DGrszLNcLaF27Iwm/OVfslIPyFyicIJ0JAKw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=CcIh+5Yz; arc=none smtp.client-ip=209.85.214.202 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="CcIh+5Yz" Received: by mail-pl1-f202.google.com with SMTP id d9443c01a7336-224192ff68bso59138165ad.1 for ; Tue, 08 Apr 2025 23:11:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179081; x=1744783881; darn=vger.kernel.org; h=content-transfer-encoding:to:from:subject:message-id:references :mime-version:in-reply-to:date:from:to:cc:subject:date:message-id :reply-to; bh=DrjE5aMITbrxjK5QqlVnV58r0oh1BWdszMCAScgXzK4=; b=CcIh+5Yzn/xmcGyNjrT5cgOHa3XobCwY3jrzbp3n0ZZ+26NDRZ65owkqiftKI3Wami 6XgHB3ciVFahEzw/QB206XHXUw1Hj2yXjAbQOkb2a7lA0hBw3vnq+d+DP/2+eKWwQG5S ogDJ1+CnrULN0bLKUXtzS3vPaUdUrGeHjxNnx+gbaNddYH1YfOelv/mz5zktHDrF1Z/Y JS+19j7WFPnxRXj8dWxrJopFpIaQcN41gvQYHFqQWNZMNYFiqNwMwNZKuQ3EyfiCVj8l NF+qNG3xDra7OrfT5PyXEY1aVY0tKXaILnulAN6reqBFfGJjSuIfw3qUwFEYuuXziRlP JMBg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179081; x=1744783881; h=content-transfer-encoding:to:from:subject:message-id:references :mime-version:in-reply-to:date:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=DrjE5aMITbrxjK5QqlVnV58r0oh1BWdszMCAScgXzK4=; b=cJPkEFyiasnM9v6PoXOiAa6xKUliu7q64SL35QwAfguQLD2UdvvG5YgSfqtDfiIkFr txaZQ/uFNJQvObfVY/sc4hcARyLudI2GQC9RIAAFX6iORloymdkoawW4TRIg6B+57aW5 YslLLay1bGj2BuwRZSHDRqurgRulJIg7srffb8Pup1v57VNF4XCNHotgzax01T3DCuYU XTMWWsYPu0WKnu7XyT91C9ta27uyxs8UmBY5KcSVs9kQwyqDGK29vpuUP94YmhhTEXP+ 5LrxXkzY6oYw28qychBw5yKF8QfgATpm+DfwePGome2pr1WUNZvp1JwPk1w8AWN/TFVF KdFQ== X-Forwarded-Encrypted: i=1; AJvYcCWG50YQJ8cuQDfboK3hYGRpGzlchZO3NrRiZSb3WxLmqgVk0Ugpi3PDIIh1Bmsj6/p0bHuchbB4VLJ3rqI=@vger.kernel.org X-Gm-Message-State: AOJu0Yzami7mVTtknFIsGsvlmyOnTiWVZlxo/h3naSfFpwTSzozmU7vP v7OFbpiVC2MQTputMVYeIWltVcxzXutwsnB9jhm4l90G8ujP0cb8zjUK1nCdcEQWlfrquh3iVg4 Td+vHqA== X-Google-Smtp-Source: AGHT+IFcED5nxA10pX8N+h+LgmMXkhVBrKBr592q24ECr6S8Iq911J+gv8Zfx2r6X/w5PA9GSW2yeZEH4CG+ X-Received: from plgp15.prod.google.com ([2002:a17:902:ebcf:b0:223:5c58:1855]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:230b:b0:223:47d9:1964 with SMTP id d9443c01a7336-22ac2a1df2cmr30079805ad.34.1744179080709; Tue, 08 Apr 2025 23:11:20 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:42 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-16-irogers@google.com> Subject: [PATCH v4 15/16] perf pmu-events: Add retirement latency to JSON events inside of perf From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" The updated Intel vendor events add retirement latency for graniterapids: https://lore.kernel.org/lkml/20250322063403.364981-14-irogers@google.com/ This change makes those values available within an alias/event within a PMU and saves them into the evsel at event parse time. When no TPEBS data is available the default values are substituted in for TMA metrics that are using retirement latency events - currently just those on graniterapids. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim --- tools/perf/pmu-events/empty-pmu-events.c | 216 ++++++++++++----------- tools/perf/pmu-events/jevents.py | 6 + tools/perf/pmu-events/pmu-events.h | 3 + tools/perf/util/evsel.h | 6 + tools/perf/util/intel-tpebs.c | 52 ++++-- tools/perf/util/parse-events.c | 4 + tools/perf/util/pmu.c | 52 +++++- tools/perf/util/pmu.h | 3 + 8 files changed, 220 insertions(+), 122 deletions(-) diff --git a/tools/perf/pmu-events/empty-pmu-events.c b/tools/perf/pmu-even= ts/empty-pmu-events.c index 0cb7ba7912e8..0361bcc1eb58 100644 --- a/tools/perf/pmu-events/empty-pmu-events.c +++ b/tools/perf/pmu-events/empty-pmu-events.c @@ -20,73 +20,73 @@ struct pmu_table_entry { =20 static const char *const big_c_string =3D /* offset=3D0 */ "tool\000" -/* offset=3D5 */ "duration_time\000tool\000Wall clock interval time in nan= oseconds\000config=3D1\000\00000\000\000" -/* offset=3D78 */ "user_time\000tool\000User (non-kernel) time in nanoseco= nds\000config=3D2\000\00000\000\000" -/* offset=3D145 */ "system_time\000tool\000System/kernel time in nanosecon= ds\000config=3D3\000\00000\000\000" -/* offset=3D210 */ "has_pmem\000tool\0001 if persistent memory installed o= therwise 0\000config=3D4\000\00000\000\000" -/* offset=3D283 */ "num_cores\000tool\000Number of cores. A core consists = of 1 or more thread, with each thread being associated with a logical Linux= CPU\000config=3D5\000\00000\000\000" -/* offset=3D425 */ "num_cpus\000tool\000Number of logical Linux CPUs. Ther= e may be multiple such CPUs on a core\000config=3D6\000\00000\000\000" -/* offset=3D525 */ "num_cpus_online\000tool\000Number of online logical Li= nux CPUs. There may be multiple such CPUs on a core\000config=3D7\000\00000= \000\000" -/* offset=3D639 */ "num_dies\000tool\000Number of dies. Each die has 1 or = more cores\000config=3D8\000\00000\000\000" -/* offset=3D712 */ "num_packages\000tool\000Number of packages. Each packa= ge has 1 or more die\000config=3D9\000\00000\000\000" -/* offset=3D795 */ "slots\000tool\000Number of functional units that in pa= rallel can execute parts of an instruction\000config=3D0xa\000\00000\000\00= 0" -/* offset=3D902 */ "smt_on\000tool\0001 if simultaneous multithreading (ak= a hyperthreading) is enable otherwise 0\000config=3D0xb\000\00000\000\000" -/* offset=3D1006 */ "system_tsc_freq\000tool\000The amount a Time Stamp Co= unter (TSC) increases per second\000config=3D0xc\000\00000\000\000" -/* offset=3D1102 */ "default_core\000" -/* offset=3D1115 */ "bp_l1_btb_correct\000branch\000L1 BTB Correction\000e= vent=3D0x8a\000\00000\000\000" -/* offset=3D1174 */ "bp_l2_btb_correct\000branch\000L2 BTB Correction\000e= vent=3D0x8b\000\00000\000\000" -/* offset=3D1233 */ "l3_cache_rd\000cache\000L3 cache access, read\000even= t=3D0x40\000\00000\000Attributable Level 3 cache access, read\000" -/* offset=3D1328 */ "segment_reg_loads.any\000other\000Number of segment r= egister loads\000event=3D6,period=3D200000,umask=3D0x80\000\00000\000\000" -/* offset=3D1427 */ "dispatch_blocked.any\000other\000Memory cluster signa= ls to block micro-op dispatch for any reason\000event=3D9,period=3D200000,u= mask=3D0x20\000\00000\000\000" -/* offset=3D1557 */ "eist_trans\000other\000Number of Enhanced Intel Speed= Step(R) Technology (EIST) transitions\000event=3D0x3a,period=3D200000\000\0= 0000\000\000" -/* offset=3D1672 */ "hisi_sccl,ddrc\000" -/* offset=3D1687 */ "uncore_hisi_ddrc.flux_wcmd\000uncore\000DDRC write co= mmands\000event=3D2\000\00000\000DDRC write commands\000" -/* offset=3D1773 */ "uncore_cbox\000" -/* offset=3D1785 */ "unc_cbo_xsnp_response.miss_eviction\000uncore\000A cr= oss-core snoop resulted from L3 Eviction which misses in some processor cor= e\000event=3D0x22,umask=3D0x81\000\00000\000A cross-core snoop resulted fro= m L3 Eviction which misses in some processor core\000" -/* offset=3D2016 */ "event-hyphen\000uncore\000UNC_CBO_HYPHEN\000event=3D0= xe0\000\00000\000UNC_CBO_HYPHEN\000" -/* offset=3D2081 */ "event-two-hyph\000uncore\000UNC_CBO_TWO_HYPH\000event= =3D0xc0\000\00000\000UNC_CBO_TWO_HYPH\000" -/* offset=3D2152 */ "hisi_sccl,l3c\000" -/* offset=3D2166 */ "uncore_hisi_l3c.rd_hit_cpipe\000uncore\000Total read = hits\000event=3D7\000\00000\000Total read hits\000" -/* offset=3D2246 */ "uncore_imc_free_running\000" -/* offset=3D2270 */ "uncore_imc_free_running.cache_miss\000uncore\000Total= cache misses\000event=3D0x12\000\00000\000Total cache misses\000" -/* offset=3D2365 */ "uncore_imc\000" -/* offset=3D2376 */ "uncore_imc.cache_hits\000uncore\000Total cache hits\0= 00event=3D0x34\000\00000\000Total cache hits\000" -/* offset=3D2454 */ "uncore_sys_ddr_pmu\000" -/* offset=3D2473 */ "sys_ddr_pmu.write_cycles\000uncore\000ddr write-cycle= s event\000event=3D0x2b\000v8\00000\000\000" -/* offset=3D2546 */ "uncore_sys_ccn_pmu\000" -/* offset=3D2565 */ "sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycles = event\000config=3D0x2c\0000x01\00000\000\000" -/* offset=3D2639 */ "uncore_sys_cmn_pmu\000" -/* offset=3D2658 */ "sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts total = cache misses in first lookup result (high priority)\000eventid=3D1,type=3D5= \000(434|436|43c|43a).*\00000\000\000" -/* offset=3D2798 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\00000" -/* offset=3D2820 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalted.= thread\000\000\000\000\000\000\000\00000" -/* offset=3D2883 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.core= / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_act= ive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000" -/* offset=3D3049 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_re= tired.any\000\000\000\000\000\000\000\00000" -/* offset=3D3113 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / inst= _retired.any\000\000\000\000\000\000\000\00000" -/* offset=3D3180 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + icac= he_miss_cycles\000\000\000\000\000\000\000\00000" -/* offset=3D3251 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit= + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000" -/* offset=3D3345 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_dat= a_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_mi= ss\000\000\000\000\000\000\000\00000" -/* offset=3D3479 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_A= ll_Miss\000\000\000\000\000\000\000\00000" -/* offset=3D3543 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCa= che_L2_All)\000\000\000\000\000\000\000\00000" -/* offset=3D3611 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, D= Cache_L2_All)\000\000\000\000\000\000\000\00000" -/* offset=3D3681 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\00000" -/* offset=3D3703 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\00000" -/* offset=3D3725 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\00000" -/* offset=3D3745 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 /= duration_time\000\000\000\000\000\000\000\00000" +/* offset=3D5 */ "duration_time\000tool\000Wall clock interval time in nan= oseconds\000config=3D1\000\00000\000\000\000\000\000" +/* offset=3D81 */ "user_time\000tool\000User (non-kernel) time in nanoseco= nds\000config=3D2\000\00000\000\000\000\000\000" +/* offset=3D151 */ "system_time\000tool\000System/kernel time in nanosecon= ds\000config=3D3\000\00000\000\000\000\000\000" +/* offset=3D219 */ "has_pmem\000tool\0001 if persistent memory installed o= therwise 0\000config=3D4\000\00000\000\000\000\000\000" +/* offset=3D295 */ "num_cores\000tool\000Number of cores. A core consists = of 1 or more thread, with each thread being associated with a logical Linux= CPU\000config=3D5\000\00000\000\000\000\000\000" +/* offset=3D440 */ "num_cpus\000tool\000Number of logical Linux CPUs. Ther= e may be multiple such CPUs on a core\000config=3D6\000\00000\000\000\000\0= 00\000" +/* offset=3D543 */ "num_cpus_online\000tool\000Number of online logical Li= nux CPUs. There may be multiple such CPUs on a core\000config=3D7\000\00000= \000\000\000\000\000" +/* offset=3D660 */ "num_dies\000tool\000Number of dies. Each die has 1 or = more cores\000config=3D8\000\00000\000\000\000\000\000" +/* offset=3D736 */ "num_packages\000tool\000Number of packages. Each packa= ge has 1 or more die\000config=3D9\000\00000\000\000\000\000\000" +/* offset=3D822 */ "slots\000tool\000Number of functional units that in pa= rallel can execute parts of an instruction\000config=3D0xa\000\00000\000\00= 0\000\000\000" +/* offset=3D932 */ "smt_on\000tool\0001 if simultaneous multithreading (ak= a hyperthreading) is enable otherwise 0\000config=3D0xb\000\00000\000\000\0= 00\000\000" +/* offset=3D1039 */ "system_tsc_freq\000tool\000The amount a Time Stamp Co= unter (TSC) increases per second\000config=3D0xc\000\00000\000\000\000\000\= 000" +/* offset=3D1138 */ "default_core\000" +/* offset=3D1151 */ "bp_l1_btb_correct\000branch\000L1 BTB Correction\000e= vent=3D0x8a\000\00000\000\000\000\000\000" +/* offset=3D1213 */ "bp_l2_btb_correct\000branch\000L2 BTB Correction\000e= vent=3D0x8b\000\00000\000\000\000\000\000" +/* offset=3D1275 */ "l3_cache_rd\000cache\000L3 cache access, read\000even= t=3D0x40\000\00000\000\000\000\000Attributable Level 3 cache access, read\0= 00" +/* offset=3D1373 */ "segment_reg_loads.any\000other\000Number of segment r= egister loads\000event=3D6,period=3D200000,umask=3D0x80\000\00000\000\000\0= 00\000\000" +/* offset=3D1475 */ "dispatch_blocked.any\000other\000Memory cluster signa= ls to block micro-op dispatch for any reason\000event=3D9,period=3D200000,u= mask=3D0x20\000\00000\000\000\000\000\000" +/* offset=3D1608 */ "eist_trans\000other\000Number of Enhanced Intel Speed= Step(R) Technology (EIST) transitions\000event=3D0x3a,period=3D200000\000\0= 0000\000\000\000\000\000" +/* offset=3D1726 */ "hisi_sccl,ddrc\000" +/* offset=3D1741 */ "uncore_hisi_ddrc.flux_wcmd\000uncore\000DDRC write co= mmands\000event=3D2\000\00000\000\000\000\000DDRC write commands\000" +/* offset=3D1830 */ "uncore_cbox\000" +/* offset=3D1842 */ "unc_cbo_xsnp_response.miss_eviction\000uncore\000A cr= oss-core snoop resulted from L3 Eviction which misses in some processor cor= e\000event=3D0x22,umask=3D0x81\000\00000\000\000\000\000A cross-core snoop = resulted from L3 Eviction which misses in some processor core\000" +/* offset=3D2076 */ "event-hyphen\000uncore\000UNC_CBO_HYPHEN\000event=3D0= xe0\000\00000\000\000\000\000UNC_CBO_HYPHEN\000" +/* offset=3D2144 */ "event-two-hyph\000uncore\000UNC_CBO_TWO_HYPH\000event= =3D0xc0\000\00000\000\000\000\000UNC_CBO_TWO_HYPH\000" +/* offset=3D2218 */ "hisi_sccl,l3c\000" +/* offset=3D2232 */ "uncore_hisi_l3c.rd_hit_cpipe\000uncore\000Total read = hits\000event=3D7\000\00000\000\000\000\000Total read hits\000" +/* offset=3D2315 */ "uncore_imc_free_running\000" +/* offset=3D2339 */ "uncore_imc_free_running.cache_miss\000uncore\000Total= cache misses\000event=3D0x12\000\00000\000\000\000\000Total cache misses\0= 00" +/* offset=3D2437 */ "uncore_imc\000" +/* offset=3D2448 */ "uncore_imc.cache_hits\000uncore\000Total cache hits\0= 00event=3D0x34\000\00000\000\000\000\000Total cache hits\000" +/* offset=3D2529 */ "uncore_sys_ddr_pmu\000" +/* offset=3D2548 */ "sys_ddr_pmu.write_cycles\000uncore\000ddr write-cycle= s event\000event=3D0x2b\000v8\00000\000\000\000\000\000" +/* offset=3D2624 */ "uncore_sys_ccn_pmu\000" +/* offset=3D2643 */ "sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycles = event\000config=3D0x2c\0000x01\00000\000\000\000\000\000" +/* offset=3D2720 */ "uncore_sys_cmn_pmu\000" +/* offset=3D2739 */ "sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts total = cache misses in first lookup result (high priority)\000eventid=3D1,type=3D5= \000(434|436|43c|43a).*\00000\000\000\000\000\000" +/* offset=3D2882 */ "CPI\000\0001 / IPC\000\000\000\000\000\000\000\00000" +/* offset=3D2904 */ "IPC\000group1\000inst_retired.any / cpu_clk_unhalted.= thread\000\000\000\000\000\000\000\00000" +/* offset=3D2967 */ "Frontend_Bound_SMT\000\000idq_uops_not_delivered.core= / (4 * (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_act= ive / cpu_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000" +/* offset=3D3133 */ "dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_re= tired.any\000\000\000\000\000\000\000\00000" +/* offset=3D3197 */ "icache_miss_cycles\000\000l1i\\-loads\\-misses / inst= _retired.any\000\000\000\000\000\000\000\00000" +/* offset=3D3264 */ "cache_miss_cycles\000group1\000dcache_miss_cpi + icac= he_miss_cycles\000\000\000\000\000\000\000\00000" +/* offset=3D3335 */ "DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit= + l2_rqsts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000" +/* offset=3D3429 */ "DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_dat= a_rd - l2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_mi= ss\000\000\000\000\000\000\000\00000" +/* offset=3D3563 */ "DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_A= ll_Miss\000\000\000\000\000\000\000\00000" +/* offset=3D3627 */ "DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCa= che_L2_All)\000\000\000\000\000\000\000\00000" +/* offset=3D3695 */ "DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, D= Cache_L2_All)\000\000\000\000\000\000\000\00000" +/* offset=3D3765 */ "M1\000\000ipc + M2\000\000\000\000\000\000\000\00000" +/* offset=3D3787 */ "M2\000\000ipc + M1\000\000\000\000\000\000\000\00000" +/* offset=3D3809 */ "M3\000\0001 / M3\000\000\000\000\000\000\000\00000" +/* offset=3D3829 */ "L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 /= duration_time\000\000\000\000\000\000\000\00000" ; =20 static const struct compact_pmu_event pmu_events__common_tool[] =3D { -{ 5 }, /* duration_time\000tool\000Wall clock interval time in nanoseconds= \000config=3D1\000\00000\000\000 */ -{ 210 }, /* has_pmem\000tool\0001 if persistent memory installed otherwise= 0\000config=3D4\000\00000\000\000 */ -{ 283 }, /* num_cores\000tool\000Number of cores. A core consists of 1 or = more thread, with each thread being associated with a logical Linux CPU\000= config=3D5\000\00000\000\000 */ -{ 425 }, /* num_cpus\000tool\000Number of logical Linux CPUs. There may be= multiple such CPUs on a core\000config=3D6\000\00000\000\000 */ -{ 525 }, /* num_cpus_online\000tool\000Number of online logical Linux CPUs= . There may be multiple such CPUs on a core\000config=3D7\000\00000\000\000= */ -{ 639 }, /* num_dies\000tool\000Number of dies. Each die has 1 or more cor= es\000config=3D8\000\00000\000\000 */ -{ 712 }, /* num_packages\000tool\000Number of packages. Each package has 1= or more die\000config=3D9\000\00000\000\000 */ -{ 795 }, /* slots\000tool\000Number of functional units that in parallel c= an execute parts of an instruction\000config=3D0xa\000\00000\000\000 */ -{ 902 }, /* smt_on\000tool\0001 if simultaneous multithreading (aka hypert= hreading) is enable otherwise 0\000config=3D0xb\000\00000\000\000 */ -{ 145 }, /* system_time\000tool\000System/kernel time in nanoseconds\000co= nfig=3D3\000\00000\000\000 */ -{ 1006 }, /* system_tsc_freq\000tool\000The amount a Time Stamp Counter (T= SC) increases per second\000config=3D0xc\000\00000\000\000 */ -{ 78 }, /* user_time\000tool\000User (non-kernel) time in nanoseconds\000c= onfig=3D2\000\00000\000\000 */ +{ 5 }, /* duration_time\000tool\000Wall clock interval time in nanoseconds= \000config=3D1\000\00000\000\000\000\000\000 */ +{ 219 }, /* has_pmem\000tool\0001 if persistent memory installed otherwise= 0\000config=3D4\000\00000\000\000\000\000\000 */ +{ 295 }, /* num_cores\000tool\000Number of cores. A core consists of 1 or = more thread, with each thread being associated with a logical Linux CPU\000= config=3D5\000\00000\000\000\000\000\000 */ +{ 440 }, /* num_cpus\000tool\000Number of logical Linux CPUs. There may be= multiple such CPUs on a core\000config=3D6\000\00000\000\000\000\000\000 */ +{ 543 }, /* num_cpus_online\000tool\000Number of online logical Linux CPUs= . There may be multiple such CPUs on a core\000config=3D7\000\00000\000\000= \000\000\000 */ +{ 660 }, /* num_dies\000tool\000Number of dies. Each die has 1 or more cor= es\000config=3D8\000\00000\000\000\000\000\000 */ +{ 736 }, /* num_packages\000tool\000Number of packages. Each package has 1= or more die\000config=3D9\000\00000\000\000\000\000\000 */ +{ 822 }, /* slots\000tool\000Number of functional units that in parallel c= an execute parts of an instruction\000config=3D0xa\000\00000\000\000\000\00= 0\000 */ +{ 932 }, /* smt_on\000tool\0001 if simultaneous multithreading (aka hypert= hreading) is enable otherwise 0\000config=3D0xb\000\00000\000\000\000\000\0= 00 */ +{ 151 }, /* system_time\000tool\000System/kernel time in nanoseconds\000co= nfig=3D3\000\00000\000\000\000\000\000 */ +{ 1039 }, /* system_tsc_freq\000tool\000The amount a Time Stamp Counter (T= SC) increases per second\000config=3D0xc\000\00000\000\000\000\000\000 */ +{ 81 }, /* user_time\000tool\000User (non-kernel) time in nanoseconds\000c= onfig=3D2\000\00000\000\000\000\000\000 */ =20 }; =20 @@ -99,29 +99,29 @@ const struct pmu_table_entry pmu_events__common[] =3D { }; =20 static const struct compact_pmu_event pmu_events__test_soc_cpu_default_cor= e[] =3D { -{ 1115 }, /* bp_l1_btb_correct\000branch\000L1 BTB Correction\000event=3D0= x8a\000\00000\000\000 */ -{ 1174 }, /* bp_l2_btb_correct\000branch\000L2 BTB Correction\000event=3D0= x8b\000\00000\000\000 */ -{ 1427 }, /* dispatch_blocked.any\000other\000Memory cluster signals to bl= ock micro-op dispatch for any reason\000event=3D9,period=3D200000,umask=3D0= x20\000\00000\000\000 */ -{ 1557 }, /* eist_trans\000other\000Number of Enhanced Intel SpeedStep(R) = Technology (EIST) transitions\000event=3D0x3a,period=3D200000\000\00000\000= \000 */ -{ 1233 }, /* l3_cache_rd\000cache\000L3 cache access, read\000event=3D0x40= \000\00000\000Attributable Level 3 cache access, read\000 */ -{ 1328 }, /* segment_reg_loads.any\000other\000Number of segment register = loads\000event=3D6,period=3D200000,umask=3D0x80\000\00000\000\000 */ +{ 1151 }, /* bp_l1_btb_correct\000branch\000L1 BTB Correction\000event=3D0= x8a\000\00000\000\000\000\000\000 */ +{ 1213 }, /* bp_l2_btb_correct\000branch\000L2 BTB Correction\000event=3D0= x8b\000\00000\000\000\000\000\000 */ +{ 1475 }, /* dispatch_blocked.any\000other\000Memory cluster signals to bl= ock micro-op dispatch for any reason\000event=3D9,period=3D200000,umask=3D0= x20\000\00000\000\000\000\000\000 */ +{ 1608 }, /* eist_trans\000other\000Number of Enhanced Intel SpeedStep(R) = Technology (EIST) transitions\000event=3D0x3a,period=3D200000\000\00000\000= \000\000\000\000 */ +{ 1275 }, /* l3_cache_rd\000cache\000L3 cache access, read\000event=3D0x40= \000\00000\000\000\000\000Attributable Level 3 cache access, read\000 */ +{ 1373 }, /* segment_reg_loads.any\000other\000Number of segment register = loads\000event=3D6,period=3D200000,umask=3D0x80\000\00000\000\000\000\000\0= 00 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_hisi_sccl_d= drc[] =3D { -{ 1687 }, /* uncore_hisi_ddrc.flux_wcmd\000uncore\000DDRC write commands\0= 00event=3D2\000\00000\000DDRC write commands\000 */ +{ 1741 }, /* uncore_hisi_ddrc.flux_wcmd\000uncore\000DDRC write commands\0= 00event=3D2\000\00000\000\000\000\000DDRC write commands\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_hisi_sccl_l= 3c[] =3D { -{ 2166 }, /* uncore_hisi_l3c.rd_hit_cpipe\000uncore\000Total read hits\000= event=3D7\000\00000\000Total read hits\000 */ +{ 2232 }, /* uncore_hisi_l3c.rd_hit_cpipe\000uncore\000Total read hits\000= event=3D7\000\00000\000\000\000\000Total read hits\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_uncore_cbox= [] =3D { -{ 2016 }, /* event-hyphen\000uncore\000UNC_CBO_HYPHEN\000event=3D0xe0\000\= 00000\000UNC_CBO_HYPHEN\000 */ -{ 2081 }, /* event-two-hyph\000uncore\000UNC_CBO_TWO_HYPH\000event=3D0xc0\= 000\00000\000UNC_CBO_TWO_HYPH\000 */ -{ 1785 }, /* unc_cbo_xsnp_response.miss_eviction\000uncore\000A cross-core= snoop resulted from L3 Eviction which misses in some processor core\000eve= nt=3D0x22,umask=3D0x81\000\00000\000A cross-core snoop resulted from L3 Evi= ction which misses in some processor core\000 */ +{ 2076 }, /* event-hyphen\000uncore\000UNC_CBO_HYPHEN\000event=3D0xe0\000\= 00000\000\000\000\000UNC_CBO_HYPHEN\000 */ +{ 2144 }, /* event-two-hyph\000uncore\000UNC_CBO_TWO_HYPH\000event=3D0xc0\= 000\00000\000\000\000\000UNC_CBO_TWO_HYPH\000 */ +{ 1842 }, /* unc_cbo_xsnp_response.miss_eviction\000uncore\000A cross-core= snoop resulted from L3 Eviction which misses in some processor core\000eve= nt=3D0x22,umask=3D0x81\000\00000\000\000\000\000A cross-core snoop resulted= from L3 Eviction which misses in some processor core\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_uncore_imc[= ] =3D { -{ 2376 }, /* uncore_imc.cache_hits\000uncore\000Total cache hits\000event= =3D0x34\000\00000\000Total cache hits\000 */ +{ 2448 }, /* uncore_imc.cache_hits\000uncore\000Total cache hits\000event= =3D0x34\000\00000\000\000\000\000Total cache hits\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_cpu_uncore_imc_= free_running[] =3D { -{ 2270 }, /* uncore_imc_free_running.cache_miss\000uncore\000Total cache m= isses\000event=3D0x12\000\00000\000Total cache misses\000 */ +{ 2339 }, /* uncore_imc_free_running.cache_miss\000uncore\000Total cache m= isses\000event=3D0x12\000\00000\000\000\000\000Total cache misses\000 */ =20 }; =20 @@ -129,51 +129,51 @@ const struct pmu_table_entry pmu_events__test_soc_cpu= [] =3D { { .entries =3D pmu_events__test_soc_cpu_default_core, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_default_core), - .pmu_name =3D { 1102 /* default_core\000 */ }, + .pmu_name =3D { 1138 /* default_core\000 */ }, }, { .entries =3D pmu_events__test_soc_cpu_hisi_sccl_ddrc, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_hisi_sccl_ddrc), - .pmu_name =3D { 1672 /* hisi_sccl,ddrc\000 */ }, + .pmu_name =3D { 1726 /* hisi_sccl,ddrc\000 */ }, }, { .entries =3D pmu_events__test_soc_cpu_hisi_sccl_l3c, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_hisi_sccl_l3c), - .pmu_name =3D { 2152 /* hisi_sccl,l3c\000 */ }, + .pmu_name =3D { 2218 /* hisi_sccl,l3c\000 */ }, }, { .entries =3D pmu_events__test_soc_cpu_uncore_cbox, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_uncore_cbox), - .pmu_name =3D { 1773 /* uncore_cbox\000 */ }, + .pmu_name =3D { 1830 /* uncore_cbox\000 */ }, }, { .entries =3D pmu_events__test_soc_cpu_uncore_imc, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_uncore_imc), - .pmu_name =3D { 2365 /* uncore_imc\000 */ }, + .pmu_name =3D { 2437 /* uncore_imc\000 */ }, }, { .entries =3D pmu_events__test_soc_cpu_uncore_imc_free_running, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_cpu_uncore_imc_free_= running), - .pmu_name =3D { 2246 /* uncore_imc_free_running\000 */ }, + .pmu_name =3D { 2315 /* uncore_imc_free_running\000 */ }, }, }; =20 static const struct compact_pmu_event pmu_metrics__test_soc_cpu_default_co= re[] =3D { -{ 2798 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\00000 */ -{ 3479 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Miss\= 000\000\000\000\000\000\000\00000 */ -{ 3251 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_rq= sts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000 */ -{ 3345 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd - l= 2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000\0= 00\000\000\000\000\000\00000 */ -{ 3543 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2_A= ll)\000\000\000\000\000\000\000\00000 */ -{ 3611 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_L2= _All)\000\000\000\000\000\000\000\00000 */ -{ 2883 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 * = (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / cp= u_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000 */ -{ 2820 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread\0= 00\000\000\000\000\000\000\00000 */ -{ 3745 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / duratio= n_time\000\000\000\000\000\000\000\00000 */ -{ 3681 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\00000 */ -{ 3703 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\00000 */ -{ 3725 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\00000 */ -{ 3180 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_miss_= cycles\000\000\000\000\000\000\000\00000 */ -{ 3049 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.an= y\000\000\000\000\000\000\000\00000 */ -{ 3113 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retired= .any\000\000\000\000\000\000\000\00000 */ +{ 2882 }, /* CPI\000\0001 / IPC\000\000\000\000\000\000\000\00000 */ +{ 3563 }, /* DCache_L2_All\000\000DCache_L2_All_Hits + DCache_L2_All_Miss\= 000\000\000\000\000\000\000\00000 */ +{ 3335 }, /* DCache_L2_All_Hits\000\000l2_rqsts.demand_data_rd_hit + l2_rq= sts.pf_hit + l2_rqsts.rfo_hit\000\000\000\000\000\000\000\00000 */ +{ 3429 }, /* DCache_L2_All_Miss\000\000max(l2_rqsts.all_demand_data_rd - l= 2_rqsts.demand_data_rd_hit, 0) + l2_rqsts.pf_miss + l2_rqsts.rfo_miss\000\0= 00\000\000\000\000\000\00000 */ +{ 3627 }, /* DCache_L2_Hits\000\000d_ratio(DCache_L2_All_Hits, DCache_L2_A= ll)\000\000\000\000\000\000\000\00000 */ +{ 3695 }, /* DCache_L2_Misses\000\000d_ratio(DCache_L2_All_Miss, DCache_L2= _All)\000\000\000\000\000\000\000\00000 */ +{ 2967 }, /* Frontend_Bound_SMT\000\000idq_uops_not_delivered.core / (4 * = (cpu_clk_unhalted.thread / 2 * (1 + cpu_clk_unhalted.one_thread_active / cp= u_clk_unhalted.ref_xclk)))\000\000\000\000\000\000\000\00000 */ +{ 2904 }, /* IPC\000group1\000inst_retired.any / cpu_clk_unhalted.thread\0= 00\000\000\000\000\000\000\00000 */ +{ 3829 }, /* L1D_Cache_Fill_BW\000\00064 * l1d.replacement / 1e9 / duratio= n_time\000\000\000\000\000\000\000\00000 */ +{ 3765 }, /* M1\000\000ipc + M2\000\000\000\000\000\000\000\00000 */ +{ 3787 }, /* M2\000\000ipc + M1\000\000\000\000\000\000\000\00000 */ +{ 3809 }, /* M3\000\0001 / M3\000\000\000\000\000\000\000\00000 */ +{ 3264 }, /* cache_miss_cycles\000group1\000dcache_miss_cpi + icache_miss_= cycles\000\000\000\000\000\000\000\00000 */ +{ 3133 }, /* dcache_miss_cpi\000\000l1d\\-loads\\-misses / inst_retired.an= y\000\000\000\000\000\000\000\00000 */ +{ 3197 }, /* icache_miss_cycles\000\000l1i\\-loads\\-misses / inst_retired= .any\000\000\000\000\000\000\000\00000 */ =20 }; =20 @@ -181,18 +181,18 @@ const struct pmu_table_entry pmu_metrics__test_soc_cp= u[] =3D { { .entries =3D pmu_metrics__test_soc_cpu_default_core, .num_entries =3D ARRAY_SIZE(pmu_metrics__test_soc_cpu_default_core), - .pmu_name =3D { 1102 /* default_core\000 */ }, + .pmu_name =3D { 1138 /* default_core\000 */ }, }, }; =20 static const struct compact_pmu_event pmu_events__test_soc_sys_uncore_sys_= ccn_pmu[] =3D { -{ 2565 }, /* sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycles event\00= 0config=3D0x2c\0000x01\00000\000\000 */ +{ 2643 }, /* sys_ccn_pmu.read_cycles\000uncore\000ccn read-cycles event\00= 0config=3D0x2c\0000x01\00000\000\000\000\000\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_sys_uncore_sys_= cmn_pmu[] =3D { -{ 2658 }, /* sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts total cache mi= sses in first lookup result (high priority)\000eventid=3D1,type=3D5\000(434= |436|43c|43a).*\00000\000\000 */ +{ 2739 }, /* sys_cmn_pmu.hnf_cache_miss\000uncore\000Counts total cache mi= sses in first lookup result (high priority)\000eventid=3D1,type=3D5\000(434= |436|43c|43a).*\00000\000\000\000\000\000 */ }; static const struct compact_pmu_event pmu_events__test_soc_sys_uncore_sys_= ddr_pmu[] =3D { -{ 2473 }, /* sys_ddr_pmu.write_cycles\000uncore\000ddr write-cycles event\= 000event=3D0x2b\000v8\00000\000\000 */ +{ 2548 }, /* sys_ddr_pmu.write_cycles\000uncore\000ddr write-cycles event\= 000event=3D0x2b\000v8\00000\000\000\000\000\000 */ =20 }; =20 @@ -200,17 +200,17 @@ const struct pmu_table_entry pmu_events__test_soc_sys= [] =3D { { .entries =3D pmu_events__test_soc_sys_uncore_sys_ccn_pmu, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_sys_uncore_sys_ccn_p= mu), - .pmu_name =3D { 2546 /* uncore_sys_ccn_pmu\000 */ }, + .pmu_name =3D { 2624 /* uncore_sys_ccn_pmu\000 */ }, }, { .entries =3D pmu_events__test_soc_sys_uncore_sys_cmn_pmu, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_sys_uncore_sys_cmn_p= mu), - .pmu_name =3D { 2639 /* uncore_sys_cmn_pmu\000 */ }, + .pmu_name =3D { 2720 /* uncore_sys_cmn_pmu\000 */ }, }, { .entries =3D pmu_events__test_soc_sys_uncore_sys_ddr_pmu, .num_entries =3D ARRAY_SIZE(pmu_events__test_soc_sys_uncore_sys_ddr_p= mu), - .pmu_name =3D { 2454 /* uncore_sys_ddr_pmu\000 */ }, + .pmu_name =3D { 2529 /* uncore_sys_ddr_pmu\000 */ }, }, }; =20 @@ -316,6 +316,12 @@ static void decompress_event(int offset, struct pmu_ev= ent *pe) p++; pe->unit =3D (*p =3D=3D '\0' ? NULL : p); while (*p++); + pe->retirement_latency_mean =3D (*p =3D=3D '\0' ? NULL : p); + while (*p++); + pe->retirement_latency_min =3D (*p =3D=3D '\0' ? NULL : p); + while (*p++); + pe->retirement_latency_max =3D (*p =3D=3D '\0' ? NULL : p); + while (*p++); pe->long_desc =3D (*p =3D=3D '\0' ? NULL : p); } =20 diff --git a/tools/perf/pmu-events/jevents.py b/tools/perf/pmu-events/jeven= ts.py index 7499a35bfadd..e3a55486c08e 100755 --- a/tools/perf/pmu-events/jevents.py +++ b/tools/perf/pmu-events/jevents.py @@ -47,6 +47,9 @@ _json_event_attributes =3D [ 'event', # Short things in alphabetical order. 'compat', 'deprecated', 'perpkg', 'unit', + # Retirement latency specific to Intel granite rapids currently. + 'retirement_latency_mean', 'retirement_latency_min', + 'retirement_latency_max', # Longer things (the last won't be iterated over during decompress). 'long_desc' ] @@ -341,6 +344,9 @@ class JsonEvent: self.perpkg =3D jd.get('PerPkg') self.aggr_mode =3D convert_aggr_mode(jd.get('AggregationMode')) self.deprecated =3D jd.get('Deprecated') + self.retirement_latency_mean =3D jd.get('RetirementLatencyMean') + self.retirement_latency_min =3D jd.get('RetirementLatencyMin') + self.retirement_latency_max =3D jd.get('RetirementLatencyMax') self.metric_name =3D jd.get('MetricName') self.metric_group =3D jd.get('MetricGroup') self.metricgroup_no_group =3D jd.get('MetricgroupNoGroup') diff --git a/tools/perf/pmu-events/pmu-events.h b/tools/perf/pmu-events/pmu= -events.h index 675562e6f770..a95fee561622 100644 --- a/tools/perf/pmu-events/pmu-events.h +++ b/tools/perf/pmu-events/pmu-events.h @@ -47,6 +47,9 @@ struct pmu_event { const char *long_desc; const char *pmu; const char *unit; + const char *retirement_latency_mean; + const char *retirement_latency_min; + const char *retirement_latency_max; bool perpkg; bool deprecated; }; diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index aae431d63d64..42dcadfef8ce 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -177,6 +177,12 @@ struct evsel { /* For tool events */ /* Beginning time subtracted when the counter is read. */ union { + /* Defaults for retirement latency events. */ + struct _retirement_latency { + double mean; + double min; + double max; + } retirement_latency; /* duration_time is a single global time. */ __u64 start_time; /* diff --git a/tools/perf/util/intel-tpebs.c b/tools/perf/util/intel-tpebs.c index 6b00bd5b0af1..467d990d09ce 100644 --- a/tools/perf/util/intel-tpebs.c +++ b/tools/perf/util/intel-tpebs.c @@ -514,27 +514,49 @@ int evsel__tpebs_read(struct evsel *evsel, int cpu_ma= p_idx, int thread) * process. Allow the sample reader a chance to read by releasing and * reacquiring the lock. */ - if (&t->nd =3D=3D tpebs_results.next) { + if (t && &t->nd =3D=3D tpebs_results.next) { ret =3D tpebs_send_record_cmd(EVLIST_CTL_CMD_PING_TAG); mutex_unlock(tpebs_mtx_get()); if (ret) return ret; mutex_lock(tpebs_mtx_get()); } - switch (tpebs_mode) { - case TPEBS_MODE__MIN: - val =3D rint(t->stats.min); - break; - case TPEBS_MODE__MAX: - val =3D rint(t->stats.max); - break; - case TPEBS_MODE__LAST: - val =3D t->last; - break; - default: - case TPEBS_MODE__MEAN: - val =3D rint(t->stats.mean); - break; + if (t =3D=3D NULL || t->stats.n =3D=3D 0) { + /* No sample data, use default. */ + if (tpebs_recording) { + pr_warning_once( + "Using precomputed retirement latency data as no samples\n"); + } + val =3D 0; + switch (tpebs_mode) { + case TPEBS_MODE__MIN: + val =3D rint(evsel->retirement_latency.min); + break; + case TPEBS_MODE__MAX: + val =3D rint(evsel->retirement_latency.max); + break; + default: + case TPEBS_MODE__LAST: + case TPEBS_MODE__MEAN: + val =3D rint(evsel->retirement_latency.mean); + break; + } + } else { + switch (tpebs_mode) { + case TPEBS_MODE__MIN: + val =3D t->stats.min; + break; + case TPEBS_MODE__MAX: + val =3D t->stats.max; + break; + case TPEBS_MODE__LAST: + val =3D t->last; + break; + default: + case TPEBS_MODE__MEAN: + val =3D rint(t->stats.mean); + break; + } } mutex_unlock(tpebs_mtx_get()); =20 diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index 5152fd5a6ead..89708d1769c8 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c @@ -1539,6 +1539,10 @@ static int parse_events_add_pmu(struct parse_events_= state *parse_state, evsel->scale =3D info.scale; evsel->per_pkg =3D info.per_pkg; evsel->snapshot =3D info.snapshot; + evsel->retirement_latency.mean =3D info.retirement_latency_mean; + evsel->retirement_latency.min =3D info.retirement_latency_min; + evsel->retirement_latency.max =3D info.retirement_latency_max; + return 0; } =20 diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index b7ebac5ab1d1..bbb906bb2159 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -77,6 +77,12 @@ struct perf_pmu_alias { char unit[UNIT_MAX_LEN+1]; /** @scale: Value to scale read counter values by. */ double scale; + /** @retirement_latency_mean: Value to be given for unsampled retirement = latency mean. */ + double retirement_latency_mean; + /** @retirement_latency_min: Value to be given for unsampled retirement l= atency min. */ + double retirement_latency_min; + /** @retirement_latency_max: Value to be given for unsampled retirement l= atency max. */ + double retirement_latency_max; /** * @per_pkg: Does the file * /bus/event_source/devices//events/.per-pkg or @@ -257,7 +263,7 @@ static int pmu_format(struct perf_pmu *pmu, int dirfd, = const char *name, bool ea return 0; } =20 -int perf_pmu__convert_scale(const char *scale, char **end, double *sval) +static int parse_double(const char *scale, char **end, double *sval) { char *lc; int ret =3D 0; @@ -294,6 +300,11 @@ int perf_pmu__convert_scale(const char *scale, char **= end, double *sval) return ret; } =20 +int perf_pmu__convert_scale(const char *scale, char **end, double *sval) +{ + return parse_double(scale, end, sval); +} + static int perf_pmu__parse_scale(struct perf_pmu *pmu, struct perf_pmu_ali= as *alias) { struct stat st; @@ -525,6 +536,18 @@ static int update_alias(const struct pmu_event *pe, if (!ret) snprintf(data->alias->unit, sizeof(data->alias->unit), "%s", unit); } + if (!ret && pe->retirement_latency_mean) { + ret =3D parse_double(pe->retirement_latency_mean, NULL, + &data->alias->retirement_latency_mean); + } + if (!ret && pe->retirement_latency_min) { + ret =3D parse_double(pe->retirement_latency_min, NULL, + &data->alias->retirement_latency_min); + } + if (!ret && pe->retirement_latency_max) { + ret =3D parse_double(pe->retirement_latency_max, NULL, + &data->alias->retirement_latency_max); + } return ret; } =20 @@ -533,7 +556,7 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, co= nst char *name, const struct pmu_event *pe, enum event_source src) { struct perf_pmu_alias *alias; - int ret; + int ret =3D 0; const char *long_desc =3D NULL, *topic =3D NULL, *unit =3D NULL, *pmu_nam= e =3D NULL; bool deprecated =3D false, perpkg =3D false; =20 @@ -562,6 +585,24 @@ static int perf_pmu__new_alias(struct perf_pmu *pmu, c= onst char *name, alias->per_pkg =3D perpkg; alias->snapshot =3D false; alias->deprecated =3D deprecated; + alias->retirement_latency_mean =3D 0.0; + alias->retirement_latency_min =3D 0.0; + alias->retirement_latency_max =3D 0.0; + + if (!ret && pe && pe->retirement_latency_mean) { + ret =3D parse_double(pe->retirement_latency_mean, NULL, + &alias->retirement_latency_mean); + } + if (!ret && pe && pe->retirement_latency_min) { + ret =3D parse_double(pe->retirement_latency_min, NULL, + &alias->retirement_latency_min); + } + if (!ret && pe && pe->retirement_latency_max) { + ret =3D parse_double(pe->retirement_latency_max, NULL, + &alias->retirement_latency_max); + } + if (ret) + return ret; =20 ret =3D parse_events_terms(&alias->terms, val, val_fd); if (ret) { @@ -1678,6 +1719,9 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, struc= t parse_events_terms *head_ info->unit =3D NULL; info->scale =3D 0.0; info->snapshot =3D false; + info->retirement_latency_mean =3D 0.0; + info->retirement_latency_min =3D 0.0; + info->retirement_latency_max =3D 0.0; =20 if (perf_pmu__is_hwmon(pmu)) { ret =3D hwmon_pmu__check_alias(head_terms, info, err); @@ -1711,6 +1755,10 @@ int perf_pmu__check_alias(struct perf_pmu *pmu, stru= ct parse_events_terms *head_ if (term->alternate_hw_config) *alternate_hw_config =3D term->val.num; =20 + info->retirement_latency_mean =3D alias->retirement_latency_mean; + info->retirement_latency_min =3D alias->retirement_latency_min; + info->retirement_latency_max =3D alias->retirement_latency_max; + list_del_init(&term->list); parse_events_term__delete(term); } diff --git a/tools/perf/util/pmu.h b/tools/perf/util/pmu.h index b93014cc3670..13dd3511f504 100644 --- a/tools/perf/util/pmu.h +++ b/tools/perf/util/pmu.h @@ -194,6 +194,9 @@ struct perf_pmu { struct perf_pmu_info { const char *unit; double scale; + double retirement_latency_mean; + double retirement_latency_min; + double retirement_latency_max; bool per_pkg; bool snapshot; }; --=20 2.49.0.504.g3bcea36a83-goog From nobody Fri Dec 19 17:32:55 2025 Received: from mail-pl1-f201.google.com (mail-pl1-f201.google.com [209.85.214.201]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 39795210F4D for ; Wed, 9 Apr 2025 06:11:23 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.214.201 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179084; cv=none; b=izxHnfIiEncObjh46yZkWY6qVmOMNz1kISZWW8NF9650wrNpAdIDgexi7eNmFUiaUNJhAvwDvSJlkxRnaBqmfjzCkF9fyEk6NFZ1koDc2Lmb9rXC6vECx4S31oTX+OsM5KrnlEa01pIr8n5FBiXEEK1l1y4JzGJ0w0x5u0TrQvU= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1744179084; c=relaxed/simple; bh=4/dJlTWkcf5FOf5+oh0Up7fh8r5QO82sMonPjvpz42s=; h=Date:In-Reply-To:Mime-Version:References:Message-ID:Subject:From: To:Content-Type; b=b3echBuGrJOXNF1rz29wgF7+eCAWNBKuswGlCSPnb5WWhsR338vE6+GuSVtqh0gn04EyLjh9HVOo3lityaGXvvBTYEHZsRR2rXQRsrQBJSfR+j3DVmZQ99922ZuI6OA4qSKl1obb+b8S9XSbz2L0k17mGTrp1NfKzPW0HB6+wmo= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b=q9HfJtMr; arc=none smtp.client-ip=209.85.214.201 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=reject dis=none) header.from=google.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=flex--irogers.bounces.google.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=google.com header.i=@google.com header.b="q9HfJtMr" Received: by mail-pl1-f201.google.com with SMTP id d9443c01a7336-22403329f9eso53664155ad.3 for ; Tue, 08 Apr 2025 23:11:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20230601; t=1744179083; x=1744783883; darn=vger.kernel.org; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :from:to:cc:subject:date:message-id:reply-to; bh=AtCRHQR2grinPcYBxNOrxZNvf1a5RF1zR0pJL1Q63Gw=; b=q9HfJtMrwhKKv9ml7ofKLvmRyApi2OlKDB9l2zT28ORtwuQIAQOjzQCg1F9jUCIEFb nc0Hw7QxmPZR0igWkfv1FpIkuuEx9DS4Wi6tpC4U+bJZ8UrO3yYkQbbPQOP6ItQKR+Ef VHFYSs2b7QMY0X8QShA9coggzbIfm8GuQvz+Du7nNq3ZpCHfAYnIxjXOZ/EW8AGU60zR WQZxteMH8CVk7vxDShjst1DImjVNwIOKGJl0cKdQRNkgROEPX2poi6LYXcrTztP2C3li 7Hw96XgFteT55uR+i7OyWyIAK3LmK6uQ+I+xOpdpC2RfqjPMcID0vQb3J0y8UtBmUyZ2 ybFQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1744179083; x=1744783883; h=to:from:subject:message-id:references:mime-version:in-reply-to:date :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=AtCRHQR2grinPcYBxNOrxZNvf1a5RF1zR0pJL1Q63Gw=; b=fC798AVsSYhDDZyTnTcTiU4myEkIMnaW8IpmWdg+ggE2cybnHbyUy3PeZwnXUriIPF VwjpbBFt0fWOKMW8QDrZBpvA9Lp9GkVD6CnJvpY2Bpbn3/BCsJjzf4LWOu9bReEuH5e+ o3gfnQTv0sHe3WZ0yI7P3/s/+6HGyEKvbDbjkLRKm9WUWZ9x1Lh9SaLj9synTWsVoun1 i2bB75zln+focEPFS8KIiRIJ+0hvs3KfoQrwl9um2HGGDEJKcoa7sIckstEcjVkFa+6a w4XMpYIEobXCaYHSiQW4UsER7Rwbn42dfiYiGDFhDZIthw2tWkvcq0GkrvNm0jv3kI/G 5A1w== X-Forwarded-Encrypted: i=1; AJvYcCV63zFdPaUvPBMDO57WgYiQiQMGOTf0kJ1EsZFHHqrdojDCnAwqkTY/3qKV2nr4NpjoCStILY0rCQQg83c=@vger.kernel.org X-Gm-Message-State: AOJu0YwlYj+wCh8M9vGYarzjuvCzh4xiaun5pbzZ9rn4bWFrM0TbQUwH 4zKkhosIn4bmUhNMUMBUl3pyhvT2cytwNwfl++7485tTfbfi1x2e9yWlgkl44pXnJHo7xeE6K/Y pmSSzQQ== X-Google-Smtp-Source: AGHT+IHYk+LFNBBiynPtVNovcETcZCxDxx0BUOk/LDRrrAx60CkktUGsfjUsusDYp1BB/HyawJ4Su1hVXzId X-Received: from plhn7.prod.google.com ([2002:a17:903:1107:b0:223:690d:fd84]) (user=irogers job=prod-delivery.src-stubby-dispatcher) by 2002:a17:903:1c1:b0:224:1ec0:8a16 with SMTP id d9443c01a7336-22ac29938f3mr25480675ad.21.1744179082762; Tue, 08 Apr 2025 23:11:22 -0700 (PDT) Date: Tue, 8 Apr 2025 23:10:43 -0700 In-Reply-To: <20250409061043.700792-1-irogers@google.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: Mime-Version: 1.0 References: <20250409061043.700792-1-irogers@google.com> X-Mailer: git-send-email 2.49.0.504.g3bcea36a83-goog Message-ID: <20250409061043.700792-17-irogers@google.com> Subject: [PATCH v4 16/16] perf record: Retirement latency cleanup in evsel__config From: Ian Rogers To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Kan Liang , Weilin Wang , James Clark , Xu Yang , John Garry , Howard Chu , Levi Yun , Dominique Martinet , linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" Perf record will fail with retirement latency events as the open doesn't do a perf_event_open system call. Use evsel__config to set up such events for recording by removing the flag and enabling sample weights - the sample weights containing the retirement latency. Signed-off-by: Ian Rogers Acked-by: Namhyung Kim Tested-by: Weilin Wang --- tools/perf/util/evsel.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tools/perf/util/evsel.c b/tools/perf/util/evsel.c index 661a07cbdb25..6a84893e3c58 100644 --- a/tools/perf/util/evsel.c +++ b/tools/perf/util/evsel.c @@ -1440,9 +1440,10 @@ void evsel__config(struct evsel *evsel, struct recor= d_opts *opts, attr->branch_sample_type =3D opts->branch_stack; } =20 - if (opts->sample_weight) + if (opts->sample_weight || evsel->retire_lat) { arch_evsel__set_sample_weight(evsel); - + evsel->retire_lat =3D false; + } attr->task =3D track; attr->mmap =3D track; attr->mmap2 =3D track && !perf_missing_features.mmap2; --=20 2.49.0.504.g3bcea36a83-goog