aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/nmi.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/kernel/nmi.c')
-rw-r--r--arch/x86_64/kernel/nmi.c9
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
196static 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 */
201static __init void nmi_cpu_busy(void *data) 203static __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
216int __init check_nmi_watchdog (void) 217int __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;