diff options
| -rw-r--r-- | arch/i386/kernel/cpu/mtrr/main.c | 4 |
1 files changed, 4 insertions, 0 deletions
diff --git a/arch/i386/kernel/cpu/mtrr/main.c b/arch/i386/kernel/cpu/mtrr/main.c index 55b005152a11..75dc6d5214bc 100644 --- a/arch/i386/kernel/cpu/mtrr/main.c +++ b/arch/i386/kernel/cpu/mtrr/main.c | |||
| @@ -229,6 +229,8 @@ static void set_mtrr(unsigned int reg, unsigned long base, | |||
| 229 | data.smp_size = size; | 229 | data.smp_size = size; |
| 230 | data.smp_type = type; | 230 | data.smp_type = type; |
| 231 | atomic_set(&data.count, num_booting_cpus() - 1); | 231 | atomic_set(&data.count, num_booting_cpus() - 1); |
| 232 | /* make sure data.count is visible before unleashing other CPUs */ | ||
| 233 | smp_wmb(); | ||
| 232 | atomic_set(&data.gate,0); | 234 | atomic_set(&data.gate,0); |
| 233 | 235 | ||
| 234 | /* Start the ball rolling on other CPUs */ | 236 | /* Start the ball rolling on other CPUs */ |
| @@ -242,6 +244,7 @@ static void set_mtrr(unsigned int reg, unsigned long base, | |||
| 242 | 244 | ||
| 243 | /* ok, reset count and toggle gate */ | 245 | /* ok, reset count and toggle gate */ |
| 244 | atomic_set(&data.count, num_booting_cpus() - 1); | 246 | atomic_set(&data.count, num_booting_cpus() - 1); |
| 247 | smp_wmb(); | ||
| 245 | atomic_set(&data.gate,1); | 248 | atomic_set(&data.gate,1); |
| 246 | 249 | ||
| 247 | /* do our MTRR business */ | 250 | /* do our MTRR business */ |
| @@ -260,6 +263,7 @@ static void set_mtrr(unsigned int reg, unsigned long base, | |||
| 260 | cpu_relax(); | 263 | cpu_relax(); |
| 261 | 264 | ||
| 262 | atomic_set(&data.count, num_booting_cpus() - 1); | 265 | atomic_set(&data.count, num_booting_cpus() - 1); |
| 266 | smp_wmb(); | ||
| 263 | atomic_set(&data.gate,0); | 267 | atomic_set(&data.gate,0); |
| 264 | 268 | ||
| 265 | /* | 269 | /* |
