| From fabef2fc9a81373331ccfb2556aba99e99035f2f Mon Sep 17 00:00:00 2001 |
| From: Shaokun Zhang <zhangshaokun@hisilicon.com> |
| Date: Thu, 18 Jun 2020 21:35:44 +0800 |
| Subject: [PATCH] arm64: perf: Correct the event index in sysfs |
| |
| commit 539707caa1a89ee4efc57b4e4231c20c46575ccc upstream. |
| |
| When PMU event ID is equal or greater than 0x4000, it will be reduced |
| by 0x4000 and it is not the raw number in the sysfs. Let's correct it |
| and obtain the raw event ID. |
| |
| Before this patch: |
| cat /sys/bus/event_source/devices/armv8_pmuv3_0/events/sample_feed |
| event=0x001 |
| After this patch: |
| cat /sys/bus/event_source/devices/armv8_pmuv3_0/events/sample_feed |
| event=0x4001 |
| |
| Signed-off-by: Shaokun Zhang <zhangshaokun@hisilicon.com> |
| Cc: Will Deacon <will@kernel.org> |
| Cc: Mark Rutland <mark.rutland@arm.com> |
| Cc: <stable@vger.kernel.org> |
| Link: https://lore.kernel.org/r/1592487344-30555-3-git-send-email-zhangshaokun@hisilicon.com |
| [will: fixed formatting of 'if' condition] |
| Signed-off-by: Will Deacon <will@kernel.org> |
| Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com> |
| |
| diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c |
| index 96e90e270042..1439cff99a28 100644 |
| --- a/arch/arm64/kernel/perf_event.c |
| +++ b/arch/arm64/kernel/perf_event.c |
| @@ -154,7 +154,7 @@ armv8pmu_events_sysfs_show(struct device *dev, |
| |
| pmu_attr = container_of(attr, struct perf_pmu_events_attr, attr); |
| |
| - return sprintf(page, "event=0x%03llx\n", pmu_attr->id); |
| + return sprintf(page, "event=0x%04llx\n", pmu_attr->id); |
| } |
| |
| #define ARMV8_EVENT_ATTR_RESOLVE(m) #m |
| @@ -303,10 +303,13 @@ armv8pmu_event_attr_is_visible(struct kobject *kobj, |
| test_bit(pmu_attr->id, cpu_pmu->pmceid_bitmap)) |
| return attr->mode; |
| |
| - pmu_attr->id -= ARMV8_PMUV3_EXT_COMMON_EVENT_BASE; |
| - if (pmu_attr->id < ARMV8_PMUV3_MAX_COMMON_EVENTS && |
| - test_bit(pmu_attr->id, cpu_pmu->pmceid_ext_bitmap)) |
| - return attr->mode; |
| + if (pmu_attr->id >= ARMV8_PMUV3_EXT_COMMON_EVENT_BASE) { |
| + u64 id = pmu_attr->id - ARMV8_PMUV3_EXT_COMMON_EVENT_BASE; |
| + |
| + if (id < ARMV8_PMUV3_MAX_COMMON_EVENTS && |
| + test_bit(id, cpu_pmu->pmceid_ext_bitmap)) |
| + return attr->mode; |
| + } |
| |
| return 0; |
| } |
| -- |
| 2.27.0 |
| |