Store the pmu in event->pmu_private and use it instead of the per cpu
data. Preparatory step to get rid of the per cpu allocations.

Signed-off-by: Thomas Gleixner <[email protected]>
---
 arch/x86/kernel/cpu/perf_event_intel_rapl.c |   16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

Index: b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
===================================================================
--- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
@@ -122,6 +122,7 @@ static struct perf_pmu_events_attr event
 struct rapl_pmu {
        raw_spinlock_t          lock;
        int                     n_active;
+       int                     cpu;
        struct list_head        active_list;
        struct pmu              *pmu;
        ktime_t                 timer_interval;
@@ -203,7 +204,7 @@ static void rapl_start_hrtimer(struct ra
 
 static enum hrtimer_restart rapl_hrtimer_handle(struct hrtimer *hrtimer)
 {
-       struct rapl_pmu *pmu = __this_cpu_read(rapl_pmu);
+       struct rapl_pmu *pmu = container_of(hrtimer, struct rapl_pmu, hrtimer);
        struct perf_event *event;
        unsigned long flags;
 
@@ -249,7 +250,7 @@ static void __rapl_pmu_event_start(struc
 
 static void rapl_pmu_event_start(struct perf_event *event, int mode)
 {
-       struct rapl_pmu *pmu = __this_cpu_read(rapl_pmu);
+       struct rapl_pmu *pmu = event->pmu_private;
        unsigned long flags;
 
        raw_spin_lock_irqsave(&pmu->lock, flags);
@@ -259,7 +260,7 @@ static void rapl_pmu_event_start(struct
 
 static void rapl_pmu_event_stop(struct perf_event *event, int mode)
 {
-       struct rapl_pmu *pmu = __this_cpu_read(rapl_pmu);
+       struct rapl_pmu *pmu = event->pmu_private;
        struct hw_perf_event *hwc = &event->hw;
        unsigned long flags;
 
@@ -293,7 +294,7 @@ static void rapl_pmu_event_stop(struct p
 
 static int rapl_pmu_event_add(struct perf_event *event, int mode)
 {
-       struct rapl_pmu *pmu = __this_cpu_read(rapl_pmu);
+       struct rapl_pmu *pmu = event->pmu_private;
        struct hw_perf_event *hwc = &event->hw;
        unsigned long flags;
 
@@ -316,6 +317,7 @@ static void rapl_pmu_event_del(struct pe
 
 static int rapl_pmu_event_init(struct perf_event *event)
 {
+       struct rapl_pmu *pmu = __this_cpu_read(rapl_pmu);
        u64 cfg = event->attr.config & RAPL_EVENT_MASK;
        int bit, msr, ret = 0;
 
@@ -327,6 +329,9 @@ static int rapl_pmu_event_init(struct pe
        if (event->attr.config & ~RAPL_EVENT_MASK)
                return -EINVAL;
 
+       if (event->cpu < 0)
+               return -EINVAL;
+
        /*
         * check event is known (determines counter)
         */
@@ -365,6 +370,8 @@ static int rapl_pmu_event_init(struct pe
                return -EINVAL;
 
        /* must be done before validate_group */
+       event->cpu = pmu->cpu;
+       event->pmu_private = pmu;
        event->hw.event_base = msr;
        event->hw.config = cfg;
        event->hw.idx = bit;
@@ -572,6 +579,7 @@ static int rapl_cpu_prepare(int cpu)
        INIT_LIST_HEAD(&pmu->active_list);
 
        pmu->pmu = &rapl_pmu_class;
+       pmu->cpu = cpu;
 
        pmu->timer_interval = ms_to_ktime(rapl_timer_ms);
 


Reply via email to