Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf stat: Add requires_cpu flag for uncore

Uncore events require a CPU i.e. it cannot be -1.

The evsel system_wide flag is intended for events that should be on every
CPU, which does not make sense for uncore events because uncore events do
not map one-to-one with CPUs.

These 2 requirements are not exactly the same, so introduce a new flag
'requires_cpu' for the uncore case.

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Ian Rogers <irogers@google.com>
Acked-by: Namhyung Kim <namhyung@kernel.org>
Cc: Alexey Bayduraev <alexey.v.bayduraev@linux.intel.com>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Leo Yan <leo.yan@linaro.org>
Link: https://lore.kernel.org/r/20220524075436.29144-13-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Adrian Hunter and committed by
Arnaldo Carvalho de Melo
d3345fec 4ce47d84

+7 -6
+3 -1
tools/lib/perf/evlist.c
··· 43 43 if (!evsel->own_cpus || evlist->has_user_cpus) { 44 44 perf_cpu_map__put(evsel->cpus); 45 45 evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus); 46 - } else if (!evsel->system_wide && perf_cpu_map__empty(evlist->user_requested_cpus)) { 46 + } else if (!evsel->system_wide && 47 + !evsel->requires_cpu && 48 + perf_cpu_map__empty(evlist->user_requested_cpus)) { 47 49 perf_cpu_map__put(evsel->cpus); 48 50 evsel->cpus = perf_cpu_map__get(evlist->user_requested_cpus); 49 51 } else if (evsel->cpus != evsel->own_cpus) {
+1
tools/lib/perf/include/internal/evsel.h
··· 50 50 /* parse modifier helper */ 51 51 int nr_members; 52 52 bool system_wide; 53 + bool requires_cpu; 53 54 int idx; 54 55 }; 55 56
+1 -4
tools/perf/builtin-stat.c
··· 382 382 if (!counter->supported) 383 383 return -ENOENT; 384 384 385 - if (counter->core.system_wide) 386 - nthreads = 1; 387 - 388 385 for (thread = 0; thread < nthreads; thread++) { 389 386 struct perf_counts_values *count; 390 387 ··· 2258 2261 struct evsel *counter; 2259 2262 2260 2263 evlist__for_each_entry(evsel_list, counter) { 2261 - if (!counter->core.system_wide && 2264 + if (!counter->core.requires_cpu && 2262 2265 strcmp(counter->name, "duration_time")) { 2263 2266 return; 2264 2267 }
+1
tools/perf/util/evsel.c
··· 409 409 evsel->core.threads = perf_thread_map__get(orig->core.threads); 410 410 evsel->core.nr_members = orig->core.nr_members; 411 411 evsel->core.system_wide = orig->core.system_wide; 412 + evsel->core.requires_cpu = orig->core.requires_cpu; 412 413 413 414 if (orig->name) { 414 415 evsel->name = strdup(orig->name);
+1 -1
tools/perf/util/parse-events.c
··· 365 365 (*idx)++; 366 366 evsel->core.cpus = cpus; 367 367 evsel->core.own_cpus = perf_cpu_map__get(cpus); 368 - evsel->core.system_wide = pmu ? pmu->is_uncore : false; 368 + evsel->core.requires_cpu = pmu ? pmu->is_uncore : false; 369 369 evsel->auto_merge_stats = auto_merge_stats; 370 370 371 371 if (name)