Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a7f58b9e authored by Keith Busch's avatar Keith Busch Committed by Lorenzo Pieralisi
Browse files

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: default avatarKeith Busch <keith.busch@intel.com>
[lorenzo.pieralisi@arm.com: changelog]
Signed-off-by: default avatarLorenzo Pieralisi <lorenzo.pieralisi@arm.com>
Acked-by: default avatarJon Derrick: <jonathan.derrick@intel.com>
parent ce397d21
Loading
Loading
Loading
Loading
+12 −1
Original line number Diff line number Diff line
@@ -197,9 +197,20 @@ static struct vmd_irq_list *vmd_next_irq(struct vmd_dev *vmd, struct msi_desc *d
	int i, best = 1;
	unsigned long flags;

	if (pci_is_bridge(msi_desc_to_pci_dev(desc)) || vmd->msix_count == 1)
	if (vmd->msix_count == 1)
		return &vmd->irqs[0];

	/*
	 * White list for fast-interrupt handlers. All others will share the
	 * "slow" interrupt vector.
	 */
	switch (msi_desc_to_pci_dev(desc)->class) {
	case PCI_CLASS_STORAGE_EXPRESS:
		break;
	default:
		return &vmd->irqs[0];
	}

	raw_spin_lock_irqsave(&list_lock, flags);
	for (i = 1; i < vmd->msix_count; i++)
		if (vmd->irqs[i].count < vmd->irqs[best].count)