aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBjorn Helgaas <bhelgaas@google.com>2018-10-20 12:45:31 -0400
committerBjorn Helgaas <bhelgaas@google.com>2018-10-20 12:45:31 -0400
commit0af6166395130b87713550c84c9518332f27cc28 (patch)
tree8d2f1a6c6a3f45d884b6b7bceae8c008bfea8b44
parentee8360fdafac54eefd0df69fbd99338896cf806b (diff)
parent4c1ef72e9b71a19fb405ebfcd37c0a5e16fa44ca (diff)
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
-rw-r--r--drivers/pci/msi.c9
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,
958 } 958 }
959 } 959 }
960 } 960 }
961 WARN_ON(!!dev->msix_enabled);
962 961
963 /* Check whether driver already requested for MSI irq */ 962 /* Check whether driver already requested for MSI irq */
964 if (dev->msi_enabled) { 963 if (dev->msi_enabled) {
@@ -1028,8 +1027,6 @@ static int __pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec,
1028 if (!pci_msi_supported(dev, minvec)) 1027 if (!pci_msi_supported(dev, minvec))
1029 return -EINVAL; 1028 return -EINVAL;
1030 1029
1031 WARN_ON(!!dev->msi_enabled);
1032
1033 /* Check whether driver already requested MSI-X irqs */ 1030 /* Check whether driver already requested MSI-X irqs */
1034 if (dev->msix_enabled) { 1031 if (dev->msix_enabled) {
1035 pci_info(dev, "can't enable MSI (MSI-X already enabled)\n"); 1032 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,
1039 if (maxvec < minvec) 1036 if (maxvec < minvec)
1040 return -ERANGE; 1037 return -ERANGE;
1041 1038
1039 if (WARN_ON_ONCE(dev->msi_enabled))
1040 return -EINVAL;
1041
1042 nvec = pci_msi_vec_count(dev); 1042 nvec = pci_msi_vec_count(dev);
1043 if (nvec < 0) 1043 if (nvec < 0)
1044 return nvec; 1044 return nvec;
@@ -1087,6 +1087,9 @@ static int __pci_enable_msix_range(struct pci_dev *dev,
1087 if (maxvec < minvec) 1087 if (maxvec < minvec)
1088 return -ERANGE; 1088 return -ERANGE;
1089 1089
1090 if (WARN_ON_ONCE(dev->msix_enabled))
1091 return -EINVAL;
1092
1090 for (;;) { 1093 for (;;) {
1091 if (affd) { 1094 if (affd) {
1092 nvec = irq_calc_affinity_vectors(minvec, nvec, affd); 1095 nvec = irq_calc_affinity_vectors(minvec, nvec, affd);