diff options
Diffstat (limited to 'arch/x86_64/kernel/nmi.c')
-rw-r--r-- | arch/x86_64/kernel/nmi.c | 9 |
1 files changed, 5 insertions, 4 deletions
diff --git a/arch/x86_64/kernel/nmi.c b/arch/x86_64/kernel/nmi.c index 27e95e7922c1..186aebbae32d 100644 --- a/arch/x86_64/kernel/nmi.c +++ b/arch/x86_64/kernel/nmi.c | |||
@@ -193,6 +193,8 @@ void nmi_watchdog_default(void) | |||
193 | nmi_watchdog = NMI_IO_APIC; | 193 | nmi_watchdog = NMI_IO_APIC; |
194 | } | 194 | } |
195 | 195 | ||
196 | static int endflag __initdata = 0; | ||
197 | |||
196 | #ifdef CONFIG_SMP | 198 | #ifdef CONFIG_SMP |
197 | /* The performance counters used by NMI_LOCAL_APIC don't trigger when | 199 | /* The performance counters used by NMI_LOCAL_APIC don't trigger when |
198 | * the CPU is idle. To make sure the NMI watchdog really ticks on all | 200 | * the CPU is idle. To make sure the NMI watchdog really ticks on all |
@@ -200,7 +202,6 @@ void nmi_watchdog_default(void) | |||
200 | */ | 202 | */ |
201 | static __init void nmi_cpu_busy(void *data) | 203 | static __init void nmi_cpu_busy(void *data) |
202 | { | 204 | { |
203 | volatile int *endflag = data; | ||
204 | local_irq_enable_in_hardirq(); | 205 | local_irq_enable_in_hardirq(); |
205 | /* Intentionally don't use cpu_relax here. This is | 206 | /* Intentionally don't use cpu_relax here. This is |
206 | to make sure that the performance counter really ticks, | 207 | to make sure that the performance counter really ticks, |
@@ -208,14 +209,13 @@ static __init void nmi_cpu_busy(void *data) | |||
208 | pause instruction. On a real HT machine this is fine because | 209 | pause instruction. On a real HT machine this is fine because |
209 | all other CPUs are busy with "useless" delay loops and don't | 210 | all other CPUs are busy with "useless" delay loops and don't |
210 | care if they get somewhat less cycles. */ | 211 | care if they get somewhat less cycles. */ |
211 | while (*endflag == 0) | 212 | while (endflag == 0) |
212 | barrier(); | 213 | mb(); |
213 | } | 214 | } |
214 | #endif | 215 | #endif |
215 | 216 | ||
216 | int __init check_nmi_watchdog (void) | 217 | int __init check_nmi_watchdog (void) |
217 | { | 218 | { |
218 | volatile int endflag = 0; | ||
219 | int *counts; | 219 | int *counts; |
220 | int cpu; | 220 | int cpu; |
221 | 221 | ||
@@ -256,6 +256,7 @@ int __init check_nmi_watchdog (void) | |||
256 | if (!atomic_read(&nmi_active)) { | 256 | if (!atomic_read(&nmi_active)) { |
257 | kfree(counts); | 257 | kfree(counts); |
258 | atomic_set(&nmi_active, -1); | 258 | atomic_set(&nmi_active, -1); |
259 | endflag = 1; | ||
259 | return -1; | 260 | return -1; |
260 | } | 261 | } |
261 | endflag = 1; | 262 | endflag = 1; |