perf/x86/rapl: Get MSR values from new probe framework
authorJiri Olsa <jolsa@kernel.org>
Sun, 16 Jun 2019 14:03:56 +0000 (16:03 +0200)
committerIngo Molnar <mingo@kernel.org>
Mon, 24 Jun 2019 17:28:34 +0000 (19:28 +0200)
There's no need to have special code for getting
the bit and MSR value for given event. We can
now easily get it from rapl_msrs array.

Also getting rid of RAPL_IDX_*, which is no longer
needed and replacing INTEL_RAPL* with PERF_RAPL*
enums.

Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Cc: Alexander Shishkin <alexander.shishkin@linux.intel.com>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@kernel.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Borislav Petkov <bp@alien8.de>
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Kan <kan.liang@linux.intel.com>
Cc: Liang
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Stephane Eranian <eranian@google.com>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Vince Weaver <vincent.weaver@maine.edu>
Link: https://lkml.kernel.org/r/20190616140358.27799-7-jolsa@kernel.org
Signed-off-by: Ingo Molnar <mingo@kernel.org>
arch/x86/events/intel/rapl.c

index 417de3f..00b2b5d 100644 (file)
@@ -55,6 +55,7 @@
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/perf_event.h>
+#include <linux/nospec.h>
 #include <asm/cpu_device_id.h>
 #include <asm/intel-family.h>
 #include "../perf_event.h"
@@ -65,19 +66,6 @@ MODULE_LICENSE("GPL");
 /*
  * RAPL energy status counters
  */
-#define RAPL_IDX_PP0_NRG_STAT  0       /* all cores */
-#define INTEL_RAPL_PP0         0x1     /* pseudo-encoding */
-#define RAPL_IDX_PKG_NRG_STAT  1       /* entire package */
-#define INTEL_RAPL_PKG         0x2     /* pseudo-encoding */
-#define RAPL_IDX_RAM_NRG_STAT  2       /* DRAM */
-#define INTEL_RAPL_RAM         0x3     /* pseudo-encoding */
-#define RAPL_IDX_PP1_NRG_STAT  3       /* gpu */
-#define INTEL_RAPL_PP1         0x4     /* pseudo-encoding */
-#define RAPL_IDX_PSYS_NRG_STAT 4       /* psys */
-#define INTEL_RAPL_PSYS                0x5     /* pseudo-encoding */
-
-#define NR_RAPL_DOMAINS         0x5
-
 enum perf_rapl_events {
        PERF_RAPL_PP0 = 0,              /* all cores */
        PERF_RAPL_PKG,                  /* entire package */
@@ -86,6 +74,7 @@ enum perf_rapl_events {
        PERF_RAPL_PSYS,                 /* psys */
 
        PERF_RAPL_MAX,
+       NR_RAPL_DOMAINS = PERF_RAPL_MAX,
 };
 
 static const char *const rapl_domain_names[NR_RAPL_DOMAINS] __initconst = {
@@ -149,6 +138,7 @@ static struct rapl_pmus *rapl_pmus;
 static cpumask_t rapl_cpu_mask;
 static unsigned int rapl_cntr_mask;
 static u64 rapl_timer_ms;
+static struct perf_msr rapl_msrs[];
 
 static inline struct rapl_pmu *cpu_to_rapl_pmu(unsigned int cpu)
 {
@@ -340,7 +330,7 @@ static void rapl_pmu_event_del(struct perf_event *event, int flags)
 static int rapl_pmu_event_init(struct perf_event *event)
 {
        u64 cfg = event->attr.config & RAPL_EVENT_MASK;
-       int bit, msr, ret = 0;
+       int bit, ret = 0;
        struct rapl_pmu *pmu;
 
        /* only look at RAPL events */
@@ -356,33 +346,12 @@ static int rapl_pmu_event_init(struct perf_event *event)
 
        event->event_caps |= PERF_EV_CAP_READ_ACTIVE_PKG;
 
-       /*
-        * check event is known (determines counter)
-        */
-       switch (cfg) {
-       case INTEL_RAPL_PP0:
-               bit = RAPL_IDX_PP0_NRG_STAT;
-               msr = MSR_PP0_ENERGY_STATUS;
-               break;
-       case INTEL_RAPL_PKG:
-               bit = RAPL_IDX_PKG_NRG_STAT;
-               msr = MSR_PKG_ENERGY_STATUS;
-               break;
-       case INTEL_RAPL_RAM:
-               bit = RAPL_IDX_RAM_NRG_STAT;
-               msr = MSR_DRAM_ENERGY_STATUS;
-               break;
-       case INTEL_RAPL_PP1:
-               bit = RAPL_IDX_PP1_NRG_STAT;
-               msr = MSR_PP1_ENERGY_STATUS;
-               break;
-       case INTEL_RAPL_PSYS:
-               bit = RAPL_IDX_PSYS_NRG_STAT;
-               msr = MSR_PLATFORM_ENERGY_STATUS;
-               break;
-       default:
+       if (!cfg || cfg >= NR_RAPL_DOMAINS + 1)
                return -EINVAL;
-       }
+
+       cfg = array_index_nospec((long)cfg, NR_RAPL_DOMAINS + 1);
+       bit = cfg - 1;
+
        /* check event supported */
        if (!(rapl_cntr_mask & (1 << bit)))
                return -EINVAL;
@@ -397,7 +366,7 @@ static int rapl_pmu_event_init(struct perf_event *event)
                return -EINVAL;
        event->cpu = pmu->cpu;
        event->pmu_private = pmu;
-       event->hw.event_base = msr;
+       event->hw.event_base = rapl_msrs[bit].msr;
        event->hw.config = cfg;
        event->hw.idx = bit;
 
@@ -705,7 +674,7 @@ static int rapl_check_hw_unit(bool apply_quirk)
         * of 2. Datasheet, September 2014, Reference Number: 330784-001 "
         */
        if (apply_quirk)
-               rapl_hw_unit[RAPL_IDX_RAM_NRG_STAT] = 16;
+               rapl_hw_unit[PERF_RAPL_RAM] = 16;
 
        /*
         * Calculate the timer rate: