From: Arnaldo Carvalho de Melo <acme@kernel.org>
To: Ian Rogers <irogers@google.com>
Cc: Peter Zijlstra <peterz@infradead.org>,
Ingo Molnar <mingo@redhat.com>,
Namhyung Kim <namhyung@kernel.org>,
Mark Rutland <mark.rutland@arm.com>,
Alexander Shishkin <alexander.shishkin@linux.intel.com>,
Jiri Olsa <jolsa@kernel.org>,
Adrian Hunter <adrian.hunter@intel.com>,
Kan Liang <kan.liang@linux.intel.com>,
James Clark <james.clark@linaro.org>, Xu Yang <xu.yang_2@nxp.com>,
"Masami Hiramatsu (Google)" <mhiramat@kernel.org>,
Collin Funk <collin.funk1@gmail.com>,
Howard Chu <howardchu95@gmail.com>,
Weilin Wang <weilin.wang@intel.com>,
Andi Kleen <ak@linux.intel.com>,
"Dr. David Alan Gilbert" <linux@treblig.org>,
Thomas Richter <tmricht@linux.ibm.com>,
Tiezhu Yang <yangtiezhu@loongson.cn>,
Gautam Menghani <gautam@linux.ibm.com>,
Thomas Falcon <thomas.falcon@intel.com>,
Chun-Tse Shao <ctshao@google.com>,
linux-kernel@vger.kernel.org, linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v7 05/16] perf tp_pmu: Add event APIs
Date: Wed, 23 Jul 2025 15:57:44 -0300 [thread overview]
Message-ID: <aIEwqAGFvAuUtiah@x1> (raw)
In-Reply-To: <20250714164405.111477-6-irogers@google.com>
On Mon, Jul 14, 2025 at 09:43:53AM -0700, Ian Rogers wrote:
> Add event APIs for the tracepoint PMU allowing things like perf list
> to function using it. For perf list add the tracepoint format in the
> long description (shown with -v).
>
> Signed-off-by: Ian Rogers <irogers@google.com>
> ---
> tools/perf/util/pmu.c | 7 +++
> tools/perf/util/tp_pmu.c | 114 +++++++++++++++++++++++++++++++++++++++
> tools/perf/util/tp_pmu.h | 7 +++
> 3 files changed, 128 insertions(+)
>
> diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
> index b09b2ea2407a..dc05233e8232 100644
> --- a/tools/perf/util/pmu.c
> +++ b/tools/perf/util/pmu.c
> @@ -24,6 +24,7 @@
> #include "hwmon_pmu.h"
> #include "pmus.h"
> #include "tool_pmu.h"
> +#include "tp_pmu.h"
> #include <util/pmu-bison.h>
> #include <util/pmu-flex.h>
> #include "parse-events.h"
> @@ -1983,6 +1984,8 @@ bool perf_pmu__have_event(struct perf_pmu *pmu, const char *name)
> return false;
> if (perf_pmu__is_tool(pmu) && tool_pmu__skip_event(name))
> return false;
> + if (perf_pmu__is_tracepoint(pmu))
> + return tp_pmu__have_event(pmu, name);
> if (perf_pmu__is_hwmon(pmu))
> return hwmon_pmu__have_event(pmu, name);
> if (perf_pmu__is_drm(pmu))
> @@ -1998,6 +2001,8 @@ size_t perf_pmu__num_events(struct perf_pmu *pmu)
> {
> size_t nr;
>
> + if (perf_pmu__is_tracepoint(pmu))
> + return tp_pmu__num_events(pmu);
> if (perf_pmu__is_hwmon(pmu))
> return hwmon_pmu__num_events(pmu);
> if (perf_pmu__is_drm(pmu))
> @@ -2068,6 +2073,8 @@ int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,
> struct hashmap_entry *entry;
> size_t bkt;
>
> + if (perf_pmu__is_tracepoint(pmu))
> + return tp_pmu__for_each_event(pmu, state, cb);
> if (perf_pmu__is_hwmon(pmu))
> return hwmon_pmu__for_each_event(pmu, state, cb);
> if (perf_pmu__is_drm(pmu))
> diff --git a/tools/perf/util/tp_pmu.c b/tools/perf/util/tp_pmu.c
> index fd83164f8763..9d68a1da17f6 100644
> --- a/tools/perf/util/tp_pmu.c
> +++ b/tools/perf/util/tp_pmu.c
> @@ -1,5 +1,6 @@
> // SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
> #include "tp_pmu.h"
> +#include "pmus.h"
> #include <api/fs/fs.h>
> #include <api/fs/tracing_path.h>
> #include <api/io_dir.h>
> @@ -93,3 +94,116 @@ int tp_pmu__for_each_tp_sys(void *state, tp_sys_callback cb)
> close(events_dir.dirfd);
> return ret;
> }
> +
> +bool perf_pmu__is_tracepoint(const struct perf_pmu *pmu)
> +{
> + return pmu->type == PERF_TYPE_TRACEPOINT;
> +}
> +
> +struct for_each_event_args {
> + void *state;
> + pmu_event_callback cb;
> + const struct perf_pmu *pmu;
> +};
> +
> +static int for_each_event_cb(void *state, const char *sys_name, const char *evt_name)
> +{
> + struct for_each_event_args *args = state;
> + char name[2 * FILENAME_MAX + 2];
> + /* 16 possible hex digits and 22 other characters and \0. */
> + char encoding[16 + 22];
> + char *format = NULL;
> + size_t format_size;
> + struct pmu_event_info info = {
> + .pmu = args->pmu,
> + .pmu_name = args->pmu->name,
> + .event_type_desc = "Tracepoint event",
> + };
> + char *tp_dir = get_events_file(sys_name);
> + char path[PATH_MAX];
> + int id, err;
> +
> + if (!tp_dir)
> + return -1;
> +
> + scnprintf(path, sizeof(path), "%s/%s/id", tp_dir, evt_name);
> + err = filename__read_int(path, &id);
> + if (err == 0) {
> + snprintf(encoding, sizeof(encoding), "tracepoint/config=0x%x/", id);
> + info.encoding_desc = encoding;
> + }
> +
> + scnprintf(path, sizeof(path), "%s/%s/format", tp_dir, evt_name);
> + put_events_file(tp_dir);
> + err = filename__read_str(path, &format, &format_size);
> + if (err == 0) {
> + info.long_desc = format;
> + for (size_t i = 0 ; i < format_size; i++) {
> + /* Swap tabs to spaces due to some rendering issues. */
> + if (format[i] == '\t')
> + format[i] = ' ';
> + }
> + }
> + snprintf(name, sizeof(name), "%s:%s", sys_name, evt_name);
> + info.name = name;
> + err = args->cb(args->state, &info);
> + free(format);
> + return err;
> +}
> +
> +static int for_each_event_sys_cb(void *state, const char *sys_name)
> +{
> + return tp_pmu__for_each_tp_event(sys_name, state, for_each_event_cb);
> +}
> +
> +int tp_pmu__for_each_event(struct perf_pmu *pmu, void *state, pmu_event_callback cb)
> +{
> + struct for_each_event_args args = {
> + .state = state,
> + .cb = cb,
> + .pmu = pmu,
> + };
> +
> + return tp_pmu__for_each_tp_sys(&args, for_each_event_sys_cb);
> +}
> +
> +static int num_events_cb(void *state, const char *sys_name __maybe_unused,
> + const char *evt_name __maybe_unused)
> +{
> + size_t *count = state;
> +
> + (*count)++;
> + return 0;
> +}
> +
> +static int num_events_sys_cb(void *state, const char *sys_name)
> +{
> + return tp_pmu__for_each_tp_event(sys_name, state, num_events_cb);
> +}
> +
> +size_t tp_pmu__num_events(struct perf_pmu *pmu __maybe_unused)
> +{
> + size_t count = 0;
> +
> + tp_pmu__for_each_tp_sys(&count, num_events_sys_cb);
> + return count;
> +}
> +
> +bool tp_pmu__have_event(struct perf_pmu *pmu __maybe_unused, const char *name)
> +{
> + char *dup_name, *colon;
> + int id;
> +
> + if (strchr(name, ':') == NULL)
> + return false;
Nit:
colon = strchr(name, ':');
if (colon == NULL)
return false;
> +
> + dup_name = strdup(name);
> + if (!dup_name)
> + return false;
> +
> + colon = strchr(dup_name, ':');
colon = dup_name + (colon - name);
> + *colon = '\0';
> + id = tp_pmu__id(dup_name, colon + 1);
> + free(dup_name);
> + return id >= 0;
> +}
> diff --git a/tools/perf/util/tp_pmu.h b/tools/perf/util/tp_pmu.h
> index 49537303bd73..30456bd6943d 100644
> --- a/tools/perf/util/tp_pmu.h
> +++ b/tools/perf/util/tp_pmu.h
> @@ -2,6 +2,8 @@
> #ifndef __TP_PMU_H
> #define __TP_PMU_H
>
> +#include "pmu.h"
> +
> typedef int (*tp_sys_callback)(void *state, const char *sys_name);
> typedef int (*tp_event_callback)(void *state, const char *sys_name, const char *evt_name);
>
> @@ -9,4 +11,9 @@ int tp_pmu__id(const char *sys, const char *name);
> int tp_pmu__for_each_tp_event(const char *sys, void *state, tp_event_callback cb);
> int tp_pmu__for_each_tp_sys(void *state, tp_sys_callback cb);
>
> +bool perf_pmu__is_tracepoint(const struct perf_pmu *pmu);
> +int tp_pmu__for_each_event(struct perf_pmu *pmu, void *state, pmu_event_callback cb);
> +size_t tp_pmu__num_events(struct perf_pmu *pmu);
> +bool tp_pmu__have_event(struct perf_pmu *pmu, const char *name);
> +
> #endif /* __TP_PMU_H */
> --
> 2.50.0.727.gbf7dc18ff4-goog
>
next prev parent reply other threads:[~2025-07-23 18:57 UTC|newest]
Thread overview: 41+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-07-14 16:43 [PATCH v7 00/16] New perf ilist app Ian Rogers
2025-07-14 16:43 ` [PATCH v7 01/16] perf python: Add more exceptions on error paths Ian Rogers
2025-07-23 16:48 ` Arnaldo Carvalho de Melo
2025-07-23 18:12 ` Namhyung Kim
2025-07-23 18:21 ` Ian Rogers
2025-07-23 22:24 ` Ian Rogers
2025-07-14 16:43 ` [PATCH v7 02/16] perf jevents: Add common software event json Ian Rogers
2025-07-23 16:52 ` Arnaldo Carvalho de Melo
2025-07-23 18:24 ` Namhyung Kim
2025-07-23 22:34 ` Ian Rogers
2025-07-24 0:10 ` Namhyung Kim
2025-07-24 1:47 ` Ian Rogers
2025-07-24 16:58 ` Namhyung Kim
2025-07-14 16:43 ` [PATCH v7 03/16] perf parse-events: Remove non-json software events Ian Rogers
2025-07-24 0:20 ` Namhyung Kim
2025-07-14 16:43 ` [PATCH v7 04/16] perf tp_pmu: Factor existing tracepoint logic to new file Ian Rogers
2025-07-23 16:57 ` Arnaldo Carvalho de Melo
2025-07-14 16:43 ` [PATCH v7 05/16] perf tp_pmu: Add event APIs Ian Rogers
2025-07-23 18:57 ` Arnaldo Carvalho de Melo [this message]
2025-07-14 16:43 ` [PATCH v7 06/16] perf list: Remove tracepoint printing code Ian Rogers
2025-07-14 16:43 ` [PATCH v7 07/16] perf list: Skip ABI PMUs when printing pmu values Ian Rogers
2025-07-14 16:43 ` [PATCH v7 08/16] perf python: Improve the tracepoint function if no libtraceevent Ian Rogers
2025-07-14 16:43 ` [PATCH v7 09/16] perf python: Add basic PMU abstraction and pmus sequence Ian Rogers
2025-07-14 16:43 ` [PATCH v7 10/16] perf python: Add function returning dictionary of all events on a PMU Ian Rogers
2025-07-14 16:43 ` [PATCH v7 11/16] perf ilist: Add new python ilist command Ian Rogers
2025-07-21 7:32 ` Gautam Menghani
2025-07-21 13:41 ` Ian Rogers
2025-07-23 18:33 ` Falcon, Thomas
2025-07-23 21:33 ` Ian Rogers
2025-07-14 16:44 ` [PATCH v7 12/16] perf python: Add parse_metrics function Ian Rogers
2025-07-14 16:44 ` [PATCH v7 13/16] perf python: Add evlist metrics function Ian Rogers
2025-07-14 16:44 ` [PATCH v7 14/16] perf python: Add evlist compute_metric Ian Rogers
2025-07-14 16:44 ` [PATCH v7 15/16] perf python: Add metrics function Ian Rogers
2025-07-14 16:44 ` [PATCH v7 16/16] perf ilist: Add support for metrics Ian Rogers
2025-07-23 15:32 ` [PATCH v7 00/16] New perf ilist app Ian Rogers
2025-07-23 18:00 ` Namhyung Kim
2025-07-23 18:15 ` Ian Rogers
2025-07-23 19:08 ` Arnaldo Carvalho de Melo
2025-07-23 19:11 ` Arnaldo Carvalho de Melo
2025-07-23 19:24 ` Arnaldo Carvalho de Melo
2025-07-23 21:30 ` Ian Rogers
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aIEwqAGFvAuUtiah@x1 \
--to=acme@kernel.org \
--cc=adrian.hunter@intel.com \
--cc=ak@linux.intel.com \
--cc=alexander.shishkin@linux.intel.com \
--cc=collin.funk1@gmail.com \
--cc=ctshao@google.com \
--cc=gautam@linux.ibm.com \
--cc=howardchu95@gmail.com \
--cc=irogers@google.com \
--cc=james.clark@linaro.org \
--cc=jolsa@kernel.org \
--cc=kan.liang@linux.intel.com \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-perf-users@vger.kernel.org \
--cc=linux@treblig.org \
--cc=mark.rutland@arm.com \
--cc=mhiramat@kernel.org \
--cc=mingo@redhat.com \
--cc=namhyung@kernel.org \
--cc=peterz@infradead.org \
--cc=thomas.falcon@intel.com \
--cc=tmricht@linux.ibm.com \
--cc=weilin.wang@intel.com \
--cc=xu.yang_2@nxp.com \
--cc=yangtiezhu@loongson.cn \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).