Skip to content
Snippets Groups Projects
  • Thomas Gleixner's avatar
    x86/apic: Mark _all_ legacy interrupts when IO/APIC is missing · a9c92fd4
    Thomas Gleixner authored
    
    stable inclusion
    from linux-4.19.194
    commit 7e25cb1b22f81239ae3332e14a1d0cff7014bccd
    
    --------------------------------
    
    commit 7d65f9e80646c595e8c853640a9d0768a33e204c upstream.
    
    PIC interrupts do not support affinity setting and they can end up on
    any online CPU. Therefore, it's required to mark the associated vectors
    as system-wide reserved. Otherwise, the corresponding irq descriptors
    are copied to the secondary CPUs but the vectors are not marked as
    assigned or reserved. This works correctly for the IO/APIC case.
    
    When the IO/APIC is disabled via config, kernel command line or lack of
    enumeration then all legacy interrupts are routed through the PIC, but
    nothing marks them as system-wide reserved vectors.
    
    As a consequence, a subsequent allocation on a secondary CPU can result in
    allocating one of these vectors, which triggers the BUG() in
    apic_update_vector() because the interrupt descriptor slot is not empty.
    
    Imran tried to work around that by marking those interrupts as allocated
    when a CPU comes online. But that's wrong in case that the IO/APIC is
    available and one of the legacy interrupts, e.g. IRQ0, has been switched to
    PIC mode because then marking them as allocated will fail as they are
    already marked as system vectors.
    
    Stay consistent and update the legacy vectors after attempting IO/APIC
    initialization and mark them as system vectors in case that no IO/APIC is
    available.
    
    Fixes: 69cde000 ("x86/vector: Use matrix allocator for vector assignment")
    Reported-by: default avatarImran Khan <imran.f.khan@oracle.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Signed-off-by: default avatarBorislav Petkov <bp@suse.de>
    Cc: stable@vger.kernel.org
    Link: https://lkml.kernel.org/r/20210519233928.2157496-1-imran.f.khan@oracle.com
    
    
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    Signed-off-by: default avatarYang Yingliang <yangyingliang@huawei.com>
    a9c92fd4