diff options
| -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); | ||
