aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/controller/vmd.c
diff options
context:
space:
mode:
authorKeith Busch <keith.busch@intel.com>2018-05-08 12:00:22 -0400
committerLorenzo Pieralisi <lorenzo.pieralisi@arm.com>2018-06-28 12:25:33 -0400
commita7f58b9ecfd3c0f63703ec10f4a592cc38dbd1b8 (patch)
tree01d129814594762f718149de65d8e3fc2d436455 /drivers/pci/controller/vmd.c
parentce397d215ccd07b8ae3f71db689aedb85d56ab40 (diff)
PCI: vmd: White list for fast interrupt handlers
Devices with slow interrupt handlers are significantly harming performance when their interrupt vector is shared with a fast device. Create a class code white list for devices with known fast interrupt handlers and let all other devices share a single vector so that they don't interfere with performance. At the moment, only the NVM Express class code is on the list, but more may be added if VMD users desire to use other low-latency devices in these domains. Signed-off-by: Keith Busch <keith.busch@intel.com> [lorenzo.pieralisi@arm.com: changelog] Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com> Acked-by: Jon Derrick: <jonathan.derrick@intel.com>
Diffstat (limited to 'drivers/pci/controller/vmd.c')
-rw-r--r--drivers/pci/controller/vmd.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/pci/controller/vmd.c b/drivers/pci/controller/vmd.c
index 942b64fc7f1f..fd2dbd7eed7b 100644
--- a/drivers/pci/controller/vmd.c
+++ b/drivers/pci/controller/vmd.c
@@ -197,9 +197,20 @@ static struct vmd_irq_list *vmd_next_irq(struct vmd_dev *vmd, struct msi_desc *d
197 int i, best = 1; 197 int i, best = 1;
198 unsigned long flags; 198 unsigned long flags;
199 199
200 if (pci_is_bridge(msi_desc_to_pci_dev(desc)) || vmd->msix_count == 1) 200 if (vmd->msix_count == 1)
201 return &vmd->irqs[0]; 201 return &vmd->irqs[0];
202 202
203 /*
204 * White list for fast-interrupt handlers. All others will share the
205 * "slow" interrupt vector.
206 */
207 switch (msi_desc_to_pci_dev(desc)->class) {
208 case PCI_CLASS_STORAGE_EXPRESS:
209 break;
210 default:
211 return &vmd->irqs[0];
212 }
213
203 raw_spin_lock_irqsave(&list_lock, flags); 214 raw_spin_lock_irqsave(&list_lock, flags);
204 for (i = 1; i < vmd->msix_count; i++) 215 for (i = 1; i < vmd->msix_count; i++)
205 if (vmd->irqs[i].count < vmd->irqs[best].count) 216 if (vmd->irqs[i].count < vmd->irqs[best].count)