From: Kan Liang <kan.li...@linux.intel.com>

Each Hybrid PMU has to check and update its own extra registers before
registration.

The intel_pmu_check_extra_regs will be reused later to check the extra
registers of each hybrid PMU.

Reviewed-by: Andi Kleen <a...@linux.intel.com>
Signed-off-by: Kan Liang <kan.li...@linux.intel.com>
---
 arch/x86/events/intel/core.c | 35 +++++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 14 deletions(-)

diff --git a/arch/x86/events/intel/core.c b/arch/x86/events/intel/core.c
index 53a2e2e..d1a13e0 100644
--- a/arch/x86/events/intel/core.c
+++ b/arch/x86/events/intel/core.c
@@ -5133,6 +5133,26 @@ static void intel_pmu_check_event_constraints(struct 
event_constraint *event_con
        }
 }
 
+static void intel_pmu_check_extra_regs(struct extra_reg *extra_regs)
+{
+       struct extra_reg *er;
+
+       /*
+        * Access extra MSR may cause #GP under certain circumstances.
+        * E.g. KVM doesn't support offcore event
+        * Check all extra_regs here.
+        */
+       if (!extra_regs)
+               return;
+
+       for (er = extra_regs; er->msr; er++) {
+               er->extra_msr_access = check_msr(er->msr, 0x11UL);
+               /* Disable LBR select mapping */
+               if ((er->idx == EXTRA_REG_LBR) && !er->extra_msr_access)
+                       x86_pmu.lbr_sel_map = NULL;
+       }
+}
+
 __init int intel_pmu_init(void)
 {
        struct attribute **extra_skl_attr = &empty_attrs;
@@ -5144,7 +5164,6 @@ __init int intel_pmu_init(void)
        union cpuid10_eax eax;
        union cpuid10_ebx ebx;
        unsigned int fixed_mask;
-       struct extra_reg *er;
        bool pmem = false;
        int version, i;
        char *name;
@@ -5801,19 +5820,7 @@ __init int intel_pmu_init(void)
        if (x86_pmu.lbr_nr)
                pr_cont("%d-deep LBR, ", x86_pmu.lbr_nr);
 
-       /*
-        * Access extra MSR may cause #GP under certain circumstances.
-        * E.g. KVM doesn't support offcore event
-        * Check all extra_regs here.
-        */
-       if (x86_pmu.extra_regs) {
-               for (er = x86_pmu.extra_regs; er->msr; er++) {
-                       er->extra_msr_access = check_msr(er->msr, 0x11UL);
-                       /* Disable LBR select mapping */
-                       if ((er->idx == EXTRA_REG_LBR) && !er->extra_msr_access)
-                               x86_pmu.lbr_sel_map = NULL;
-               }
-       }
+       intel_pmu_check_extra_regs(x86_pmu.extra_regs);
 
        /* Support full width counters using alternative MSR range */
        if (x86_pmu.intel_cap.full_width_write) {
-- 
2.7.4

Reply via email to