diff options
author | Kan Liang <kan.liang@linux.intel.com> | 2018-04-24 14:20:10 -0400 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2018-04-24 15:02:29 -0400 |
commit | 292c34c10249c64a70def442f0d977bf9d466ed7 (patch) | |
tree | b57b3fbae4a0f211e21c19fa5296a3ba9d4f2bab /tools | |
parent | 5d9946c3e5e38e07ab7019db9413a96807a325f2 (diff) |
perf pmu: Fix core PMU alias list for X86 platform
When counting uncore event with alias, core event is mistakenly
involved, for example:
perf stat --no-merge -e "unc_m_cas_count.all" -C0 sleep 1
Performance counter stats for 'CPU(s) 0':
0 unc_m_cas_count.all [uncore_imc_4]
0 unc_m_cas_count.all [uncore_imc_2]
0 unc_m_cas_count.all [uncore_imc_0]
153,640 unc_m_cas_count.all [cpu]
0 unc_m_cas_count.all [uncore_imc_5]
25,026 unc_m_cas_count.all [uncore_imc_3]
0 unc_m_cas_count.all [uncore_imc_1]
1.001447890 seconds time elapsed
The reason is that current implementation doesn't check PMU name of a
event when adding its alias into the alias list for core PMU. The
uncore event aliases are mistakenly added.
This bug was introduced in:
commit 14b22ae028de ("perf pmu: Add helper function is_pmu_core to
detect PMU CORE devices")
Checking the PMU name for all PMUs on X86 and other architectures except
ARM.
There is no behavior change for ARM.
Signed-off-by: Kan Liang <kan.liang@linux.intel.com>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Agustin Vega-Frias <agustinv@codeaurora.org>
Cc: Andi Kleen <ak@linux.intel.com>
Cc: Ganapatrao Kulkarni <ganapatrao.kulkarni@cavium.com>
Cc: Jin Yao <yao.jin@linux.intel.com>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Shaokun Zhang <zhangshaokun@hisilicon.com>
Cc: Will Deacon <will.deacon@arm.com>
Fixes: 14b22ae028de ("perf pmu: Add helper function is_pmu_core to detect PMU CORE devices")
Link: http://lkml.kernel.org/r/1524594014-79243-1-git-send-email-kan.liang@linux.intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/perf/util/pmu.c | 20 |
1 files changed, 7 insertions, 13 deletions
diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index af4bedf4cf98..d2fb597c9a8c 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c | |||
@@ -539,9 +539,10 @@ static bool pmu_is_uncore(const char *name) | |||
539 | 539 | ||
540 | /* | 540 | /* |
541 | * PMU CORE devices have different name other than cpu in sysfs on some | 541 | * PMU CORE devices have different name other than cpu in sysfs on some |
542 | * platforms. looking for possible sysfs files to identify as core device. | 542 | * platforms. |
543 | * Looking for possible sysfs files to identify the arm core device. | ||
543 | */ | 544 | */ |
544 | static int is_pmu_core(const char *name) | 545 | static int is_arm_pmu_core(const char *name) |
545 | { | 546 | { |
546 | struct stat st; | 547 | struct stat st; |
547 | char path[PATH_MAX]; | 548 | char path[PATH_MAX]; |
@@ -550,12 +551,6 @@ static int is_pmu_core(const char *name) | |||
550 | if (!sysfs) | 551 | if (!sysfs) |
551 | return 0; | 552 | return 0; |
552 | 553 | ||
553 | /* Look for cpu sysfs (x86 and others) */ | ||
554 | scnprintf(path, PATH_MAX, "%s/bus/event_source/devices/cpu", sysfs); | ||
555 | if ((stat(path, &st) == 0) && | ||
556 | (strncmp(name, "cpu", strlen("cpu")) == 0)) | ||
557 | return 1; | ||
558 | |||
559 | /* Look for cpu sysfs (specific to arm) */ | 554 | /* Look for cpu sysfs (specific to arm) */ |
560 | scnprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s/cpus", | 555 | scnprintf(path, PATH_MAX, "%s/bus/event_source/devices/%s/cpus", |
561 | sysfs, name); | 556 | sysfs, name); |
@@ -668,6 +663,7 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu) | |||
668 | struct pmu_events_map *map; | 663 | struct pmu_events_map *map; |
669 | struct pmu_event *pe; | 664 | struct pmu_event *pe; |
670 | const char *name = pmu->name; | 665 | const char *name = pmu->name; |
666 | const char *pname; | ||
671 | 667 | ||
672 | map = perf_pmu__find_map(pmu); | 668 | map = perf_pmu__find_map(pmu); |
673 | if (!map) | 669 | if (!map) |
@@ -686,11 +682,9 @@ static void pmu_add_cpu_aliases(struct list_head *head, struct perf_pmu *pmu) | |||
686 | break; | 682 | break; |
687 | } | 683 | } |
688 | 684 | ||
689 | if (!is_pmu_core(name)) { | 685 | if (!is_arm_pmu_core(name)) { |
690 | /* check for uncore devices */ | 686 | pname = pe->pmu ? pe->pmu : "cpu"; |
691 | if (pe->pmu == NULL) | 687 | if (strncmp(pname, name, strlen(pname))) |
692 | continue; | ||
693 | if (strncmp(pe->pmu, name, strlen(pe->pmu))) | ||
694 | continue; | 688 | continue; |
695 | } | 689 | } |
696 | 690 | ||