All of lore.kernel.org
 help / color / mirror / Atom feed
From: Ian Rogers <irogers@google.com>
To: Suzuki K Poulose <suzuki.poulose@arm.com>,
	Mike Leach <mike.leach@linaro.org>, Leo Yan <leo.yan@linaro.org>,
	John Garry <john.g.garry@oracle.com>,
	Will Deacon <will@kernel.org>, James Clark <james.clark@arm.com>,
	Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	Arnaldo Carvalho de Melo <acme@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>, Namhyung Kim <namhyung@kernel.org>,
	Ian Rogers <irogers@google.com>,
	Adrian Hunter <adrian.hunter@intel.com>,
	Kajol Jain <kjain@linux.ibm.com>,
	Jing Zhang <renyu.zj@linux.alibaba.com>,
	Kan Liang <kan.liang@linux.intel.com>,
	Zhengjun Xing <zhengjun.xing@linux.intel.com>,
	Ravi Bangoria <ravi.bangoria@amd.com>,
	Madhavan Srinivasan <maddy@linux.ibm.com>,
	Athira Rajeev <atrajeev@linux.vnet.ibm.com>,
	Ming Wang <wangming01@loongson.cn>,
	Huacai Chen <chenhuacai@kernel.org>,
	Sandipan Das <sandipan.das@amd.com>,
	Dmitrii Dolgov <9erthalion6@gmail.com>,
	Sean Christopherson <seanjc@google.com>,
	Ali Saidi <alisaidi@amazon.com>, Rob Herring <robh@kernel.org>,
	Thomas Richter <tmricht@linux.ibm.com>,
	Kang Minchul <tegongkang@gmail.com>,
	linux-kernel@vger.kernel.org, coresight@lists.linaro.org,
	linux-arm-kernel@lists.infradead.org,
	linux-perf-users@vger.kernel.org
Subject: [PATCH v4 09/35] perf evlist: Propagate user CPU maps intersecting core PMU maps
Date: Fri, 26 May 2023 14:53:44 -0700	[thread overview]
Message-ID: <20230526215410.2435674-10-irogers@google.com> (raw)
In-Reply-To: <20230526215410.2435674-1-irogers@google.com>

The CPU map for a non-core PMU gives a default CPU value for
perf_event_open. For core PMUs the CPU map lists all CPUs the evsel
may be opened on. If there are >1 core PMU, the CPU maps will list the
CPUs for that core PMU, but the user_requested_cpus may contain CPUs
that are invalid for the PMU and cause perf_event_open to fail. To
avoid this, when propagating the CPU map for core PMUs intersect it
with the CPU map of the PMU (the evsel's "own_cpus").

Add comments to __perf_evlist__propagate_maps to explain its somewhat
complex behavior. Fix the related comments for system_wide in struct
perf_evsel.

Signed-off-by: Ian Rogers <irogers@google.com>
Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
---
 tools/lib/perf/evlist.c                 | 25 ++++++++++++++++++++-----
 tools/lib/perf/include/internal/evsel.h |  6 +++---
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/tools/lib/perf/evlist.c b/tools/lib/perf/evlist.c
index 81e8b5fcd8ba..b8b066d0dc5e 100644
--- a/tools/lib/perf/evlist.c
+++ b/tools/lib/perf/evlist.c
@@ -36,18 +36,33 @@ void perf_evlist__init(struct perf_evlist *evlist)
 static void __perf_evlist__propagate_maps(struct perf_evlist *evlist,
 					  struct perf_evsel *evsel)
 {
-	/*
-	 * We already have cpus for evsel (via PMU sysfs) so
-	 * keep it, if there's no target cpu list defined.
-	 */
 	if (evsel->system_wide) {
+		/* System wide: set the cpu map of the evsel to all online CPUs. */
 		perf_cpu_map__put(evsel->cpus);
 		evsel->cpus = perf_cpu_map__new(NULL);
+	} else if (evlist->has_user_cpus && evsel->is_pmu_core) {
+		/*
+		 * User requested CPUs on a core PMU, ensure the requested CPUs
+		 * are valid by intersecting with those of the PMU.
+		 */
+		perf_cpu_map__put(evsel->cpus);
+		evsel->cpus = perf_cpu_map__intersect(evlist->user_requested_cpus, evsel->own_cpus);
 	} else if (!evsel->own_cpus || evlist->has_user_cpus ||
-		   (!evsel->requires_cpu && perf_cpu_map__empty(evlist->user_requested_cpus))) {
+		(!evsel->requires_cpu && perf_cpu_map__has_any_cpu(evlist->user_requested_cpus))) {
+		/*
+		 * The PMU didn't specify a default cpu map, this isn't a core
+		 * event and the user requested CPUs or the evlist user
+		 * requested CPUs have the "any CPU" (aka dummy) CPU value. In
+		 * which case use the user requested CPUs rather than the PMU
+		 * ones.
+		 */
 		perf_cpu_map__put(evsel->cpus);
 		evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus);
 	} else if (evsel->cpus != evsel->own_cpus) {
+		/*
+		 * No user requested cpu map but the PMU cpu map doesn't match
+		 * the evsel's. Reset it back to the PMU cpu map.
+		 */
 		perf_cpu_map__put(evsel->cpus);
 		evsel->cpus = perf_cpu_map__get(evsel->own_cpus);
 	}
diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 4d6f2a032f45..5cd220a61962 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -62,9 +62,9 @@ struct perf_evsel {
 	int			 nr_members;
 	/*
 	 * system_wide is for events that need to be on every CPU, irrespective
-	 * of user requested CPUs or threads. Map propagation will set cpus to
-	 * this event's own_cpus, whereby they will contribute to evlist
-	 * all_cpus.
+	 * of user requested CPUs or threads. Tha main example of this is the
+	 * dummy event. Map propagation will set cpus for this event to all CPUs
+	 * as software PMU events like dummy, have a CPU map that is empty.
 	 */
 	bool			 system_wide;
 	/*
-- 
2.41.0.rc0.172.g3f132b7071-goog


WARNING: multiple messages have this Message-ID (diff)
From: Ian Rogers <irogers@google.com>
To: Suzuki K Poulose <suzuki.poulose@arm.com>,
	Mike Leach <mike.leach@linaro.org>,  Leo Yan <leo.yan@linaro.org>,
	John Garry <john.g.garry@oracle.com>,
	 Will Deacon <will@kernel.org>, James Clark <james.clark@arm.com>,
	 Peter Zijlstra <peterz@infradead.org>,
	Ingo Molnar <mingo@redhat.com>,
	 Arnaldo Carvalho de Melo <acme@kernel.org>,
	Mark Rutland <mark.rutland@arm.com>,
	 Alexander Shishkin <alexander.shishkin@linux.intel.com>,
	Jiri Olsa <jolsa@kernel.org>,  Namhyung Kim <namhyung@kernel.org>,
	Ian Rogers <irogers@google.com>,
	 Adrian Hunter <adrian.hunter@intel.com>,
	Kajol Jain <kjain@linux.ibm.com>,
	 Jing Zhang <renyu.zj@linux.alibaba.com>,
	Kan Liang <kan.liang@linux.intel.com>,
	 Zhengjun Xing <zhengjun.xing@linux.intel.com>,
	Ravi Bangoria <ravi.bangoria@amd.com>,
	 Madhavan Srinivasan <maddy@linux.ibm.com>,
	Athira Rajeev <atrajeev@linux.vnet.ibm.com>,
	 Ming Wang <wangming01@loongson.cn>,
	Huacai Chen <chenhuacai@kernel.org>,
	 Sandipan Das <sandipan.das@amd.com>,
	Dmitrii Dolgov <9erthalion6@gmail.com>,
	 Sean Christopherson <seanjc@google.com>,
	Ali Saidi <alisaidi@amazon.com>, Rob Herring <robh@kernel.org>,
	 Thomas Richter <tmricht@linux.ibm.com>,
	Kang Minchul <tegongkang@gmail.com>,
	 linux-kernel@vger.kernel.org, coresight@lists.linaro.org,
	 linux-arm-kernel@lists.infradead.org,
	linux-perf-users@vger.kernel.org
Subject: [PATCH v4 09/35] perf evlist: Propagate user CPU maps intersecting core PMU maps
Date: Fri, 26 May 2023 14:53:44 -0700	[thread overview]
Message-ID: <20230526215410.2435674-10-irogers@google.com> (raw)
In-Reply-To: <20230526215410.2435674-1-irogers@google.com>

The CPU map for a non-core PMU gives a default CPU value for
perf_event_open. For core PMUs the CPU map lists all CPUs the evsel
may be opened on. If there are >1 core PMU, the CPU maps will list the
CPUs for that core PMU, but the user_requested_cpus may contain CPUs
that are invalid for the PMU and cause perf_event_open to fail. To
avoid this, when propagating the CPU map for core PMUs intersect it
with the CPU map of the PMU (the evsel's "own_cpus").

Add comments to __perf_evlist__propagate_maps to explain its somewhat
complex behavior. Fix the related comments for system_wide in struct
perf_evsel.

Signed-off-by: Ian Rogers <irogers@google.com>
Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
---
 tools/lib/perf/evlist.c                 | 25 ++++++++++++++++++++-----
 tools/lib/perf/include/internal/evsel.h |  6 +++---
 2 files changed, 23 insertions(+), 8 deletions(-)

diff --git a/tools/lib/perf/evlist.c b/tools/lib/perf/evlist.c
index 81e8b5fcd8ba..b8b066d0dc5e 100644
--- a/tools/lib/perf/evlist.c
+++ b/tools/lib/perf/evlist.c
@@ -36,18 +36,33 @@ void perf_evlist__init(struct perf_evlist *evlist)
 static void __perf_evlist__propagate_maps(struct perf_evlist *evlist,
 					  struct perf_evsel *evsel)
 {
-	/*
-	 * We already have cpus for evsel (via PMU sysfs) so
-	 * keep it, if there's no target cpu list defined.
-	 */
 	if (evsel->system_wide) {
+		/* System wide: set the cpu map of the evsel to all online CPUs. */
 		perf_cpu_map__put(evsel->cpus);
 		evsel->cpus = perf_cpu_map__new(NULL);
+	} else if (evlist->has_user_cpus && evsel->is_pmu_core) {
+		/*
+		 * User requested CPUs on a core PMU, ensure the requested CPUs
+		 * are valid by intersecting with those of the PMU.
+		 */
+		perf_cpu_map__put(evsel->cpus);
+		evsel->cpus = perf_cpu_map__intersect(evlist->user_requested_cpus, evsel->own_cpus);
 	} else if (!evsel->own_cpus || evlist->has_user_cpus ||
-		   (!evsel->requires_cpu && perf_cpu_map__empty(evlist->user_requested_cpus))) {
+		(!evsel->requires_cpu && perf_cpu_map__has_any_cpu(evlist->user_requested_cpus))) {
+		/*
+		 * The PMU didn't specify a default cpu map, this isn't a core
+		 * event and the user requested CPUs or the evlist user
+		 * requested CPUs have the "any CPU" (aka dummy) CPU value. In
+		 * which case use the user requested CPUs rather than the PMU
+		 * ones.
+		 */
 		perf_cpu_map__put(evsel->cpus);
 		evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus);
 	} else if (evsel->cpus != evsel->own_cpus) {
+		/*
+		 * No user requested cpu map but the PMU cpu map doesn't match
+		 * the evsel's. Reset it back to the PMU cpu map.
+		 */
 		perf_cpu_map__put(evsel->cpus);
 		evsel->cpus = perf_cpu_map__get(evsel->own_cpus);
 	}
diff --git a/tools/lib/perf/include/internal/evsel.h b/tools/lib/perf/include/internal/evsel.h
index 4d6f2a032f45..5cd220a61962 100644
--- a/tools/lib/perf/include/internal/evsel.h
+++ b/tools/lib/perf/include/internal/evsel.h
@@ -62,9 +62,9 @@ struct perf_evsel {
 	int			 nr_members;
 	/*
 	 * system_wide is for events that need to be on every CPU, irrespective
-	 * of user requested CPUs or threads. Map propagation will set cpus to
-	 * this event's own_cpus, whereby they will contribute to evlist
-	 * all_cpus.
+	 * of user requested CPUs or threads. Tha main example of this is the
+	 * dummy event. Map propagation will set cpus for this event to all CPUs
+	 * as software PMU events like dummy, have a CPU map that is empty.
 	 */
 	bool			 system_wide;
 	/*
-- 
2.41.0.rc0.172.g3f132b7071-goog


_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  parent reply	other threads:[~2023-05-26 21:55 UTC|newest]

Thread overview: 82+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-05-26 21:53 [PATCH v4 00/35] PMU refactoring and improvements Ian Rogers
2023-05-26 21:53 ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 01/35] perf cpumap: Add intersect function Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 02/35] perf tests: Organize cpu_map tests into a single suite Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 03/35] perf cpumap: Add equal function Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-27  1:32   ` Arnaldo Carvalho de Melo
2023-05-27  1:32     ` Arnaldo Carvalho de Melo
2023-05-27  1:40     ` Arnaldo Carvalho de Melo
2023-05-27  1:40       ` Arnaldo Carvalho de Melo
2023-05-27  6:05       ` Ian Rogers
2023-05-27  6:05         ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 04/35] libperf cpumap: Add "any CPU"/dummy test function Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 05/35] perf pmu: Detect ARM and hybrid PMUs with sysfs Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 06/35] perf pmu: Add is_core to pmu Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 07/35] perf evsel: Add is_pmu_core inorder to interpret own_cpus Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 08/35] perf pmu: Add CPU map for "cpu" PMUs Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` Ian Rogers [this message]
2023-05-26 21:53   ` [PATCH v4 09/35] perf evlist: Propagate user CPU maps intersecting core PMU maps Ian Rogers
2023-05-26 21:53 ` [PATCH v4 10/35] perf evlist: Allow has_user_cpus to be set on hybrid Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 11/35] perf target: Remove unused hybrid value Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 12/35] perf tools: Warn if no user requested CPUs match PMU's CPUs Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 13/35] perf evlist: Remove evlist__warn_hybrid_group Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 14/35] perf evlist: Remove __evlist__add_default Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-27  1:45   ` Arnaldo Carvalho de Melo
2023-05-27  1:45     ` Arnaldo Carvalho de Melo
2023-05-27  5:58     ` Ian Rogers
2023-05-27  5:58       ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 15/35] perf evlist: Reduce scope of evlist__has_hybrid Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 16/35] perf pmu: Remove perf_pmu__hybrid_mounted Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 17/35] perf pmu: Rewrite perf_pmu__has_hybrid to avoid list Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 18/35] perf x86: Iterate hybrid PMUs as core PMUs Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 19/35] perf topology: Avoid hybrid list for hybrid topology Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 20/35] perf evsel: Compute is_hybrid from PMU being core Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 21/35] perf header: Avoid hybrid PMU list in write_pmu_caps Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 22/35] perf metrics: Remove perf_pmu__is_hybrid use Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 23/35] perf stat: Avoid hybrid PMU list Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:53 ` [PATCH v4 24/35] perf mem: " Ian Rogers
2023-05-26 21:53   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 25/35] perf pmu: Remove perf_pmu__hybrid_pmus list Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 26/35] perf pmus: Prefer perf_pmu__scan over perf_pmus__for_each_pmu Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 27/35] perf x86 mem: minor refactor to is_mem_loads_aux_event Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 28/35] perf pmu: Separate pmu and pmus Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 29/35] perf pmus: Split pmus list into core and other Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 30/35] perf pmus: Allow just core PMU scanning Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 31/35] perf pmus: Avoid repeated sysfs scanning Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 32/35] perf pmus: Ensure all PMUs are read for find_by_type Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 33/35] perf pmus: Add function to return count of core PMUs Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 34/35] perf pmus: Remove perf_pmus__has_hybrid Ian Rogers
2023-05-26 21:54   ` Ian Rogers
2023-05-26 21:54 ` [PATCH v4 35/35] perf pmu: Remove is_pmu_hybrid Ian Rogers
2023-05-26 21:54   ` 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=20230526215410.2435674-10-irogers@google.com \
    --to=irogers@google.com \
    --cc=9erthalion6@gmail.com \
    --cc=acme@kernel.org \
    --cc=adrian.hunter@intel.com \
    --cc=alexander.shishkin@linux.intel.com \
    --cc=alisaidi@amazon.com \
    --cc=atrajeev@linux.vnet.ibm.com \
    --cc=chenhuacai@kernel.org \
    --cc=coresight@lists.linaro.org \
    --cc=james.clark@arm.com \
    --cc=john.g.garry@oracle.com \
    --cc=jolsa@kernel.org \
    --cc=kan.liang@linux.intel.com \
    --cc=kjain@linux.ibm.com \
    --cc=leo.yan@linaro.org \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-perf-users@vger.kernel.org \
    --cc=maddy@linux.ibm.com \
    --cc=mark.rutland@arm.com \
    --cc=mike.leach@linaro.org \
    --cc=mingo@redhat.com \
    --cc=namhyung@kernel.org \
    --cc=peterz@infradead.org \
    --cc=ravi.bangoria@amd.com \
    --cc=renyu.zj@linux.alibaba.com \
    --cc=robh@kernel.org \
    --cc=sandipan.das@amd.com \
    --cc=seanjc@google.com \
    --cc=suzuki.poulose@arm.com \
    --cc=tegongkang@gmail.com \
    --cc=tmricht@linux.ibm.com \
    --cc=wangming01@loongson.cn \
    --cc=will@kernel.org \
    --cc=zhengjun.xing@linux.intel.com \
    /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.