• Alex Williamson's avatar
    PCI/portdrv: Use shared MSI/MSI-X vector for Bandwidth Management · 15d2aba7
    Alex Williamson authored
    The Interrupt Message Number in the PCIe Capabilities register (PCIe r4.0,
    sec 7.5.3.2) indicates which MSI/MSI-X vector is shared by interrupts
    related to the PCIe Capability, including Link Bandwidth Management and
    Link Autonomous Bandwidth Interrupts (Link Control, 7.5.3.7), Command
    Completed and Hot-Plug Interrupts (Slot Control, 7.5.3.10), and the PME
    Interrupt (Root Control, 7.5.3.12).
    
    pcie_message_numbers() checked whether we want to enable PME or Hot-Plug
    interrupts but neglected to check for Link Bandwidth Management, so if we
    only wanted the Bandwidth Management interrupts, it decided we didn't need
    any vectors at all.  Then pcie_port_enable_irq_vec() tried to reallocate
    zero vectors, which failed, resulting in fallback to INTx.
    
    On some systems, e.g., an X79-based workstation, that INTx seems broken or
    not handled correctly, so we got spurious IRQ16 interrupts for Bandwidth
    Management events.
    
    Change pcie_message_numbers() so that if we want Link Bandwidth Management
    interrupts, we use the shared MSI/MSI-X vector from the PCIe Capabilities
    register.
    
    Fixes: e8303bb7 ("PCI/LINK: Report degraded links via link bandwidth notification")
    Link: https://lore.kernel.org/lkml/155597243666.19387.1205950870601742062.stgit@gimli.homeSigned-off-by: default avatarAlex Williamson <alex.williamson@redhat.com>
    [bhelgaas: changelog]
    Signed-off-by: default avatarBjorn Helgaas <bhelgaas@google.com>
    15d2aba7
portdrv_core.c 16.4 KB