• A
    x86, mce: implement bootstrapping for machine check wakeups · ccc3c319
    Andi Kleen 提交于
    Machine checks support waking up the mcelog daemon quickly.
    
    The original wake up code for this was pretty ugly, relying on
    a idle notifier and a special process flag. The reason it did
    it this way is that the machine check handler is not subject
    to normal interrupt locking rules so it's not safe
    to call wake_up().  Instead it set a process flag
    and then either did the wakeup in the syscall return
    or in the idle notifier.
    
    This patch adds a new "bootstraping" method as replacement.
    
    The idea is that the handler checks if it's in a state where
    it is unsafe to call wake_up(). If it's safe it calls it directly.
    When it's not safe -- that is it interrupted in a critical
    section with interrupts disables -- it uses a new "self IPI" to trigger
    an IPI to its own CPU. This can be done safely because IPI
    triggers are atomic with some care. The IPI is raised
    once the interrupts are reenabled and can then safely call
    wake_up().
    
    When APICs are disabled the event is just queued and will be picked up
    eventually by the next polling timer. I think that's a reasonable
    compromise, since it should only happen quite rarely.
    
    Contains fixes from Ying Huang.
    
    [ solve conflict on irqinit, make it work on 32bit (entry_arch.h) - HS ]
    Signed-off-by: NAndi Kleen <ak@linux.intel.com>
    Signed-off-by: NHidetoshi Seto <seto.hidetoshi@jp.fujitsu.com>
    Signed-off-by: NH. Peter Anvin <hpa@zytor.com>
    ccc3c319
mce.c 32.3 KB