|
@@ -535,6 +535,7 @@ static int rapl_cpu_prepare(int cpu)
|
|
|
struct rapl_pmu *pmu = per_cpu(rapl_pmu, cpu);
|
|
|
int phys_id = topology_physical_package_id(cpu);
|
|
|
u64 ms;
|
|
|
+ u64 msr_rapl_power_unit_bits;
|
|
|
|
|
|
if (pmu)
|
|
|
return 0;
|
|
@@ -542,6 +543,9 @@ static int rapl_cpu_prepare(int cpu)
|
|
|
if (phys_id < 0)
|
|
|
return -1;
|
|
|
|
|
|
+ if (!rdmsrl_safe(MSR_RAPL_POWER_UNIT, &msr_rapl_power_unit_bits))
|
|
|
+ return -1;
|
|
|
+
|
|
|
pmu = kzalloc_node(sizeof(*pmu), GFP_KERNEL, cpu_to_node(cpu));
|
|
|
if (!pmu)
|
|
|
return -1;
|
|
@@ -555,8 +559,7 @@ static int rapl_cpu_prepare(int cpu)
|
|
|
*
|
|
|
* we cache in local PMU instance
|
|
|
*/
|
|
|
- rdmsrl(MSR_RAPL_POWER_UNIT, pmu->hw_unit);
|
|
|
- pmu->hw_unit = (pmu->hw_unit >> 8) & 0x1FULL;
|
|
|
+ pmu->hw_unit = (msr_rapl_power_unit_bits >> 8) & 0x1FULL;
|
|
|
pmu->pmu = &rapl_pmu_class;
|
|
|
|
|
|
/*
|
|
@@ -677,7 +680,9 @@ static int __init rapl_pmu_init(void)
|
|
|
cpu_notifier_register_begin();
|
|
|
|
|
|
for_each_online_cpu(cpu) {
|
|
|
- rapl_cpu_prepare(cpu);
|
|
|
+ ret = rapl_cpu_prepare(cpu);
|
|
|
+ if (ret)
|
|
|
+ goto out;
|
|
|
rapl_cpu_init(cpu);
|
|
|
}
|
|
|
|
|
@@ -700,6 +705,7 @@ static int __init rapl_pmu_init(void)
|
|
|
hweight32(rapl_cntr_mask),
|
|
|
ktime_to_ms(pmu->timer_interval));
|
|
|
|
|
|
+out:
|
|
|
cpu_notifier_register_done();
|
|
|
|
|
|
return 0;
|