diff options
Diffstat (limited to 'arch/x86/lib/msr.c')
| -rw-r--r-- | arch/x86/lib/msr.c | 26 | 
1 files changed, 10 insertions, 16 deletions
diff --git a/arch/x86/lib/msr.c b/arch/x86/lib/msr.c index 1440b9c0547..caa24aca811 100644 --- a/arch/x86/lib/msr.c +++ b/arch/x86/lib/msr.c @@ -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);  |