• Thomas Gleixner's avatar
    genirq/msi, x86/vector: Prevent reservation mode for non maskable MSI · bc976233
    Thomas Gleixner authored
    The new reservation mode for interrupts assigns a dummy vector when the
    interrupt is allocated and assigns a real vector when the interrupt is
    requested. The reservation mode prevents vector pressure when devices with
    a large amount of queues/interrupts are initialized, but only a minimal
    subset of those queues/interrupts is actually used.
    
    This mode has an issue with MSI interrupts which cannot be masked. If the
    driver is not careful or the hardware emits an interrupt before the device
    irq is requestd by the driver then the interrupt ends up on the dummy
    vector as a spurious interrupt which can cause malfunction of the device or
    in the worst case a lockup of the machine.
    
    Change the logic for the reservation mode so that the early activation of
    MSI interrupts checks whether:
    
     - the device is a PCI/MSI device
     - the reservation mode of the underlying irqdomain is activated
     - PCI/MSI masking is globally enabled
     - the PCI/MSI device uses either MSI-X, which supports masking, or
       MSI with the maskbit supported.
    
    If one of those conditions is false, then clear the reservation mode flag
    in the irq data of the interrupt and invoke irq_domain_activate_irq() with
    the reserve argument cleared. In the x86 vector code, clear the can_reserve
    flag in the vector allocation data so a subsequent free_irq() won't create
    the same situation again. The interrupt stays assigned to a real vector
    until pci_disable_msi() is invoked and all allocations are undone.
    
    Fixes: 4900be83 ("x86/vector/msi: Switch to global reservation mode")
    Reported-by: default avatarAlexandru Chirvasitu <achirvasub@gmail.com>
    Reported-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
    Tested-by: default avatarAlexandru Chirvasitu <achirvasub@gmail.com>
    Tested-by: default avatarAndy Shevchenko <andriy.shevchenko@linux.intel.com>
    Cc: Dou Liyang <douly.fnst@cn.fujitsu.com>
    Cc: Pavel Machek <pavel@ucw.cz>
    Cc: Maciej W. Rozycki <macro@linux-mips.org>
    Cc: Mikael Pettersson <mikpelinux@gmail.com>
    Cc: Josh Poulson <jopoulso@microsoft.com>
    Cc: Mihai Costache <v-micos@microsoft.com>
    Cc: Stephen Hemminger <sthemmin@microsoft.com>
    Cc: Marc Zyngier <marc.zyngier@arm.com>
    Cc: linux-pci@vger.kernel.org
    Cc: Haiyang Zhang <haiyangz@microsoft.com>
    Cc: Dexuan Cui <decui@microsoft.com>
    Cc: Simon Xiao <sixiao@microsoft.com>
    Cc: Saeed Mahameed <saeedm@mellanox.com>
    Cc: Jork Loeser <Jork.Loeser@microsoft.com>
    Cc: Bjorn Helgaas <bhelgaas@google.com>
    Cc: devel@linuxdriverproject.org
    Cc: KY Srinivasan <kys@microsoft.com>
    Cc: Alan Cox <alan@linux.intel.com>
    Cc: Sakari Ailus <sakari.ailus@intel.com>,
    Cc: linux-media@vger.kernel.org
    Link: https://lkml.kernel.org/r/alpine.DEB.2.20.1712291406420.1899@nanos
    Link: https://lkml.kernel.org/r/alpine.DEB.2.20.1712291409460.1899@nanos
    bc976233
msi.c 13.1 KB