From d7416c6f79d5141a63e4b65be2a04582e4874e30 Mon Sep 17 00:00:00 2001 From: Ken Sato Date: Mon, 23 Jul 2018 17:10:45 +0900 Subject: [PATCH] perf_event: Specify counter by bit_mask on start/stop Fujitsu: POSTK_DEBUG_TEMP_FIX_30 Refs: #1002 Change-Id: Iea51e9aef78927a5033e3a226d5efc6298da056a --- arch/x86_64/kernel/perfctr.c | 14 ----------- kernel/syscall.c | 45 ++++++++++++++---------------------- lib/include/ihk/perfctr.h | 5 ---- 3 files changed, 17 insertions(+), 47 deletions(-) diff --git a/arch/x86_64/kernel/perfctr.c b/arch/x86_64/kernel/perfctr.c index 4adad87b..cc10f3c1 100644 --- a/arch/x86_64/kernel/perfctr.c +++ b/arch/x86_64/kernel/perfctr.c @@ -296,18 +296,11 @@ int ihk_mc_perfctr_set_extra(struct mc_perf_event *event) extern void x86_march_perfctr_start(unsigned long counter_mask); #endif -#ifdef POSTK_DEBUG_TEMP_FIX_30 -int ihk_mc_perfctr_start(int counter) -#else int ihk_mc_perfctr_start(unsigned long counter_mask) -#endif /*POSTK_DEBUG_TEMP_FIX_30*/ { int ret = 0; unsigned long value = 0; unsigned long mask = PERF_COUNTERS_MASK | FIXED_PERF_COUNTERS_MASK; -#ifdef POSTK_DEBUG_TEMP_FIX_30 - unsigned long counter_mask = 1UL << counter; -#endif /*POSTK_DEBUG_TEMP_FIX_30*/ PERFCTR_CHKANDJUMP(counter_mask & ~mask, "counter_mask out of range", -EINVAL); @@ -324,18 +317,11 @@ int ihk_mc_perfctr_start(unsigned long counter_mask) goto fn_exit; } -#ifdef POSTK_DEBUG_TEMP_FIX_30 -int ihk_mc_perfctr_stop(int counter) -#else int ihk_mc_perfctr_stop(unsigned long counter_mask) -#endif/*POSTK_DEBUG_TEMP_FIX_30*/ { int ret = 0; unsigned long value; unsigned long mask = PERF_COUNTERS_MASK | FIXED_PERF_COUNTERS_MASK; -#ifdef POSTK_DEBUG_TEMP_FIX_30 - unsigned long counter_mask = 1UL << counter; -#endif/*POSTK_DEBUG_TEMP_FIX_30*/ PERFCTR_CHKANDJUMP(counter_mask & ~mask, "counter_mask out of range", -EINVAL); diff --git a/kernel/syscall.c b/kernel/syscall.c index f5bc47ec..8055ace5 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -3417,8 +3417,7 @@ perf_counter_alloc(struct thread *thread) return ret; } -int -perf_counter_start(struct mc_perf_event *event) +int perf_counter_set(struct mc_perf_event *event) { int ret = 0; struct perf_event_attr *attr = &event->attr; @@ -3439,11 +3438,6 @@ perf_counter_start(struct mc_perf_event *event) } ret = ihk_mc_perfctr_init_raw(event->counter_id, event->hw_config, mode); - if (ret) { - goto out; - } - - ihk_mc_perfctr_start(1UL << event->counter_id); out: return ret; @@ -3566,26 +3560,32 @@ perf_read(struct mckfd *sfd, ihk_mc_user_context_t *ctx) return ret; } -void -perf_start(struct mc_perf_event *event) +void perf_start(struct mc_perf_event *event) { int counter_id; + unsigned long counter_mask = 0; 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)) { - perf_counter_start(leader); + 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)) { - perf_counter_start(sub); + perf_counter_set(sub); + counter_mask |= 1UL << counter_id; } } - cpu_local_var(current)->proc->perf_status = PP_COUNT; + + if (counter_mask) { + ihk_mc_perfctr_start(counter_mask); + cpu_local_var(current)->proc->perf_status = PP_COUNT; + } } void @@ -3613,37 +3613,26 @@ static void perf_stop(struct mc_perf_event *event) { int counter_id; + unsigned long counter_mask = 0; struct mc_perf_event *leader = event->group_leader, *sub; -#ifdef POSTK_DEBUG_TEMP_FIX_30 counter_id = leader->counter_id; if ((1UL << counter_id & PERF_COUNTERS_MASK) | (1UL << counter_id & FIXED_PERF_COUNTERS_MASK)) { - ihk_mc_perfctr_stop(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)) { - ihk_mc_perfctr_stop(counter_id); + counter_mask |= 1UL << counter_id; } } -#else - counter_id = leader->counter_id; - if ((1UL << counter_id & PERF_COUNTERS_MASK) | - (1UL << counter_id & FIXED_PERF_COUNTERS_MASK)) { - ihk_mc_perfctr_stop(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)) { - ihk_mc_perfctr_stop(1UL << counter_id); - } + if (counter_mask) { + ihk_mc_perfctr_stop(counter_mask); } -#endif /*POSTK_DEBUG_TEMP_FIX_30*/ } static int diff --git a/lib/include/ihk/perfctr.h b/lib/include/ihk/perfctr.h index be000355..89fdbb95 100644 --- a/lib/include/ihk/perfctr.h +++ b/lib/include/ihk/perfctr.h @@ -63,13 +63,8 @@ int ihk_mc_perfctr_init(int counter, enum ihk_perfctr_type type, int mode); int ihk_mc_perfctr_init_raw(int counter, unsigned int code, int mode); #endif/*POSTK_DEBUG_TEMP_FIX_29*/ int ihk_mc_perfctr_set_extra(struct mc_perf_event *event); -#ifdef POSTK_DEBUG_TEMP_FIX_30 -int ihk_mc_perfctr_start(int counter); -int ihk_mc_perfctr_stop(int counter); -#else int ihk_mc_perfctr_start(unsigned long counter_mask); int ihk_mc_perfctr_stop(unsigned long counter_mask); -#endif/*POSTK_DEBUG_TEMP_FIX_30*/ int ihk_mc_perfctr_fixed_init(int counter, int mode); int ihk_mc_perfctr_reset(int counter); int ihk_mc_perfctr_set(int counter, long value);