On Thu, Dec 14, 2017 at 12:10:39AM +1100, Michael Ellerman wrote:
alexander.levin@verizon.com writes:
From: Nicholas Piggin npiggin@gmail.com
[ 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();
} else { cmd = cmds(regs); if (cmd != 0) {touch_nmi_watchdog();
-- 2.11.0