• Thomas Gleixner's avatar
    irq/matrix: Spread interrupts on allocation · a0c9259d
    Thomas Gleixner authored
    Keith reported an issue with vector space exhaustion on a server machine
    which is caused by the i40e driver allocating 168 MSI interrupts when the
    driver is initialized, even when most of these interrupts are not used at
    all.
    
    The x86 vector allocation code tries to avoid the immediate allocation with
    the reservation mode, but the card uses MSI and does not support MSI entry
    masking, which prevents reservation mode and requires immediate vector
    allocation.
    
    The matrix allocator is a bit naive and prefers the first CPU in the
    cpumask which describes the possible target CPUs for an allocation. That
    results in allocating all 168 vectors on CPU0 which later causes vector
    space exhaustion when the NVMe driver tries to allocate managed interrupts
    on each CPU for the per CPU queues.
    
    Avoid this by finding the CPU which has the lowest vector allocation count
    to spread out the non managed interrupt accross the possible target CPUs.
    
    Fixes: 2f75d9e1 ("genirq: Implement bitmap matrix allocator")
    Reported-by: default avatarKeith Busch <keith.busch@intel.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarKeith Busch <keith.busch@intel.com>
    Link: https://lkml.kernel.org/r/alpine.DEB.2.20.1801171557330.1777@nanos
    a0c9259d
matrix.c 11.9 KB