diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2018-10-20 11:45:31 -0500 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2018-10-20 11:45:31 -0500 |
commit | 0af6166395130b87713550c84c9518332f27cc28 (patch) | |
tree | 8d2f1a6c6a3f45d884b6b7bceae8c008bfea8b44 /drivers/pci | |
parent | ee8360fdafac54eefd0df69fbd99338896cf806b (diff) | |
parent | 4c1ef72e9b71a19fb405ebfcd37c0a5e16fa44ca (diff) | |
download | linux-0af6166395130b87713550c84c9518332f27cc28.tar.bz2 |
Merge branch 'pci/msi'
- Avoid panic when drivers enable MSI/MSI-X twice (Tonghao Zhang)
* pci/msi:
PCI/MSI: Warn and return error if driver enables MSI/MSI-X twice
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/msi.c | 9 |
1 files changed, 6 insertions, 3 deletions
diff --git a/drivers/pci/msi.c b/drivers/pci/msi.c index f2ef896464b3..af24ed50a245 100644 --- a/drivers/pci/msi.c +++ b/drivers/pci/msi.c @@ -958,7 +958,6 @@ static int __pci_enable_msix(struct pci_dev *dev, struct msix_entry *entries, } } } - WARN_ON(!!dev->msix_enabled); /* Check whether driver already requested for MSI irq */ if (dev->msi_enabled) { @@ -1028,8 +1027,6 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, if (!pci_msi_supported(dev, minvec)) return -EINVAL; - WARN_ON(!!dev->msi_enabled); - /* Check whether driver already requested MSI-X irqs */ if (dev->msix_enabled) { pci_info(dev, "can't enable MSI (MSI-X already enabled)\n"); @@ -1039,6 +1036,9 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec, if (maxvec < minvec) return -ERANGE; + if (WARN_ON_ONCE(dev->msi_enabled)) + return -EINVAL; + nvec = pci_msi_vec_count(dev); if (nvec < 0) return nvec; @@ -1087,6 +1087,9 @@ static int __pci_enable_msix_range(struct pci_dev *dev, if (maxvec < minvec) return -ERANGE; + if (WARN_ON_ONCE(dev->msix_enabled)) + return -EINVAL; + for (;;) { if (affd) { nvec = irq_calc_affinity_vectors(minvec, nvec, affd); |