diff options
| author | Borislav Petkov <borislav.petkov@amd.com> | 2010-01-22 10:01:03 -0500 |
|---|---|---|
| committer | H. Peter Anvin <hpa@zytor.com> | 2010-01-22 19:05:42 -0500 |
| commit | a7b480e7f30b3813353ec009f10f2ac7a6669f3b (patch) | |
| tree | 90ddc7a1ee6f1686699f77df39a3ff8a9d45d7a1 | |
| parent | 92dcffb916d309aa01778bf8963a6932e4014d07 (diff) | |
x86, lib: Add wbinvd smp helpers
Add wbinvd_on_cpu and wbinvd_on_all_cpus stubs for executing wbinvd on a
particular CPU.
[ hpa: renamed lib/smp.c to lib/cache-smp.c ]
[ hpa: wbinvd_on_all_cpus() returns int, but wbinvd() returns
void. Thus, the former cannot be a macro for the latter,
replace with an inline function. ]
Signed-off-by: Borislav Petkov <borislav.petkov@amd.com>
LKML-Reference: <1264172467-25155-2-git-send-email-bp@amd64.org>
Signed-off-by: H. Peter Anvin <hpa@zytor.com>
| -rw-r--r-- | arch/x86/include/asm/smp.h | 9 | ||||
| -rw-r--r-- | arch/x86/lib/Makefile | 2 | ||||
| -rw-r--r-- | arch/x86/lib/cache-smp.c | 19 |
3 files changed, 29 insertions, 1 deletions
diff --git a/arch/x86/include/asm/smp.h b/arch/x86/include/asm/smp.h index 1e796782cd7b..4cfc90824068 100644 --- a/arch/x86/include/asm/smp.h +++ b/arch/x86/include/asm/smp.h | |||
| @@ -135,6 +135,8 @@ int native_cpu_disable(void); | |||
| 135 | void native_cpu_die(unsigned int cpu); | 135 | void native_cpu_die(unsigned int cpu); |
| 136 | void native_play_dead(void); | 136 | void native_play_dead(void); |
| 137 | void play_dead_common(void); | 137 | void play_dead_common(void); |
| 138 | void wbinvd_on_cpu(int cpu); | ||
| 139 | int wbinvd_on_all_cpus(void); | ||
| 138 | 140 | ||
| 139 | void native_send_call_func_ipi(const struct cpumask *mask); | 141 | void native_send_call_func_ipi(const struct cpumask *mask); |
| 140 | void native_send_call_func_single_ipi(int cpu); | 142 | void native_send_call_func_single_ipi(int cpu); |
| @@ -147,6 +149,13 @@ static inline int num_booting_cpus(void) | |||
| 147 | { | 149 | { |
| 148 | return cpumask_weight(cpu_callout_mask); | 150 | return cpumask_weight(cpu_callout_mask); |
| 149 | } | 151 | } |
| 152 | #else /* !CONFIG_SMP */ | ||
| 153 | #define wbinvd_on_cpu(cpu) wbinvd() | ||
| 154 | static inline int wbinvd_on_all_cpus(void) | ||
| 155 | { | ||
| 156 | wbinvd(); | ||
| 157 | return 0; | ||
| 158 | } | ||
| 150 | #endif /* CONFIG_SMP */ | 159 | #endif /* CONFIG_SMP */ |
| 151 | 160 | ||
| 152 | extern unsigned disabled_cpus __cpuinitdata; | 161 | extern unsigned disabled_cpus __cpuinitdata; |
diff --git a/arch/x86/lib/Makefile b/arch/x86/lib/Makefile index cffd754f3039..d85e0e438b58 100644 --- a/arch/x86/lib/Makefile +++ b/arch/x86/lib/Makefile | |||
| @@ -14,7 +14,7 @@ $(obj)/inat.o: $(obj)/inat-tables.c | |||
| 14 | 14 | ||
| 15 | clean-files := inat-tables.c | 15 | clean-files := inat-tables.c |
| 16 | 16 | ||
| 17 | obj-$(CONFIG_SMP) += msr-smp.o | 17 | obj-$(CONFIG_SMP) += msr-smp.o cache-smp.o |
| 18 | 18 | ||
| 19 | lib-y := delay.o | 19 | lib-y := delay.o |
| 20 | lib-y += thunk_$(BITS).o | 20 | lib-y += thunk_$(BITS).o |
diff --git a/arch/x86/lib/cache-smp.c b/arch/x86/lib/cache-smp.c new file mode 100644 index 000000000000..a3c668875038 --- /dev/null +++ b/arch/x86/lib/cache-smp.c | |||
| @@ -0,0 +1,19 @@ | |||
| 1 | #include <linux/smp.h> | ||
| 2 | #include <linux/module.h> | ||
| 3 | |||
| 4 | static void __wbinvd(void *dummy) | ||
| 5 | { | ||
| 6 | wbinvd(); | ||
| 7 | } | ||
| 8 | |||
| 9 | void wbinvd_on_cpu(int cpu) | ||
| 10 | { | ||
| 11 | smp_call_function_single(cpu, __wbinvd, NULL, 1); | ||
| 12 | } | ||
| 13 | EXPORT_SYMBOL(wbinvd_on_cpu); | ||
| 14 | |||
| 15 | int wbinvd_on_all_cpus(void) | ||
| 16 | { | ||
| 17 | return on_each_cpu(__wbinvd, NULL, 1); | ||
| 18 | } | ||
| 19 | EXPORT_SYMBOL(wbinvd_on_all_cpus); | ||
