• Thomas Gleixner's avatar
    genirq/affinity: Defer affinity setting if irq chip is busy · 12f47073
    Thomas Gleixner authored
    The case that interrupt affinity setting fails with -EBUSY can be handled
    in the kernel completely by using the already available generic pending
    infrastructure.
    
    If a irq_chip::set_affinity() fails with -EBUSY, handle it like the
    interrupts for which irq_chip::set_affinity() can only be invoked from
    interrupt context. Copy the new affinity mask to irq_desc::pending_mask and
    set the affinity pending bit. The next raised interrupt for the affected
    irq will check the pending bit and try to set the new affinity from the
    handler. This avoids that -EBUSY is returned when an affinity change is
    requested from user space and the previous change has not been cleaned
    up. The new affinity will take effect when the next interrupt is raised
    from the device.
    
    Fixes: dccfe314 ("x86/vector: Simplify vector move cleanup")
    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.819273597@linutronix.de
    12f47073
manage.c 58.6 KB