From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753368AbbJ0BbA (ORCPT ); Mon, 26 Oct 2015 21:31:00 -0400 Received: from mga01.intel.com ([192.55.52.88]:43675 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751867AbbJ0Ba6 (ORCPT ); Mon, 26 Oct 2015 21:30:58 -0400 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.20,202,1444719600"; d="scan'208";a="820088258" From: Yunhong Jiang To: alex.williamson@redhat.com Cc: kvm@vger.kernel.org, linux-kernel@vger.kernel.org, Yunhong Jiang Subject: [RFC PATCH] VFIO: Add a parameter to force nonthread IRQ Date: Mon, 26 Oct 2015 18:20:01 -0700 Message-Id: <1445908801-14732-1-git-send-email-yunhong.jiang@linux.intel.com> X-Mailer: git-send-email 1.8.3.1 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org An option to force VFIO PCI MSI/MSI-X handler as non-threaded IRQ, even when CONFIG_IRQ_FORCED_THREADING=y. This is uselful when assigning a device to a guest with low latency requirement since it reduce the context switch to/from the IRQ thread. An experiment was conducted on a HSW platform for 1 minutes, with the guest vCPU bound to isolated pCPU. The assigned device triggered the interrupt every 1ms. The average EXTERNAL_INTERRUPT exit handling time is dropped from 5.3us to 2.2us. Another choice is to change VFIO_DEVICE_SET_IRQS ioctl, to apply this option only to specific devices when in kernel irq_chip is enabled. It provides more flexibility but is more complex, not sure if we need go through that way. Signed-off-by: Yunhong Jiang --- drivers/vfio/pci/vfio_pci_intrs.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c index 1f577b4..ca1f95a 100644 --- a/drivers/vfio/pci/vfio_pci_intrs.c +++ b/drivers/vfio/pci/vfio_pci_intrs.c @@ -22,9 +22,13 @@ #include #include #include +#include #include "vfio_pci_private.h" +static bool nonthread_msi = 1; +module_param(nonthread_msi, bool, 0444); + /* * INTx */ @@ -313,6 +317,7 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, char *name = msix ? "vfio-msix" : "vfio-msi"; struct eventfd_ctx *trigger; int ret; + unsigned long irqflags = 0; if (vector >= vdev->num_ctx) return -EINVAL; @@ -352,7 +357,10 @@ static int vfio_msi_set_vector_signal(struct vfio_pci_device *vdev, pci_write_msi_msg(irq, &msg); } - ret = request_irq(irq, vfio_msihandler, 0, + if (nonthread_msi) + irqflags = IRQF_NO_THREAD; + + ret = request_irq(irq, vfio_msihandler, irqflags, vdev->ctx[vector].name, trigger); if (ret) { kfree(vdev->ctx[vector].name); -- 1.8.3.1