|
@@ -511,26 +511,31 @@ single_step_cont(struct pt_regs *regs, struct die_args *args)
|
|
|
return NOTIFY_STOP;
|
|
|
}
|
|
|
|
|
|
-static int was_in_debug_nmi[NR_CPUS];
|
|
|
+static DECLARE_BITMAP(was_in_debug_nmi, NR_CPUS);
|
|
|
|
|
|
static int kgdb_nmi_handler(unsigned int cmd, struct pt_regs *regs)
|
|
|
{
|
|
|
+ int cpu;
|
|
|
+
|
|
|
switch (cmd) {
|
|
|
case NMI_LOCAL:
|
|
|
if (atomic_read(&kgdb_active) != -1) {
|
|
|
/* KGDB CPU roundup */
|
|
|
- kgdb_nmicallback(raw_smp_processor_id(), regs);
|
|
|
- was_in_debug_nmi[raw_smp_processor_id()] = 1;
|
|
|
+ cpu = raw_smp_processor_id();
|
|
|
+ kgdb_nmicallback(cpu, regs);
|
|
|
+ set_bit(cpu, was_in_debug_nmi);
|
|
|
touch_nmi_watchdog();
|
|
|
+
|
|
|
return NMI_HANDLED;
|
|
|
}
|
|
|
break;
|
|
|
|
|
|
case NMI_UNKNOWN:
|
|
|
- if (was_in_debug_nmi[raw_smp_processor_id()]) {
|
|
|
- was_in_debug_nmi[raw_smp_processor_id()] = 0;
|
|
|
+ cpu = raw_smp_processor_id();
|
|
|
+
|
|
|
+ if (__test_and_clear_bit(cpu, was_in_debug_nmi))
|
|
|
return NMI_HANDLED;
|
|
|
- }
|
|
|
+
|
|
|
break;
|
|
|
default:
|
|
|
/* do nothing */
|