• Andi Kleen's avatar
    x86, mce: switch machine check polling to per CPU timer · 52d168e2
    Andi Kleen authored
    Impact: Higher priority bug fix
    
    The machine check poller runs a single timer and then broadcasted an
    IPI to all CPUs to check them. This leads to unnecessary
    synchronization between CPUs. The original CPU running the timer has
    to wait potentially a long time for all other CPUs answering. This is
    also real time unfriendly and in general inefficient.
    
    This was especially a problem on systems with a lot of events where
    the poller run with a higher frequency after processing some events.
    There could be more and more CPU time wasted with this, to
    the point of significantly slowing down machines.
    
    The machine check polling is actually fully independent per CPU, so
    there's no reason to not just do this all with per CPU timers.  This
    patch implements that.
    
    Also switch the poller also to use standard timers instead of work
    queues. It was using work queues to be able to execute a user program
    on a event, but mce_notify_user() handles this case now with a
    separate callback. So instead always run the poll code in in a
    standard per CPU timer, which means that in the common case of not
    having to execute a trigger there will be less overhead.
    
    This allows to clean up the initialization significantly, because
    standard timers are already up when machine checks get init'ed.  No
    multiple initialization functions.
    
    Thanks to Thomas Gleixner for some help.
    
    Cc: thockin@google.com
    v2: Use del_timer_sync() on cpu shutdown and don't try to handle
    migrated timers.
    v3: Add WARN_ON for timer running on unexpected CPU
    Signed-off-by: default avatarAndi Kleen <ak@linux.intel.com>
    Acked-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarH. Peter Anvin <hpa@zytor.com>
    52d168e2
mce_64.c 22.8 KB