diff options
author | Bjorn Helgaas <bhelgaas@google.com> | 2018-10-20 12:45:31 -0400 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2018-10-20 12:45:31 -0400 |
commit | 0af6166395130b87713550c84c9518332f27cc28 (patch) | |
tree | 8d2f1a6c6a3f45d884b6b7bceae8c008bfea8b44 | |
parent | ee8360fdafac54eefd0df69fbd99338896cf806b (diff) | |
parent | 4c1ef72e9b71a19fb405ebfcd37c0a5e16fa44ca (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.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, | |||
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); |