aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
Diffstat (limited to 'arch')
-rw-r--r--arch/x86/kernel/cpu/perf_event_intel_rapl.c12
1 files changed, 9 insertions, 3 deletions
diff --git a/arch/x86/kernel/cpu/perf_event_intel_rapl.c b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
index 4b9a9e9466bd..7c87424d4140 100644
--- a/arch/x86/kernel/cpu/perf_event_intel_rapl.c
+++ b/arch/x86/kernel/cpu/perf_event_intel_rapl.c
@@ -535,6 +535,7 @@ static int rapl_cpu_prepare(int cpu)
535 struct rapl_pmu *pmu = per_cpu(rapl_pmu, cpu); 535 struct rapl_pmu *pmu = per_cpu(rapl_pmu, cpu);
536 int phys_id = topology_physical_package_id(cpu); 536 int phys_id = topology_physical_package_id(cpu);
537 u64 ms; 537 u64 ms;
538 u64 msr_rapl_power_unit_bits;
538 539
539 if (pmu) 540 if (pmu)
540 return 0; 541 return 0;
@@ -542,6 +543,9 @@ static int rapl_cpu_prepare(int cpu)
542 if (phys_id < 0) 543 if (phys_id < 0)
543 return -1; 544 return -1;
544 545
546 if (!rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits))
547 return -1;
548
545 pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu)); 549 pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu));
546 if (!pmu) 550 if (!pmu)
547 return -1; 551 return -1;
@@ -555,8 +559,7 @@ static int rapl_cpu_prepare(int cpu)
555 * 559 *
556 * we cache in local PMU instance 560 * we cache in local PMU instance
557 */ 561 */
558 rdmsrl(MSR_RAPL_POWER_UNIT, pmu->hw_unit); 562 pmu->hw_unit = (msr_rapl_power_unit_bits >> 8) & 0x1FULL;
559 pmu->hw_unit = (pmu->hw_unit >> 8) & 0x1FULL;
560 pmu->pmu = &rapl_pmu_class; 563 pmu->pmu = &rapl_pmu_class;
561 564
562 /* 565 /*
@@ -677,7 +680,9 @@ static int __init rapl_pmu_init(void)
677 cpu_notifier_register_begin(); 680 cpu_notifier_register_begin();
678 681
679 for_each_online_cpu(cpu) { 682 for_each_online_cpu(cpu) {
680 rapl_cpu_prepare(cpu); 683 ret = rapl_cpu_prepare(cpu);
684 if (ret)
685 goto out;
681 rapl_cpu_init(cpu); 686 rapl_cpu_init(cpu);
682 } 687 }
683 688
@@ -700,6 +705,7 @@ static int __init rapl_pmu_init(void)
700 hweight32(rapl_cntr_mask), 705 hweight32(rapl_cntr_mask),
701 ktime_to_ms(pmu->timer_interval)); 706 ktime_to_ms(pmu->timer_interval));
702 707
708out:
703 cpu_notifier_register_done(); 709 cpu_notifier_register_done();
704 710
705 return 0; 711 return 0;