|
@@ -89,16 +89,13 @@ void rdmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs)
|
|
|
rv.msrs = msrs;
|
|
|
rv.msr_no = msr_no;
|
|
|
|
|
|
- preempt_disable();
|
|
|
- /*
|
|
|
- * FIXME: handle the CPU we're executing on separately for now until
|
|
|
- * smp_call_function_many has been fixed to not skip it.
|
|
|
- */
|
|
|
- this_cpu = raw_smp_processor_id();
|
|
|
- smp_call_function_single(this_cpu, __rdmsr_on_cpu, &rv, 1);
|
|
|
+ this_cpu = get_cpu();
|
|
|
+
|
|
|
+ if (cpumask_test_cpu(this_cpu, mask))
|
|
|
+ __rdmsr_on_cpu(&rv);
|
|
|
|
|
|
smp_call_function_many(mask, __rdmsr_on_cpu, &rv, 1);
|
|
|
- preempt_enable();
|
|
|
+ put_cpu();
|
|
|
}
|
|
|
EXPORT_SYMBOL(rdmsr_on_cpus);
|
|
|
|
|
@@ -121,16 +118,13 @@ void wrmsr_on_cpus(const cpumask_t *mask, u32 msr_no, struct msr *msrs)
|
|
|
rv.msrs = msrs;
|
|
|
rv.msr_no = msr_no;
|
|
|
|
|
|
- preempt_disable();
|
|
|
- /*
|
|
|
- * FIXME: handle the CPU we're executing on separately for now until
|
|
|
- * smp_call_function_many has been fixed to not skip it.
|
|
|
- */
|
|
|
- this_cpu = raw_smp_processor_id();
|
|
|
- smp_call_function_single(this_cpu, __wrmsr_on_cpu, &rv, 1);
|
|
|
+ this_cpu = get_cpu();
|
|
|
+
|
|
|
+ if (cpumask_test_cpu(this_cpu, mask))
|
|
|
+ __wrmsr_on_cpu(&rv);
|
|
|
|
|
|
smp_call_function_many(mask, __wrmsr_on_cpu, &rv, 1);
|
|
|
- preempt_enable();
|
|
|
+ put_cpu();
|
|
|
}
|
|
|
EXPORT_SYMBOL(wrmsr_on_cpus);
|
|
|
|