• Thomas Gleixner's avatar
    genirq/generic_pending: Do not lose pending affinity update · a33a5d2d
    Thomas Gleixner authored
    The generic pending interrupt mechanism moves interrupts from the interrupt
    handler on the original target CPU to the new destination CPU. This is
    required for x86 and ia64 due to the way the interrupt delivery and
    acknowledge works if the interrupts are not remapped.
    
    However that update can fail for various reasons. Some of them are valid
    reasons to discard the pending update, but the case, when the previous move
    has not been fully cleaned up is not a legit reason to fail.
    
    Check the return value of irq_do_set_affinity() for -EBUSY, which indicates
    a pending cleanup, and rearm the pending move in the irq dexcriptor so it's
    tried again when the next interrupt arrives.
    
    Fixes: 996c5912 ("x86/irq: Plug vector cleanup race")
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarSong Liu <songliubraving@fb.com>
    Cc: Joerg Roedel <jroedel@suse.de>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Song Liu <liu.song.a23@gmail.com>
    Cc: Dmitry Safonov <0x7f454c46@gmail.com>
    Cc: stable@vger.kernel.org
    Cc: Mike Travis <mike.travis@hpe.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Tariq Toukan <tariqt@mellanox.com>
    Link: https://lkml.kernel.org/r/20180604162224.386544292@linutronix.de
    a33a5d2d
migration.c 3.13 KB