• Linus Torvalds's avatar
    x86: Do not schedule while still in NMI context · 549c89b9
    Linus Torvalds authored
    The NMI handler uses the paranoid_exit routine that checks the
    NEED_RESCHED flag, and if it is set and the return is for userspace,
    then interrupts are enabled, the stack is swapped to the thread's stack,
    and schedule is called. The problem with this is that we are still in an
    NMI context until an iret is executed. This means that any new NMIs are
    now starved until an interrupt or exception occurs and does the iret.
    
    As NMIs can not be masked and can interrupt any location, they are
    treated as a special case. NEED_RESCHED should not be set in an NMI
    handler. The interruption by the NMI should not disturb the work flow
    for scheduling. Any IPI sent to a processor after sending the
    NEED_RESCHED would have to wait for the NMI anyway, and after the IPI
    finishes the schedule would be called as required.
    
    There is no reason to do anything special leaving an NMI. Remove the
    call to paranoid_exit and do a simple return. This not only fixes the
    bug of starved NMIs, but it also cleans up the code.
    
    Link: http://lkml.kernel.org/r/CA+55aFzgM55hXTs4griX5e9=v_O+=ue+7Rj0PTD=M7hFYpyULQ@mail.gmail.comAcked-by: default avatarAndi Kleen <ak@linux.intel.com>
    Cc: Ingo Molnar <mingo@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: "H. Peter Anvin" <hpa@linux.intel.com>
    Cc: Frederic Weisbecker <fweisbec@gmail.com>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Cc: Paul Turner <pjt@google.com>
    Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: default avatarSteven Rostedt <rostedt@goodmis.org>
    549c89b9
entry_64.S 36.5 KB