• Don Zickus's avatar
    x86/reboot: Use NMI to assist in shutting down if IRQ fails · 7d007d21
    Don Zickus authored
    For v3.3, I added code to use the NMI to stop other cpus in the
    panic case.  The idea was to make sure all cpus on the system
    were definitely halted to help serialize the panic path to
    execute the rest of the code on a single cpu.
    
    The main problem it was trying to solve was how to stop a cpu
    that was spinning with its irqs disabled.  A IPI irq would be
    stuck and couldn't get in there, but an NMI could.
    
    Things were great until we had another conversation about some
    pstore changes.  Because some of the backend pstore still uses
    spinlocks to protect the device access, things could get ugly if
    a panic happened and we were stuck spinning on a lock.
    
    Now with the NMI shutting down cpus, we could assume no other
    cpus were running and just bust the spin lock and proceed.
    
    The counter argument was, well if you do that the backend could
    be in a screwed up state and you might not be able to save
    anything as a result. If we could have just given the cpu a
    little more time to finish things, we could have grabbed the
    spin lock cleanly and everything would have been fine.
    
    Well, how do give a cpu a 'little more time' in the panic case?
    For the most part you can't without spinning on the lock and
    even in that case, how long do you spin for?
    
    So instead of making it ugly in the pstore code, just mimic the
    idea that stop_machine had, which is block on an IRQ IPI until
    the remote cpu has re-enabled interrupts and left the critical
    region.  Which is what happens now using REBOOT_IRQ.
    
    Then leave the NMI case for those cpus that are truly stuck
    after a short time.  This leaves the current behaviour alone and
    just handle a corner case.  Most systems should never have to
    enter the NMI code and if they do, print out a message in case
    the NMI itself causes another issue.
    Signed-off-by: default avatarDon Zickus <dzickus@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Link: http://lkml.kernel.org/r/1336761675-24296-3-git-send-email-dzickus@redhat.comSigned-off-by: default avatarIngo Molnar <mingo@kernel.org>
    7d007d21
smp.c 8.4 KB