On Thu, 2015-12-03 at 10:22 -0800, Yunhong Jiang wrote: > For VFIO device with MSI interrupt type, it's possible to handle the > interrupt on hard interrupt context without invoking the interrupt > thread. Handling the interrupt on hard interrupt context reduce the > interrupt latency. > > Signed-off-by: Yunhong Jiang <yunhong.jiang@xxxxxxxxxxxxxxx> > --- > drivers/vfio/pci/vfio_pci_intrs.c | 39 ++++++++++++++++++++++++++++++++++----- > 1 file changed, 34 insertions(+), 5 deletions(-) > > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c > index 3b3ba15558b7..108d335c5656 100644 > --- a/drivers/vfio/pci/vfio_pci_intrs.c > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > @@ -236,12 +236,35 @@ static void vfio_intx_disable(struct vfio_pci_device *vdev) > kfree(vdev->ctx); > } > > +static irqreturn_t vfio_msihandler(int irq, void *arg) > +{ > + struct vfio_pci_irq_ctx *ctx = arg; > + struct irq_bypass_producer *producer = &ctx->producer; > + struct irq_bypass_consumer *consumer; > + int ret = IRQ_HANDLED, idx; > + > + idx = srcu_read_lock(&producer->srcu); > + > + list_for_each_entry_rcu(consumer, &producer->consumers, sibling) { > + /* > + * Invoke the thread handler if any consumer would block, but > + * finish all consumes. > + */ > + if (consumer->handle_irq(consumer->irq_context) == -EWOULDBLOCK) > + ret = IRQ_WAKE_THREAD; > + continue; > + } > + > + srcu_read_unlock(&producer->srcu, idx); There should be an irq bypass manager interface to abstract this. -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html