From 238f563e88f2f57bf1d8e7e872b3f49e78f6202c Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Tue, 29 Jan 2019 11:38:48 +0900 Subject: [PATCH] perf: add arch-dependent counter_mask_check function A later version would probably want to check some mask for arm64... Change-Id: I67e13a852c3ed406fbf8ae1688539b9e069c0e81 Fujitsu: POSTK_DEBUG_ARCH_DEP_87 --- arch/arm64/kernel/perfctr.c | 5 +++++ arch/x86_64/kernel/perfctr.c | 9 +++++++++ kernel/syscall.c | 18 ++++++------------ lib/include/ihk/perfctr.h | 1 + 4 files changed, 21 insertions(+), 12 deletions(-) diff --git a/arch/arm64/kernel/perfctr.c b/arch/arm64/kernel/perfctr.c index b9beb948..d19e22a2 100644 --- a/arch/arm64/kernel/perfctr.c +++ b/arch/arm64/kernel/perfctr.c @@ -184,6 +184,11 @@ int ihk_mc_perfctr_fixed_init(int counter, int mode) return -1; } +int ihk_mc_perf_counter_mask_check(unsigned long counter_mask) +{ + return 1; +} + int ihk_mc_perf_get_num_counters(void) { return cpu_pmu.per_cpu[ihk_mc_get_processor_id()].num_events; diff --git a/arch/x86_64/kernel/perfctr.c b/arch/x86_64/kernel/perfctr.c index 1075921a..f057a8ca 100644 --- a/arch/x86_64/kernel/perfctr.c +++ b/arch/x86_64/kernel/perfctr.c @@ -499,6 +499,15 @@ int ihk_mc_perfctr_alloc_counter(unsigned int *type, unsigned long *config, unsi return ret; } +int ihk_mc_perf_counter_mask_check(unsigned long counter_mask) +{ + if ((counter_mask & PERF_COUNTERS_MASK) | + (counter_mask & FIXED_PERF_COUNTERS_MASK)) { + return 1; + } + return 0; +} + int ihk_mc_perf_get_num_counters(void) { return NUM_PERF_COUNTERS; diff --git a/kernel/syscall.c b/kernel/syscall.c index 8ae1f538..9026d20d 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -3901,16 +3901,14 @@ void perf_start(struct mc_perf_event *event) struct mc_perf_event *leader = event->group_leader, *sub; counter_id = leader->counter_id; - if ((1UL << counter_id & PERF_COUNTERS_MASK) | - (1UL << counter_id & FIXED_PERF_COUNTERS_MASK)) { + if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { perf_counter_set(leader); counter_mask |= 1UL << counter_id; } list_for_each_entry(sub, &leader->sibling_list, group_entry) { counter_id = sub->counter_id; - if ((1UL << counter_id & PERF_COUNTERS_MASK) | - (1UL << counter_id & FIXED_PERF_COUNTERS_MASK)) { + if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { perf_counter_set(sub); counter_mask |= 1UL << counter_id; } @@ -3929,15 +3927,13 @@ perf_reset(struct mc_perf_event *event) struct mc_perf_event *leader = event->group_leader, *sub; counter_id = leader->counter_id; - if ((1UL << counter_id & PERF_COUNTERS_MASK) | - (1UL << counter_id & FIXED_PERF_COUNTERS_MASK)) { + if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { ihk_mc_perfctr_reset(counter_id); } list_for_each_entry(sub, &leader->sibling_list, group_entry) { counter_id = sub->counter_id; - if ((1UL << counter_id & PERF_COUNTERS_MASK) | - (1UL << counter_id & FIXED_PERF_COUNTERS_MASK)) { + if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { ihk_mc_perfctr_reset(counter_id); } } @@ -3951,15 +3947,13 @@ perf_stop(struct mc_perf_event *event) struct mc_perf_event *leader = event->group_leader, *sub; counter_id = leader->counter_id; - if ((1UL << counter_id & PERF_COUNTERS_MASK) | - (1UL << counter_id & FIXED_PERF_COUNTERS_MASK)) { + if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { counter_mask |= 1UL << counter_id; } list_for_each_entry(sub, &leader->sibling_list, group_entry) { counter_id = sub->counter_id; - if ((1UL << counter_id & PERF_COUNTERS_MASK) | - (1UL << counter_id & FIXED_PERF_COUNTERS_MASK)) { + if (ihk_mc_perf_counter_mask_check(1UL << counter_id)) { counter_mask |= 1UL << counter_id; } } diff --git a/lib/include/ihk/perfctr.h b/lib/include/ihk/perfctr.h index bd8fa16f..800acb6a 100644 --- a/lib/include/ihk/perfctr.h +++ b/lib/include/ihk/perfctr.h @@ -72,6 +72,7 @@ int ihk_mc_perfctr_read_mask(unsigned long counter_mask, unsigned long *value); unsigned long ihk_mc_perfctr_read(int counter); unsigned long ihk_mc_perfctr_read_msr(int counter); int ihk_mc_perfctr_alloc_counter(unsigned int *type, unsigned long *config, unsigned long pmc_status); +int ihk_mc_perf_counter_mask_check(unsigned long counter_mask); int ihk_mc_perf_get_num_counters(void); #endif