152 lines
6.7 KiB
Diff
152 lines
6.7 KiB
Diff
From aa636dd0053413996f78efb463c8a4e1802930e2 Mon Sep 17 00:00:00 2001
|
|
From: Kajol Jain <kjain@linux.ibm.com>
|
|
Date: Wed, 20 Nov 2019 14:10:59 +0530
|
|
Subject: [PATCH 035/201] perf metricgroup: Fix printing event names of metric
|
|
group with multiple events
|
|
|
|
mainline inclusion
|
|
from mainline-v5.5-rc3
|
|
commit eb573e746b9d4f0921dcb2449be3df41dae3caea
|
|
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=eb573e746b9d4f0921dcb2449be3df41dae3caea
|
|
|
|
------------------------------------------------------------------------
|
|
|
|
Commit f01642e4912b ("perf metricgroup: Support multiple events for
|
|
metricgroup") introduced support for multiple events in a metric group.
|
|
But with the current upstream, metric events names are not printed
|
|
properly
|
|
|
|
In power9 platform:
|
|
|
|
command:# ./perf stat --metric-only -M translation -C 0 -I 1000 sleep 2
|
|
1.000208486
|
|
2.000368863
|
|
2.001400558
|
|
|
|
Similarly in skylake platform:
|
|
|
|
command:./perf stat --metric-only -M Power -I 1000
|
|
1.000579994
|
|
2.002189493
|
|
|
|
With current upstream version, issue is with event name comparison logic
|
|
in find_evsel_group(). Current logic is to compare events belonging to a
|
|
metric group to the events in perf_evlist. Since the break statement is
|
|
missing in the loop used for comparison between metric group and
|
|
perf_evlist events, the loop continues to execute even after getting a
|
|
pattern match, and end up in discarding the matches.
|
|
|
|
Incase of single metric event belongs to metric group, its working fine,
|
|
because in case of single event once it compare all events it reaches to
|
|
end of perf_evlist.
|
|
|
|
Example for single metric event in power9 platform:
|
|
|
|
command:# ./perf stat --metric-only -M branches_per_inst -I 1000 sleep 1
|
|
1.000094653 0.2
|
|
1.001337059 0.0
|
|
|
|
This patch fixes the issue by making sure once we found all events
|
|
belongs to that metric event matched in find_evsel_group(), we
|
|
successfully break from that loop by adding corresponding condition.
|
|
|
|
With this patch:
|
|
In power9 platform:
|
|
|
|
command:# ./perf stat --metric-only -M translation -C 0 -I 1000 sleep 2
|
|
result:#
|
|
time derat_4k_miss_rate_percent derat_4k_miss_ratio derat_miss_ratio derat_64k_miss_rate_percent derat_64k_miss_ratio dslb_miss_rate_percent islb_miss_rate_percent
|
|
1.000135672 0.0 0.3 1.0 0.0 0.2 0.0 0.0
|
|
2.000380617 0.0 0.0 0.0 0.0 0.0 0.0 0.0
|
|
|
|
command:# ./perf stat --metric-only -M Power -I 1000
|
|
|
|
Similarly in skylake platform:
|
|
result:#
|
|
time Turbo_Utilization C3_Core_Residency C6_Core_Residency C7_Core_Residency C2_Pkg_Residency C3_Pkg_Residency C6_Pkg_Residency C7_Pkg_Residency
|
|
1.000563580 0.3 0.0 2.6 44.2 21.9 0.0 0.0 0.0
|
|
2.002235027 0.4 0.0 2.7 43.0 20.7 0.0 0.0 0.0
|
|
|
|
Committer testing:
|
|
|
|
Before:
|
|
|
|
[root@seventh ~]# perf stat --metric-only -M Power -I 1000
|
|
# time
|
|
1.000383223
|
|
2.001168182
|
|
3.001968545
|
|
4.002741200
|
|
5.003442022
|
|
^C 5.777687244
|
|
|
|
[root@seventh ~]#
|
|
|
|
After the patch:
|
|
|
|
[root@seventh ~]# perf stat --metric-only -M Power -I 1000
|
|
# time Turbo_Utilization C3_Core_Residency C6_Core_Residency C7_Core_Residency C2_Pkg_Residency C3_Pkg_Residency C6_Pkg_Residency C7_Pkg_Residency
|
|
1.000406577 0.4 0.1 1.4 97.0 0.0 0.0 0.0 0.0
|
|
2.001481572 0.3 0.0 0.6 97.9 0.0 0.0 0.0 0.0
|
|
3.002332585 0.2 0.0 1.0 97.5 0.0 0.0 0.0 0.0
|
|
4.003196624 0.2 0.0 0.3 98.6 0.0 0.0 0.0 0.0
|
|
5.004063851 0.3 0.0 0.7 97.7 0.0 0.0 0.0 0.0
|
|
^C 5.471260276 0.2 0.0 0.5 49.3 0.0 0.0 0.0 0.0
|
|
|
|
[root@seventh ~]#
|
|
[root@seventh ~]# dmesg | grep -i skylake
|
|
[ 0.187807] Performance Events: PEBS fmt3+, Skylake events, 32-deep LBR, full-width counters, Intel PMU driver.
|
|
[root@seventh ~]#
|
|
|
|
Fixes: f01642e4912b ("perf metricgroup: Support multiple events for metricgroup")
|
|
Signed-off-by: Kajol Jain <kjain@linux.ibm.com>
|
|
Reviewed-by: Ravi Bangoria <ravi.bangoria@linux.ibm.com>
|
|
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
|
|
Cc: Andi Kleen <ak@linux.intel.com>
|
|
Cc: Anju T Sudhakar <anju@linux.vnet.ibm.com>
|
|
Cc: Jin Yao <yao.jin@linux.intel.com>
|
|
Cc: Jiri Olsa <jolsa@kernel.org>
|
|
Cc: Kan Liang <kan.liang@linux.intel.com>
|
|
Cc: Madhavan Srinivasan <maddy@linux.vnet.ibm.com>
|
|
Cc: Peter Zijlstra <peterz@infradead.org>
|
|
Link: http://lore.kernel.org/lkml/20191120084059.24458-1-kjain@linux.ibm.com
|
|
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
|
|
Signed-off-by: hongrongxuan <hongrongxuan@huawei.com>
|
|
---
|
|
tools/perf/util/metricgroup.c | 7 +++++--
|
|
1 file changed, 5 insertions(+), 2 deletions(-)
|
|
|
|
diff --git a/tools/perf/util/metricgroup.c b/tools/perf/util/metricgroup.c
|
|
index 375866dab75b..303f0fde6759 100644
|
|
--- a/tools/perf/util/metricgroup.c
|
|
+++ b/tools/perf/util/metricgroup.c
|
|
@@ -109,8 +109,11 @@ static struct perf_evsel *find_evsel_group(struct perf_evlist *perf_evlist,
|
|
if (!strcmp(ev->name, ids[i])) {
|
|
if (!metric_events[i])
|
|
metric_events[i] = ev;
|
|
+ i++;
|
|
+ if (i == idnum)
|
|
+ break;
|
|
} else {
|
|
- if (++i == idnum) {
|
|
+ if (i + 1 == idnum) {
|
|
/* Discard the whole match and start again */
|
|
i = 0;
|
|
memset(metric_events, 0,
|
|
@@ -130,7 +133,7 @@ static struct perf_evsel *find_evsel_group(struct perf_evlist *perf_evlist,
|
|
}
|
|
}
|
|
|
|
- if (i != idnum - 1) {
|
|
+ if (i != idnum) {
|
|
/* Not whole match */
|
|
return NULL;
|
|
}
|
|
--
|
|
2.27.0
|
|
|