Message ID | 20190522153019.18645-5-andrew.murray@arm.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | KVM: arm/arm64: add support for chained counters | expand |
On Wed, May 22, 2019 at 04:30:17PM +0100, Andrew Murray wrote: > The ARMv8 Performance Monitors Extension includes an architectural > event type named CHAIN which allows for chaining counters together. > > Let's extract the test for this event into a header file such that > other users, such as KVM (for PMU emulation) can make use of. > > Signed-off-by: Andrew Murray <andrew.murray@arm.com> > Reviewed-by: Suzuki K Poulose <suzuki.poulose@arm.com> > --- > arch/arm64/include/asm/perf_event.h | 5 +++++ > arch/arm64/kernel/perf_event.c | 2 +- > 2 files changed, 6 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/include/asm/perf_event.h b/arch/arm64/include/asm/perf_event.h > index c593761ba61c..cd13f3fd1055 100644 > --- a/arch/arm64/include/asm/perf_event.h > +++ b/arch/arm64/include/asm/perf_event.h > @@ -219,6 +219,11 @@ > #define ARMV8_PMU_USERENR_CR (1 << 2) /* Cycle counter can be read at EL0 */ > #define ARMV8_PMU_USERENR_ER (1 << 3) /* Event counter can be read at EL0 */ > > +static inline bool armv8pmu_evtype_is_chain(u64 evtype) > +{ > + return (evtype == ARMV8_PMUV3_PERFCTR_CHAIN); > +} > + > #ifdef CONFIG_PERF_EVENTS > struct pt_regs; > extern unsigned long perf_instruction_pointer(struct pt_regs *regs); > diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c > index 314b1adedf06..265bd835a724 100644 > --- a/arch/arm64/kernel/perf_event.c > +++ b/arch/arm64/kernel/perf_event.c > @@ -879,7 +879,7 @@ static int armv8pmu_set_event_filter(struct hw_perf_event *event, > static int armv8pmu_filter_match(struct perf_event *event) > { > unsigned long evtype = event->hw.config_base & ARMV8_PMU_EVTYPE_EVENT; > - return evtype != ARMV8_PMUV3_PERFCTR_CHAIN; > + return !armv8pmu_evtype_is_chain(evtype); Acked-by: Will Deacon <will.deacon@arm.com> Although if the definition of armv8pmu_evtype_is_chain() isn't going to get any more complicated than a single evtype comparison, I'm not sure it's worth this abstraction, to be honest. Will
diff --git a/arch/arm64/include/asm/perf_event.h b/arch/arm64/include/asm/perf_event.h index c593761ba61c..cd13f3fd1055 100644 --- a/arch/arm64/include/asm/perf_event.h +++ b/arch/arm64/include/asm/perf_event.h @@ -219,6 +219,11 @@ #define ARMV8_PMU_USERENR_CR (1 << 2) /* Cycle counter can be read at EL0 */ #define ARMV8_PMU_USERENR_ER (1 << 3) /* Event counter can be read at EL0 */ +static inline bool armv8pmu_evtype_is_chain(u64 evtype) +{ + return (evtype == ARMV8_PMUV3_PERFCTR_CHAIN); +} + #ifdef CONFIG_PERF_EVENTS struct pt_regs; extern unsigned long perf_instruction_pointer(struct pt_regs *regs); diff --git a/arch/arm64/kernel/perf_event.c b/arch/arm64/kernel/perf_event.c index 314b1adedf06..265bd835a724 100644 --- a/arch/arm64/kernel/perf_event.c +++ b/arch/arm64/kernel/perf_event.c @@ -879,7 +879,7 @@ static int armv8pmu_set_event_filter(struct hw_perf_event *event, static int armv8pmu_filter_match(struct perf_event *event) { unsigned long evtype = event->hw.config_base & ARMV8_PMU_EVTYPE_EVENT; - return evtype != ARMV8_PMUV3_PERFCTR_CHAIN; + return !armv8pmu_evtype_is_chain(evtype); } static void armv8pmu_reset(void *info)