From: sashiko-bot@kernel.org
To: "Ian Rogers" <irogers@google.com>, linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v1 28/41] perf pmu: Add perf_pmu__probe() for basic open, counting, and sampling
Date: Wed, 04 Nov 2026 05:39:09 +0000 [thread overview]
Message-ID: <sashiko-outbox-196677@kernel.org> (raw)
In-Reply-To: <20261103234502.1008382-29-irogers@google.com>
Thank you for your contribution! Sashiko AI review found 2 potential issue(s) to consider:
- [Medium] perf pmu: collect_probe_candidate_cb() stops on unopenable ftrace event
- [Medium] perf pmu: raw attr fallback in __perf_pmu__probe() clobbers open_err
--
commit 006ae863dd0267ee072ef7ac0650c59a05a689b6
Author: Ian Rogers <irogers@google.com>
perf pmu: Add perf_pmu__probe() for basic open, counting, and sampling
This commit adds struct perf_pmu::probed and perf_pmu__probe() to actively
probe a live PMU via perf_event_open() on a worker thread pinned to an
online CPU associated with the PMU. It selects a representative probe event
across PMU types and records whether opening, counting, and sampling are
supported.
> diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c
> index fecfe791bf8ae..9033bada9f472 100644
> --- a/tools/perf/util/pmu.c
> +++ b/tools/perf/util/pmu.c
[ ... ]
> +static int collect_probe_candidate_cb(void *vstate, struct pmu_event_info *info)
> +{
> + struct probe_candidates *cands = vstate;
> + char buf[512];
> +
> + if (info->deprecated)
> + return 0;
> + if (info->str && strstr(info->str, "=?"))
> + return 0;
> + if (!info->name)
> + return 0;
> +
> + if (info->pmu && info->pmu->type == PERF_TYPE_TRACEPOINT) {
> + probe_candidates__add(cands, info->name);
> + return 1;
> + } else if (strchr(info->name, '/')) {
[Severity: Medium]
When __perf_pmu__probe() cannot open any of the three hardcoded tracepoints
in fast_tps and falls back to perf_pmu__for_each_event(),
collect_probe_candidate_cb() adds only the very first enumerated tracepoint
and returns 1 to stop iteration.
Because the kernel registers __start_ftrace_events first in tracefs and
tp_pmu__for_each_tp_sys() reads /sys/kernel/tracing/events in directory
order, the first enumerated event is typically an internal ftrace:* event
(such as ftrace:bprint or ftrace:print) whose tp_event->class->reg is NULL,
which perf_trace_init() rejects with -EINVAL.
Should collect_probe_candidate_cb() skip internal ftrace:* events or collect
up to MAX_PROBE_CANDIDATES tracepoints before stopping, so the fallback does
not fail with EINVAL on the first ftrace event?
[ ... ]
> +static void __perf_pmu__probe(struct perf_pmu *pmu, int pmu_cpu)
> +{
> + struct probe_candidates cands = { .nr = 0 };
> + struct perf_event_attr base_attr;
> + char uprobe_exe_path[PATH_MAX];
> + __u64 uprobe_offset = 0;
> + unsigned long flags = perf_event_open_cloexec_flag();
> + int keepalive_fd = -1;
> + pid_t pid = 0;
> + int cpu = 0;
> + int last_err = 0;
> + bool found = false;
> +
> + if (pmu->type == PERF_TYPE_TRACEPOINT) {
> + static const struct {
> + const char *sys;
> + const char *name;
> + } fast_tps[] = {
> + { "sched", "sched_switch" },
> + { "raw_syscalls", "sys_enter" },
> + { "irq", "irq_handler_entry" },
> + };
> +
> + for (size_t i = 0; i < ARRAY_SIZE(fast_tps); i++) {
> + int tp_id = tp_pmu__id(fast_tps[i].sys, fast_tps[i].name);
> +
> + if (tp_id >= 0) {
[ ... ]
> + if (!found && cands.nr == 0) {
> + memset(&base_attr, 0, sizeof(base_attr));
> + base_attr.type = pmu->type;
> + base_attr.size = sizeof(base_attr);
> + if (pmu->perf_event_attr_init_default)
> + pmu->perf_event_attr_init_default(pmu, &base_attr);
> + if (try_open_attr_variants(&base_attr, pmu->is_uncore, pmu_cpu,
> + flags, &pid, &cpu, &last_err)) {
> + char buf[256];
> +
> + snprintf(buf, sizeof(buf), "%s//", pmu->name);
> + pmu->probed.probe_event = strdup(buf);
> + found = true;
> + }
> + }
[Severity: Medium]
When probing a tracepoint, kprobe, uprobe, or breakpoint PMU fails in
__perf_pmu__probe(), does falling through into this cands.nr == 0 block
clobber pmu->probed.open_err with EINVAL?
The kprobe, uprobe, and PERF_TYPE_BREAKPOINT branches probe their targets
directly without populating cands, and the PERF_TYPE_TRACEPOINT branch
ignores negative error returns (such as -EACCES when tracefs is mode 0700)
from tp_pmu__id() and perf_pmu__for_each_event(), leaving cands.nr == 0 and
last_err == 0.
Because none of those PMUs defines perf_event_attr_init_default, the
cands.nr == 0 fallback calls try_open_attr_variants() with a zeroed
base_attr (config == 0, kprobe_func == NULL, uprobe_path == NULL, or
bp_type == HW_BREAKPOINT_EMPTY). The kernel rejects all 16 attempts with
-EINVAL, and try_open_attr_variants() overwrites *last_err whenever it is 0
or ENOENT, replacing the original failure reason with EINVAL.
--
Sashiko AI review · https://sashiko.dev/#/patchset/20261103234502.1008382-1-irogers@google.com?part=28
next prev parent reply other threads:[~2026-11-04 5:39 UTC|newest]
Thread overview: 83+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-11-03 23:44 [PATCH v1 00/41] perf: Per-env PMUs, recorded event metrics, and perf sysinfo Ian Rogers
2026-11-03 23:44 ` [PATCH v1 01/41] perf env: Make lazy perf_env initialization thread-safe Ian Rogers
2026-11-03 23:53 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 02/41] perf env: Add host_env() singleton Ian Rogers
2026-11-04 0:18 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 03/41] perf pmu: Add from_env parameter to perf_pmu__init() Ian Rogers
2026-11-04 0:31 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 04/41] perf pmus: Introduce struct perf_pmus and perf_env__pmus() Ian Rogers
2026-11-04 0:48 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 05/41] perf pmus: Pass struct perf_pmus to find helpers Ian Rogers
2026-11-04 0:56 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 06/41] perf pmus: Pass struct perf_pmus to scan helpers Ian Rogers
2026-11-04 1:01 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 07/41] perf pmu-events: Add e_machine to struct pmu_events_map Ian Rogers
2026-11-04 1:06 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 08/41] perf pmu-events: Pass e_machine to find_core_*_table() Ian Rogers
2026-11-04 1:14 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 09/41] perf header: Pass e_machine to strcmp_cpuid_str() Ian Rogers
2026-11-04 1:18 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 10/41] perf header: Support CPUID matching across all architectures Ian Rogers
2026-11-04 1:23 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 11/41] perf test: Make the CPUID matching test architecture independent Ian Rogers
2026-11-04 1:32 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 12/41] perf test: Add CPUID matching tests for other architectures Ian Rogers
2026-11-04 1:36 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 13/41] perf pmus: Add perf_pmus__read_from_env() Ian Rogers
2026-11-04 2:05 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 14/41] perf metricgroup: Pass struct perf_pmus to metricgroup__for_each_metric() Ian Rogers
2026-11-04 2:17 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 15/41] perf metricgroup: Move matching of metrics to recorded events from perf script Ian Rogers
2026-11-04 2:36 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 16/41] perf parse-events: Decode metric-id terms when adding events Ian Rogers
2026-11-04 2:44 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 17/41] perf evsel: Generalize metric_id to a set of metric_ids Ian Rogers
2026-11-04 3:17 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 18/41] perf pmu: Add perf_pmu__for_each_name_from_config() Ian Rogers
2026-11-04 3:23 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 19/41] perf metricgroup: Improve matching of metrics to recorded events Ian Rogers
2026-11-04 3:46 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 20/41] perf metricgroup: Add metricgroup__add_recorded_metrics() Ian Rogers
2026-11-04 4:10 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 21/41] perf script: Fix metrics computed from samples Ian Rogers
2026-11-04 4:16 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 22/41] perf script: Don't drop metric samples for CPUs missing from the evsel Ian Rogers
2026-11-04 4:22 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 23/41] perf stat report: Display metrics for recorded events Ian Rogers
2026-11-04 4:39 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 24/41] perf script: Display metrics for perf stat record data Ian Rogers
2026-11-04 4:47 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 25/41] perf test: Add stat record metrics test Ian Rogers
2026-11-04 5:01 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 26/41] perf pmus: Expose duplicate uncore PMU scanning helpers Ian Rogers
2026-11-04 5:08 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 27/41] perf mem-events: Expose PMU init and name formatting helpers Ian Rogers
2026-11-04 5:20 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 28/41] perf pmu: Add perf_pmu__probe() for basic open, counting, and sampling Ian Rogers
2026-11-04 5:39 ` sashiko-bot [this message]
2026-11-03 23:44 ` [PATCH v1 29/41] perf pmu: Probe supported sample_type flags Ian Rogers
2026-11-04 5:49 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 30/41] perf pmu: Probe precise_ip levels Ian Rogers
2026-11-04 5:59 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 31/41] perf pmu: Probe privilege exclusion modifiers Ian Rogers
2026-11-04 6:04 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 32/41] perf pmu: Probe execution and AUX area features Ian Rogers
2026-11-04 6:19 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 33/41] perf pmu: Probe event group size limits Ian Rogers
2026-11-04 6:22 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 34/41] perf pmu: Probe user and interrupt sample register masks Ian Rogers
2026-11-04 6:44 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 35/41] perf pmu: Probe interrupt registers that require precise sampling Ian Rogers
2026-11-04 6:53 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 36/41] perf pmu: Probe memory profiling events and sample formats Ian Rogers
2026-11-04 7:04 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 37/41] perf pmu: Probe user-space mmap capabilities Ian Rogers
2026-11-04 7:27 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 38/41] perf pmu: Probe branch instruction skid Ian Rogers
2026-11-04 7:32 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 39/41] perf sysinfo: Add sysinfo subcommand Ian Rogers
2026-11-04 7:50 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 40/41] perf docs: Add perf-sysinfo man page Ian Rogers
2026-11-04 7:51 ` sashiko-bot
2026-11-03 23:44 ` [PATCH v1 41/41] perf test: Add perf sysinfo shell test Ian Rogers
2026-11-04 7:59 ` sashiko-bot
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=sashiko-outbox-196677@kernel.org \
--to=sashiko-bot@kernel.org \
--cc=irogers@google.com \
--cc=linux-perf-users@vger.kernel.org \
--cc=sashiko-reviews@lists.linux.dev \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.