Patch "perf pmu: Unbreak perf record for arm/arm64 with events with explicit PMU" has been added to the 4.13-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
perf pmu: Unbreak perf record for arm/arm64 with events with explicit PMU
to the 4.13-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
perf-pmu-unbreak-perf-record-for-arm-arm64-with-events-with-explicit-pmu.patch
and it can be found in the queue-4.13 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
66ec11919a0f96e936bb731fdbc2851316077d26Mon Sep 17 00:00:00 2001
From: Mark Rutland <[email protected]>
Date: Fri, 6 Oct 2017 19:38:22 +0100
Subject: perf pmu: Unbreak perf record for arm/arm64 with events with explicit PMU
From: Mark Rutland <[email protected]>
commit 66ec11919a0f96e936bb731fdbc2851316077d26 upstream.
Currently, perf record is broken on arm/arm64 systems when the PMU is specified explicitly as part of the event, e.g.
$ ./perf record -e armv8_cortex_a53/cpu_cycles/u true
In such cases, perf record fails to open events unless perf_event_paranoid is set to -1, even if the PMU in question supports mode exclusion. Further, even when perf_event_paranoid is toggled, no samples are recorded.
This is an unintended side effect of commit:
e3ba76deef23064f ("perf tools: Force uncore events to system wide monitoring)
... which assumes that if a PMU has an associated cpu_map, it is an uncore PMU, and forces events for such PMUs to be system-wide.
This is not true for arm/arm64 systems, which can have heterogeneous CPUs. To account for this, multiple CPU PMUs are exposed, each with a "cpus" field under sysfs, which the perf tool parses into a cpu_map. ARM PMUs do not have a "cpumask" file, and only have a "cpus" file. For the gory details as to why, see commit:
7e3fcffe95544010 ("perf pmu: Support alternative sysfs cpumask")
Given all of this, we can instead identify uncore PMUs by explicitly checking for a "cpumask" file, and restore arm/arm64 PMU support back to a working state. This patch does so, adding a new perf_pmu::is_uncore field, and splitting the existing cpumask parsing so that it can be reused.
Tested-by Will Deacon <[email protected]>
--- tools/perf/util/parse-events.c | 9 +++--- tools/perf/util/pmu.c | 56 ++++++++++++++++++++++++++++++----------- tools/perf/util/pmu.h | 1 3 files changed, 47 insertions(+), 19 deletions(-)
tools/perf/util/parse-events.c +5 -4
@@ -309,10 +309,11 @@ static char *get_config_name(struct liststatic struct perf_evsel *__add_event (struct list_head *list,int *idx,struct perf_event_attr *attr, -char *name,struct cpu_map *cpus, +char *name,struct perf_pmu *pmu,struct list_head *config_terms) {struct perf_evsel *evsel; +struct cpu_map *cpus = pmu ? pmu->cpus :NULL ;event_attr_init (attr);
@@ -323,7 +324,7 @@ __add_event(struct list_head *list, int (*idx)++; evsel->cpus =cpu_map__get (cpus); evsel->own_cpus =cpu_map__get (cpus); - evsel->system_wide = !!cpus; + evsel->system_wide = pmu ? pmu->is_uncore : false;if (name) evsel->name =strdup (name);
@@ -1232,7 +1233,7 @@ int parse_events_add_pmu(struct parse_evif (!head_config) { attr.type = pmu->type; - evsel =__add_event (list, &data->idx, &attr,NULL , pmu->cpus,NULL ); + evsel =__add_event (list, &data->idx, &attr,NULL , pmu,NULL );return evsel ?0 : -ENOMEM ; }
@@ -1253,7 +1254,7 @@ int parse_events_add_pmu(struct parse_evreturn -EINVAL ; evsel =__add_event (list, &data->idx, &attr, -get_config_name (head_config), pmu->cpus, +get_config_name (head_config), pmu, &config_terms);if (evsel) { evsel->unit = info.unit;
tools/perf/util/pmu.c +41 -15
84 lines not on this page · raw message
tools/perf/util/pmu.h +1 -0
@@ -22,6 +22,7 @@ struct perf_pmu {char *name;__u32 type;bool selectable; +bool is_uncore;struct perf_event_attr *default_config;struct cpu_map *cpus;struct list_head format;/* HEAD struct perf_pmu_format -> list */
Patches currently in stable-queue which might be from [email protected] are
queue-4.13/perf-pmu-unbreak-perf-record-for-arm-arm64-with-events-with-explicit-pmu.patch