• Thomas Gleixner's avatar
    x86/apic/vector: Fix ordering in vector assignment · 190113b4
    Thomas Gleixner authored
    Prarit reported that depending on the affinity setting the
    
     ' irq $N: Affinity broken due to vector space exhaustion.'
    
    message is showing up in dmesg, but the vector space on the CPUs in the
    affinity mask is definitely not exhausted.
    
    Shung-Hsi provided traces and analysis which pinpoints the problem:
    
    The ordering of trying to assign an interrupt vector in
    assign_irq_vector_any_locked() is simply wrong if the interrupt data has a
    valid node assigned. It does:
    
     1) Try the intersection of affinity mask and node mask
     2) Try the node mask
     3) Try the full affinity mask
     4) Try the full online mask
    
    Obviously #2 and #3 are in the wrong order as the requested affinity
    mask has to take precedence.
    
    In the observed cases #1 failed because the affinity mask did not contain
    CPUs from node 0. That made it allocate a vector from node 0, thereby
    breaking affinity and emitting the misleading message.
    
    Revert the order of #2 and #3 so the full affinity mask without the node
    intersection is tried before actually affinity is broken.
    
    If no node is assigned then only the full affinity mask and if that fails
    the full online mask is tried.
    
    Fixes: d6ffc6ac ("x86/vector: Respect affinity mask in irq descriptor")
    Reported-by: default avatarPrarit Bhargava <prarit@redhat.com>
    Reported-by: default avatarShung-Hsi Yu <shung-hsi.yu@suse.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarShung-Hsi Yu <shung-hsi.yu@suse.com>
    Cc: stable@vger.kernel.org
    Link: https://lore.kernel.org/r/87ft4djtyp.fsf@nanos.tec.linutronix.de
    190113b4
vector.c 33.1 KB