Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
fork

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'irq-urgent-2025-06-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip

Pull irq fix from Thomas Gleixner:
"A single fix for the PCI/MSI code:

The conversion to per device MSI domains created a MSI domain with
size 1 instead of sizing it to the maximum possible number of MSI
interrupts for the device. This "worked" as the subsequent allocations
resized the domain, but the recent change to move the prepare() call
into the domain creation path broke this works by chance mechanism.

Size the domain properly at creation time"

* tag 'irq-urgent-2025-06-08' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
PCI/MSI: Size device MSI domain with the maximum number of vectors

+8 -7
+3 -2
drivers/pci/msi/irqdomain.c
··· 271 271 /** 272 272 * pci_setup_msi_device_domain - Setup a device MSI interrupt domain 273 273 * @pdev: The PCI device to create the domain on 274 + * @hwsize: The maximum number of MSI vectors 274 275 * 275 276 * Return: 276 277 * True when: ··· 288 287 * - The device is removed 289 288 * - MSI is disabled and a MSI-X domain is created 290 289 */ 291 - bool pci_setup_msi_device_domain(struct pci_dev *pdev) 290 + bool pci_setup_msi_device_domain(struct pci_dev *pdev, unsigned int hwsize) 292 291 { 293 292 if (WARN_ON_ONCE(pdev->msix_enabled)) 294 293 return false; ··· 298 297 if (pci_match_device_domain(pdev, DOMAIN_BUS_PCI_DEVICE_MSIX)) 299 298 msi_remove_device_irq_domain(&pdev->dev, MSI_DEFAULT_DOMAIN); 300 299 301 - return pci_create_device_domain(pdev, &pci_msi_template, 1); 300 + return pci_create_device_domain(pdev, &pci_msi_template, hwsize); 302 301 } 303 302 304 303 /**
+4 -4
drivers/pci/msi/msi.c
··· 439 439 if (nvec < minvec) 440 440 return -ENOSPC; 441 441 442 - if (nvec > maxvec) 443 - nvec = maxvec; 444 - 445 442 rc = pci_setup_msi_context(dev); 446 443 if (rc) 447 444 return rc; 448 445 449 - if (!pci_setup_msi_device_domain(dev)) 446 + if (!pci_setup_msi_device_domain(dev, nvec)) 450 447 return -ENODEV; 448 + 449 + if (nvec > maxvec) 450 + nvec = maxvec; 451 451 452 452 for (;;) { 453 453 if (affd) {
+1 -1
drivers/pci/msi/msi.h
··· 107 107 }; 108 108 109 109 bool pci_msi_domain_supports(struct pci_dev *dev, unsigned int feature_mask, enum support_mode mode); 110 - bool pci_setup_msi_device_domain(struct pci_dev *pdev); 110 + bool pci_setup_msi_device_domain(struct pci_dev *pdev, unsigned int hwsize); 111 111 bool pci_setup_msix_device_domain(struct pci_dev *pdev, unsigned int hwsize); 112 112 113 113 /* Legacy (!IRQDOMAIN) fallbacks */