Make vfio MSI interrupt be non-threaded. 28/1228/5
authorYunhong Jiang <yunhong.jiang@intel.com>
Tue, 18 Aug 2015 18:27:04 +0000 (11:27 -0700)
committerYunhong Jiang <yunhong.jiang@linux.intel.com>
Wed, 25 Nov 2015 00:17:35 +0000 (16:17 -0800)
Currently the vfio msi interrupt is kept as IRQ thread, this is not good
for NFV scenerio because in NFV scenerio, we want to inject the interrupt
to the guest asap. A threaded IRQ introduces schedule latency.

However, this change is like a quick and dirty and may bring
potential deadlock, because the spinlock_irqsave() from eventfd_signal()
is preemptible in RT kernel, which should not be held on IRQ context. But
changing it to be raw_spinlock is bad because it will increase the latency
a lot if the eventfd is accessed by user space.

The deadlock should be ok since for vfio MSI handler is purely kernel story
and the lock is a per-eventfd lock and seems no one else is using it for the
vfio msi scenario.

Upstream status: discussion https://lkml.org/lkml/2015/10/26/764

Change-Id: Ie4405a5b568aa75ca8c3481eeeea228a486b9794

kernel/drivers/vfio/pci/vfio_pci_intrs.c

index 1f577b4..a21d8e1 100644 (file)
@@ -352,7 +352,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev,
                pci_write_msi_msg(irq, &msg);
        }
 
                pci_write_msi_msg(irq, &msg);
        }
 
-       ret = request_irq(irq, vfio_msihandler, 0,
+       ret = request_irq(irq, vfio_msihandler, IRQF_NO_THREAD,
                          vdev->ctx[vector].name, trigger);
        if (ret) {
                kfree(vdev->ctx[vector].name);
                          vdev->ctx[vector].name, trigger);
        if (ret) {
                kfree(vdev->ctx[vector].name);