135 lines
4.6 KiB
Diff
135 lines
4.6 KiB
Diff
From 3667180fda826780793e3a05e3883e078d2f0ba5 Mon Sep 17 00:00:00 2001
|
|
From: John Garry <john.garry@huawei.com>
|
|
Date: Thu, 21 Jan 2021 00:18:38 +0800
|
|
Subject: [PATCH 200/201] perf metricgroup: Fix for metrics containing
|
|
duration_time
|
|
|
|
mainline inclusion
|
|
from mainline-v5.11-rc5
|
|
commit 9c880c24cb0db49d6e62e6d882df1470b0be8038
|
|
category: bugfix
|
|
bugzilla: https://gitee.com/openeuler/kernel/issues/I8C0CX
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=9c880c24cb0db49d6e62e6d882df1470b0be8038
|
|
|
|
----------------------------------------------------------------------
|
|
|
|
Metrics containing duration_time cause a segfault:
|
|
|
|
$ perf stat -v -M L1D_Cache_Fill_BW sleep 1
|
|
Using CPUID GenuineIntel-6-3D-4
|
|
metric expr 64 * l1d.replacement / 1000000000 / duration_time for L1D_Cache_Fill_BW
|
|
found event duration_time
|
|
found event l1d.replacement
|
|
adding {l1d.replacement}:W,duration_time
|
|
l1d.replacement -> cpu/umask=0x1,(null)=0x1e8483,event=0x51/
|
|
Segmentation fault
|
|
$
|
|
|
|
In commit c2337d67199a1ea1 ("perf metricgroup: Fix metrics using aliases
|
|
covering multiple PMUs"), the logic in find_evsel_group() when iter'ing
|
|
events was changed to not only select events in same group, but also for
|
|
aliased PMUs.
|
|
|
|
Checking whether events were for aliased PMUs was done by comparing the
|
|
event PMU name. This was not safe for duration_time event, which has no
|
|
associated PMU (and no PMU name), so fix by checking if the event PMU name
|
|
is set also.
|
|
|
|
Committer testing:
|
|
|
|
Reproduced the bug, then, on a:
|
|
|
|
$ grep -m1 ^'model name' /proc/cpuinfo
|
|
model name : Intel(R) Core(TM) i7-8650U CPU @ 1.90GHz
|
|
$
|
|
|
|
We now get:
|
|
|
|
$ perf stat -M L1D_Cache_Fill_BW sleep 1
|
|
|
|
Performance counter stats for 'sleep 1':
|
|
|
|
4,141 l1d.replacement:u
|
|
1,001,285,107 ns duration_time:u
|
|
|
|
1.001285107 seconds time elapsed
|
|
|
|
0.000000000 seconds user
|
|
0.001119000 seconds sys
|
|
|
|
$
|
|
|
|
Detais from -v:
|
|
|
|
Using CPUID GenuineIntel-6-8E-A
|
|
metric expr 64 * l1d.replacement / 1000000000 / duration_time for L1D_Cache_Fill_BW
|
|
found event duration_time
|
|
found event l1d.replacement
|
|
adding {l1d.replacement}:W,duration_time
|
|
l1d.replacement -> cpu/(null)=0x1e8483,umask=0x1,event=0x51/
|
|
Control descriptor is not initialized
|
|
Warning:
|
|
kernel.perf_event_paranoid=2, trying to fall back to excluding kernel and hypervisor samples
|
|
Warning:
|
|
kernel.perf_event_paranoid=2, trying to fall back to excluding kernel and hypervisor samples
|
|
l1d.replacement:u: 4592 612201 612201
|
|
duration_time:u: 1001478621 1001478621 1001478621
|
|
|
|
Fixes: c2337d67199a1ea1 ("perf metricgroup: Fix metrics using aliases covering multiple PMUs")
|
|
Reported-by: Joakim Zhang <qiangqing.zhang@nxp.com>
|
|
Signed-off-by: John Garry <john.garry@huawei.com>
|
|
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
Tested-by: Jiri Olsa <jolsa@redhat.com>
|
|
Acked-by: Ian Rogers <irogers@google.com>
|
|
Acked-by: Jiri Olsa <jolsa@redhat.com>
|
|
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
|
|
Cc: Ingo Molnar <mingo@redhat.com>
|
|
Cc: Kajol Jain <kjain@linux.ibm.com>
|
|
Cc: Mark Rutland <mark.rutland@arm.com>
|
|
Cc: Namhyung Kim <namhyung@kernel.org>
|
|
Cc: Peter Zijlstra <peterz@infradead.org>
|
|
Cc: linuxarm@openeuler.org
|
|
Link: https://lore.kernel.org/r/1611159518-226883-1-git-send-email-john.garry@huawei.com
|
|
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
Signed-off-by: hongrongxuan <hongrongxuan@huawei.com>
|
|
|
|
Conflicts:
|
|
tools/perf/util/metricgroup.c
|
|
---
|
|
tools/perf/util/metricgroup.c | 11 +++++++++--
|
|
1 file changed, 9 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
|
|
index bc0aa1b7938b..32c5919c9413 100644
|
|
--- a/tools/perf/util/metricgroup.c
|
|
+++ b/tools/perf/util/metricgroup.c
|
|
@@ -167,6 +167,14 @@ static bool contains_event(struct perf_evsel **metric_events, int num_events,
|
|
return false;
|
|
}
|
|
|
|
+static bool evsel_same_pmu(struct perf_evsel *ev1, struct perf_evsel *ev2)
|
|
+{
|
|
+ if (!ev1->pmu_name || !ev2->pmu_name)
|
|
+ return false;
|
|
+
|
|
+ return !strcmp(ev1->pmu_name, ev2->pmu_name);
|
|
+}
|
|
+
|
|
/**
|
|
* Find a group of events in perf_evlist that correspond to those from a parsed
|
|
* metric expression. Note, as find_evsel_group is called in the same order as
|
|
@@ -285,8 +293,7 @@ static struct perf_evsel *find_evsel_group(struct perf_evlist *perf_evlist,
|
|
*/
|
|
if (!has_constraint &&
|
|
ev->leader != metric_events[i]->leader &&
|
|
- !strcmp(ev->leader->pmu_name,
|
|
- metric_events[i]->leader->pmu_name))
|
|
+ evsel_same_pmu(ev->leader, metric_events[i]->leader))
|
|
break;
|
|
if (!strcmp(metric_events[i]->name, ev->name)) {
|
|
set_bit(ev->idx, evlist_used);
|
|
--
|
|
2.27.0
|
|
|