All of lore.kernel.org
 help / color / mirror / Atom feed
From: sashiko-bot@kernel.org
To: "Ian Rogers" <irogers@google.com>, linux-perf-users@vger.kernel.org
Subject: Re: [PATCH v1 03/41] perf pmu: Add from_env parameter to perf_pmu__init()
Date: Wed, 04 Nov 2026 00:31:48 +0000	[thread overview]
Message-ID: <sashiko-outbox-196314@kernel.org> (raw)
In-Reply-To: <20261103234502.1008382-4-irogers@google.com>

Thank you for your contribution! Sashiko AI review found 1 potential issue(s) to consider:
- [Medium] perf pmu: evsel__is_drm() and evsel__is_hwmon() bypass open/read on from_env
--

commit ba6ab0f45b9bb32deca7319cf88953bc1e7ecb4b
Author: Ian Rogers <irogers@google.com>

perf pmu: Add from_env parameter to perf_pmu__init()

This commit adds a from_env boolean field to struct perf_pmu initialized via
perf_pmu__init() to distinguish PMUs reconstructed from perf_env headers from
live host PMUs, and guards tp_pmu, hwmon_pmu, and drm_pmu callbacks on
!pmu->from_env.

> diff --git a/tools/perf/util/drm_pmu.c b/tools/perf/util/drm_pmu.c
> index b8badae7015c6..cbbd5aafd24b8 100644
> --- a/tools/perf/util/drm_pmu.c
> +++ b/tools/perf/util/drm_pmu.c
> @@ -68,7 +68,7 @@ bool perf_pmu__is_drm(const struct perf_pmu *pmu)
>  
>  bool evsel__is_drm(const struct evsel *evsel)
>  {
> -	return perf_pmu__is_drm(evsel->pmu);
> +	return perf_pmu__is_drm(evsel->pmu) && !evsel->pmu->from_env;
>  }

[ ... ]

> @@ -658,11 +658,17 @@ static uint64_t drm_pmu__read_for_pid(struct drm_pmu *drm, struct evsel *evsel,
>  
>  int evsel__drm_pmu_read(struct evsel *evsel, int cpu_map_idx, int thread)
>  {
> -	struct drm_pmu *drm = container_of(evsel->pmu, struct drm_pmu, pmu);
> +	struct drm_pmu *drm;
>  	struct perf_counts_values *count, *old_count = NULL;
> -	int pid = perf_thread_map__pid(evsel->core.threads, thread);
> +	int pid;
>  	uint64_t counter;
>  
> +	if (!evsel->pmu || evsel->pmu->from_env)
> +		return -EINVAL;
> +
> +	drm = container_of(evsel->pmu, struct drm_pmu, pmu);
> +	pid = perf_thread_map__pid(evsel->core.threads, thread);
> +
>  	if (pid != -1)
>  		counter = drm_pmu__read_for_pid(drm, evsel, pid);
>  	else
> diff --git a/tools/perf/util/hwmon_pmu.c b/tools/perf/util/hwmon_pmu.c
> index 96aeb379e169d..fab9f09d0253d 100644
> --- a/tools/perf/util/hwmon_pmu.c
> +++ b/tools/perf/util/hwmon_pmu.c
> @@ -132,7 +132,7 @@ bool perf_pmu__is_hwmon(const struct perf_pmu *pmu)
>  
>  bool evsel__is_hwmon(const struct evsel *evsel)
>  {
> -	return perf_pmu__is_hwmon(evsel->pmu);
> +	return perf_pmu__is_hwmon(evsel->pmu) && !evsel->pmu->from_env;
>  }

[ ... ]

> @@ -763,12 +763,18 @@ int evsel__hwmon_pmu_open(struct evsel *evsel,
>  			  struct perf_thread_map *threads,
>  			  int start_cpu_map_idx, int end_cpu_map_idx)
>  {
> -	struct hwmon_pmu *hwm = container_of(evsel->pmu, struct hwmon_pmu, pmu);
> +	struct hwmon_pmu *hwm;
>  	union hwmon_pmu_event_key key = {
>  		.type_and_num = evsel->core.attr.config,
>  	};
>  	int idx = 0, thread = 0, nthreads, err = 0;
> -	int dir = open(hwm->hwmon_dir, O_CLOEXEC | O_DIRECTORY | O_RDONLY);
> +	int dir;
> +
> +	if (!evsel->pmu || evsel->pmu->from_env)
> +		return -EINVAL;

[Severity: Medium]
Should evsel__is_drm() in tools/perf/util/drm_pmu.c and evsel__is_hwmon() in
tools/perf/util/hwmon_pmu.c really return false when evsel->pmu->from_env is
true?

In tools/perf/util/evsel.c, evsel__is_hwmon() and evsel__is_drm() are used by
evsel__open_cpu() and evsel__read_counter() to dispatch to the DRM and hwmon
open/read callbacks instead of the standard perf_event_open() and fd read
paths:

tools/perf/util/evsel.c:evsel__open_cpu() {
	if (evsel__is_hwmon(evsel)) {
		err = evsel__hwmon_pmu_open(evsel, threads,
					    start_cpu_map_idx,
					    end_cpu_map_idx);
		goto out;
	}
	if (evsel__is_drm(evsel)) {
		err = evsel__drm_pmu_open(evsel, threads,
					  start_cpu_map_idx,
					  end_cpu_map_idx);
		goto out;
	}
}

tools/perf/util/evsel.c:evsel__read_counter() {
	if (evsel__is_hwmon(evsel))
		return evsel__hwmon_pmu_read(evsel, cpu_map_idx, thread);

	if (evsel__is_drm(evsel))
		return evsel__drm_pmu_read(evsel, cpu_map_idx, thread);
}

Because evsel__is_drm() and evsel__is_hwmon() now return false when
evsel->pmu->from_env is true, evsel__open_cpu() skips evsel__hwmon_pmu_open()
and evsel__drm_pmu_open() and falls through into the sys_perf_event_open()
loop with synthetic userspace PMU types (PERF_PMU_TYPE_DRM_START..END or
PERF_PMU_TYPE_HWMON_START..END), and evsel__read_counter() skips
evsel__hwmon_pmu_read() and evsel__drm_pmu_read() and falls through to
evsel__read_group() / evsel__read_one().

This also makes the new evsel->pmu->from_env checks in evsel__drm_pmu_read()
and evsel__hwmon_pmu_open() unreachable from evsel.c, and leaves
evsel__is_drm() and evsel__is_hwmon() inconsistent with perf_pmu__is_drm(),
perf_pmu__is_hwmon(), and evsel__is_non_perf_event_open_pmu().

Would it be better to keep evsel__is_drm() and evsel__is_hwmon() checking
only perf_pmu__is_drm(evsel->pmu) and perf_pmu__is_hwmon(evsel->pmu) so that
evsel__open_cpu() and evsel__read_counter() dispatch to the DRM/hwmon
callbacks and return -EINVAL on from_env?

-- 
Sashiko AI review · https://sashiko.dev/#/patchset/20261103234502.1008382-1-irogers@google.com?part=3

  reply	other threads:[~2026-11-04  0:31 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 [this message]
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
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-196314@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.