• O
    stop_machine: Touch_nmi_watchdog() after MULTI_STOP_PREPARE · ce4f06dc
    Oleg Nesterov 提交于
    Suppose that stop_machine(fn) hangs because fn() hangs. In this case NMI
    hard-lockup can be triggered on another CPU which does nothing wrong and
    the trace from nmi_panic() won't help to investigate the problem.
    
    And this change "fixes" the problem we (seem to) hit in practice.
    
     - stop_two_cpus(0, 1) races with show_state_filter() running on CPU_0.
    
     - CPU_1 already spins in MULTI_STOP_PREPARE state, it detects the soft
       lockup and tries to report the problem.
    
     - show_state_filter() enables preemption, CPU_0 calls multi_cpu_stop()
       which goes to MULTI_STOP_DISABLE_IRQ state and disables interrupts.
    
     - CPU_1 spends more than 10 seconds trying to flush the log buffer to
       the slow serial console.
    
     - NMI interrupt on CPU_0 (which now waits for CPU_1) calls nmi_panic().
    Reported-by: NWang Shu <shuwang@redhat.com>
    Signed-off-by: NOleg Nesterov <oleg@redhat.com>
    Reviewed-by: NThomas Gleixner <tglx@linutronix.de>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Dave Anderson <anderson@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Paul E. McKenney <paulmck@linux.vnet.ibm.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Tejun Heo <tj@kernel.org>
    Link: http://lkml.kernel.org/r/20160726185736.GB4088@redhat.comSigned-off-by: NIngo Molnar <mingo@kernel.org>
    ce4f06dc
stop_machine.c 16.7 KB