mirror of
https://github.com/torvalds/linux.git
synced 2026-05-31 02:24:24 +02:00
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. -----BEGIN PGP SIGNATURE----- iQJHBAABCgAxFiEEQp8+kY+LLUocC4bMphj1TA10mKEFAmhFOE0THHRnbHhAbGlu dXRyb25peC5kZQAKCRCmGPVMDXSYoYfnEACmXJTgWGKPwu8mnGH0hV0NxRMSeMbB vg3mAkFkeKoKADm7oElRrQbdnwmVIvUcMnmFrQBItBnIlsPBVVC+lxxjTeCS6oFf gB46SzwBv/IqYK+0M1kw+umyF4oaxXjwR498OV0AmQBLZ0344sJXVbKKqR7KFoB8 xypGMPN5IkCw13ApgdHINmMohSajLiQLOnAMyxYQ+cR61de/zcwaOuuv/xgg2NRW Eu4RPlXcQq1KSETP60jYTkuXMPvtzD1okvewv6/m6DNj9YJxbKoDaCVP/8O6fqDi XsGUiQXmAA+4GgyTqYLqpKlQ1qsbgrj0nIyDRp3npdq/WzOWp1zlCZJ7CrIurDme KEtDdEJocgnJ0kOxwJBJUD6FKm8CnyvWIzDzldA+OfDcOfs3CSejfpDS/UfYweUI dFCbznumypnioUbtXDCpG4mqB/jN4ccv6TdGMxM/9FOdzJqGY06EAyh6qppfxGen QecnAzCml3RXzbBf8my5h3k0wcjOdljAVBT/l1isPWkZLSSUgg7M9wFkeF0O43eO Y+AbYu6N1Axe6IWdrbvcyPfiTvjMBl7iD7ovrRrVLCMfKqXxjnmJBLcQzLhmWBJ5 A/4P2+oSpunvwjf7NMQXCYCH4ma8xyk6HkHS3BGsdHCIBMmrKpV2ViaXr728lmw6 uJoArqvYpmDXZQ== =G1bH -----END PGP SIGNATURE----- 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
This commit is contained in:
commit
70b7d651ca
|
|
@ -271,6 +271,7 @@ static bool pci_create_device_domain(struct pci_dev *pdev, const struct msi_doma
|
|||
/**
|
||||
* pci_setup_msi_device_domain - Setup a device MSI interrupt domain
|
||||
* @pdev: The PCI device to create the domain on
|
||||
* @hwsize: The maximum number of MSI vectors
|
||||
*
|
||||
* Return:
|
||||
* True when:
|
||||
|
|
@ -287,7 +288,7 @@ static bool pci_create_device_domain(struct pci_dev *pdev, const struct msi_doma
|
|||
* - The device is removed
|
||||
* - MSI is disabled and a MSI-X domain is created
|
||||
*/
|
||||
bool pci_setup_msi_device_domain(struct pci_dev *pdev)
|
||||
bool pci_setup_msi_device_domain(struct pci_dev *pdev, unsigned int hwsize)
|
||||
{
|
||||
if (WARN_ON_ONCE(pdev->msix_enabled))
|
||||
return false;
|
||||
|
|
@ -297,7 +298,7 @@ bool pci_setup_msi_device_domain(struct pci_dev *pdev)
|
|||
if (pci_match_device_domain(pdev, DOMAIN_BUS_PCI_DEVICE_MSIX))
|
||||
msi_remove_device_irq_domain(&pdev->dev, MSI_DEFAULT_DOMAIN);
|
||||
|
||||
return pci_create_device_domain(pdev, &pci_msi_template, 1);
|
||||
return pci_create_device_domain(pdev, &pci_msi_template, hwsize);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -439,16 +439,16 @@ int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
|
|||
if (nvec < minvec)
|
||||
return -ENOSPC;
|
||||
|
||||
if (nvec > maxvec)
|
||||
nvec = maxvec;
|
||||
|
||||
rc = pci_setup_msi_context(dev);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
if (!pci_setup_msi_device_domain(dev))
|
||||
if (!pci_setup_msi_device_domain(dev, nvec))
|
||||
return -ENODEV;
|
||||
|
||||
if (nvec > maxvec)
|
||||
nvec = maxvec;
|
||||
|
||||
for (;;) {
|
||||
if (affd) {
|
||||
nvec = irq_calc_affinity_vectors(minvec, nvec, affd);
|
||||
|
|
|
|||
|
|
@ -107,7 +107,7 @@ enum support_mode {
|
|||
};
|
||||
|
||||
bool pci_msi_domain_supports(struct pci_dev *dev, unsigned int feature_mask, enum support_mode mode);
|
||||
bool pci_setup_msi_device_domain(struct pci_dev *pdev);
|
||||
bool pci_setup_msi_device_domain(struct pci_dev *pdev, unsigned int hwsize);
|
||||
bool pci_setup_msix_device_domain(struct pci_dev *pdev, unsigned int hwsize);
|
||||
|
||||
/* Legacy (!IRQDOMAIN) fallbacks */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user