On Thu, Dec 14, 2017 at 12:10:39AM +1100, Michael Ellerman wrote: >alexander.levin@xxxxxxxxxxx writes: > >> From: Nicholas Piggin <npiggin@xxxxxxxxx> >> >> [ Upstream commit 064996d62a33ffe10264b5af5dca92d54f60f806 ] >> >> The SMP hardlockup watchdog cross-checks other CPUs for lockups, which >> causes xmon headaches because it's assuming interrupts hard disabled >> means no watchdog troubles. Try to improve that by calling >> touch_nmi_watchdog() in obvious places where secondaries are spinning. >> >> Also annotate these spin loops with spin_begin/end calls. > >These macros didn't exist until 4.13, and haven't been backported AFAIK. But the touch_nmi_watchdog() bits are something we want in stable, right? >> diff --git a/arch/powerpc/xmon/xmon.c b/arch/powerpc/xmon/xmon.c >> index e23f559faa47..6cec1081cb67 100644 >> --- a/arch/powerpc/xmon/xmon.c >> +++ b/arch/powerpc/xmon/xmon.c >> @@ -436,14 +436,19 @@ static int xmon_core(struct pt_regs *regs, int fromipi) >> >> waiting: >> secondary = 1; >> + spin_begin(); >> while (secondary && !xmon_gate) { >> if (in_xmon == 0) { >> - if (fromipi) >> + if (fromipi) { >> + spin_end(); >> goto leave; >> + } >> secondary = test_and_set_bit(0, &in_xmon); >> } >> - barrier(); >> + spin_cpu_relax(); >> + touch_nmi_watchdog(); >> } >> + spin_end(); >> >> if (!secondary && !xmon_gate) { >> /* we are the first cpu to come in */ >> @@ -470,21 +475,25 @@ static int xmon_core(struct pt_regs *regs, int fromipi) >> mb(); >> xmon_gate = 1; >> barrier(); >> + touch_nmi_watchdog(); >> } >> >> cmdloop: >> while (in_xmon) { >> if (secondary) { >> + spin_begin(); >> if (cpu == xmon_owner) { >> if (!test_and_set_bit(0, &xmon_taken)) { >> secondary = 0; >> + spin_end(); >> continue; >> } >> /* missed it */ >> while (cpu == xmon_owner) >> - barrier(); >> + spin_cpu_relax(); >> } >> - barrier(); >> + spin_cpu_relax(); >> + touch_nmi_watchdog(); >> } else { >> cmd = cmds(regs); >> if (cmd != 0) { >> -- >> 2.11.0 -- Thanks, Sasha