lkml.org 
[lkml]   [2017]   [Dec]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 132/159] powerpc/xmon: Avoid tripping SMP hardlockup watchdog
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    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.

    Signed-off-by: Nicholas Piggin <npiggin@gmail.com>
    Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
    Signed-off-by: Sasha Levin <alexander.levin@verizon.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    arch/powerpc/xmon/xmon.c | 17 +++++++++++++----
    1 file changed, 13 insertions(+), 4 deletions(-)

    --- a/arch/powerpc/xmon/xmon.c
    +++ b/arch/powerpc/xmon/xmon.c
    @@ -530,14 +530,19 @@ static int xmon_core(struct pt_regs *reg

    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 */
    @@ -568,21 +573,25 @@ static int xmon_core(struct pt_regs *reg
    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) {

    \
     
     \ /
      Last update: 2017-12-22 10:09    [W:20.826 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site