Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6
[cascardo/linux.git] / arch / x86 / lib / msr.c
index 1440b9c..caa24ac 100644 (file)
@@ -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);