* [PATCH RT] vfio-pci: Set MSI/MSI-X ISR to non-threaded @ 2017-12-01 1:05 David Su 2017-12-01 2:08 ` Steven Rostedt 0 siblings, 1 reply; 4+ messages in thread From: David Su @ 2017-12-01 1:05 UTC (permalink / raw) To: linux-kernel; +Cc: bigeasy, tglx, rostedt, David Su Setting MSI/MSI-X ISR to be non-threaded will result in shorter and more deterministic IRQ delivery latencies to VFIO applications, because context switches to the ISR thread are eliminated. This is important for applications with low latency requirement running in virtual machines on RT Linux host with assigned devices through vfio-pci. A FPGA based interrupt testing device was used to compare latencies with threaded and non-threaded vfio-pci ISR. The device has a free running time stamp counter and a register recording the time an interrupt was sent to the host. With these registers the device driver and test application for the device are able to calculate and record the latency between the time an interrupt was sent and the time the ISR in the device's driver was invoked. The result is with non-threaded vfio-pci ISR the average latency is reduced by about 54% and the maximum-minimum latency range is reduced by about 65%. Non-threaded vfio-pci ISR: Minimum 4.18us, Average 4.47us, Maximum 10.26us Threaded vfio-pci ISR: Minimum 8.97us, Average 9.65us, Maximum 26.11us Signed-off-by: David Su <david.w.su@intel.com> --- drivers/vfio/pci/vfio_pci_intrs.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c index 1c46045..4c54e56 100644 --- a/drivers/vfio/pci/vfio_pci_intrs.c +++ b/drivers/vfio/pci/vfio_pci_intrs.c @@ -333,7 +333,7 @@ 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, + ret = request_irq(irq, vfio_msihandler, IRQF_NO_THREAD, vdev->ctx[vector].name, trigger); if (ret) { kfree(vdev->ctx[vector].name); -- 1.7.0.4 ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH RT] vfio-pci: Set MSI/MSI-X ISR to non-threaded 2017-12-01 1:05 [PATCH RT] vfio-pci: Set MSI/MSI-X ISR to non-threaded David Su @ 2017-12-01 2:08 ` Steven Rostedt 2017-12-07 1:27 ` Su, David W 0 siblings, 1 reply; 4+ messages in thread From: Steven Rostedt @ 2017-12-01 2:08 UTC (permalink / raw) To: David Su; +Cc: linux-kernel, bigeasy, tglx On Thu, 30 Nov 2017 17:05:35 -0800 David Su <david.w.su@intel.com> wrote: > Setting MSI/MSI-X ISR to be non-threaded will result in shorter and more > deterministic IRQ delivery latencies to VFIO applications, because > context switches to the ISR thread are eliminated. This is important > for applications with low latency requirement running in virtual > machines on RT Linux host with assigned devices through vfio-pci. > > A FPGA based interrupt testing device was used to compare latencies with > threaded and non-threaded vfio-pci ISR. The device has a free running > time stamp counter and a register recording the time an interrupt was > sent to the host. With these registers the device driver and test > application for the device are able to calculate and record the latency > between the time an interrupt was sent and the time the ISR in the > device's driver was invoked. > > The result is with non-threaded vfio-pci ISR the average latency is > reduced by about 54% and the maximum-minimum latency range is reduced by > about 65%. > > Non-threaded vfio-pci ISR: > Minimum 4.18us, Average 4.47us, Maximum 10.26us > > Threaded vfio-pci ISR: > Minimum 8.97us, Average 9.65us, Maximum 26.11us > > Signed-off-by: David Su <david.w.su@intel.com> > --- > drivers/vfio/pci/vfio_pci_intrs.c | 2 +- > 1 files changed, 1 insertions(+), 1 deletions(-) > > diff --git a/drivers/vfio/pci/vfio_pci_intrs.c b/drivers/vfio/pci/vfio_pci_intrs.c > index 1c46045..4c54e56 100644 > --- a/drivers/vfio/pci/vfio_pci_intrs.c > +++ b/drivers/vfio/pci/vfio_pci_intrs.c > @@ -333,7 +333,7 @@ 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, > + ret = request_irq(irq, vfio_msihandler, IRQF_NO_THREAD, > vdev->ctx[vector].name, trigger); Hmm, but we have this: static irqreturn_t vfio_msihandler(int irq, void *arg) { struct eventfd_ctx *trigger = arg; eventfd_signal(trigger, 1); return IRQ_HANDLED; } __u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n) { unsigned long flags; spin_lock_irqsave(&ctx->wqh.lock, flags); if (ULLONG_MAX - ctx->count < n) n = ULLONG_MAX - ctx->count; ctx->count += n; if (waitqueue_active(&ctx->wqh)) wake_up_locked_poll(&ctx->wqh, POLLIN); spin_unlock_irqrestore(&ctx->wqh.lock, flags); return n; } And spin_lock() turns into a mutex in PREEMPT_RT, which means it can sleep. You can't sleep in hard interrupt context. This will eventually crash the kernel. And no, we are not going to convert the ctx->wqh.lock into a raw_spin_lock. -- Steve > if (ret) { > kfree(vdev->ctx[vector].name); ^ permalink raw reply [flat|nested] 4+ messages in thread
* RE: [PATCH RT] vfio-pci: Set MSI/MSI-X ISR to non-threaded 2017-12-01 2:08 ` Steven Rostedt @ 2017-12-07 1:27 ` Su, David W 2017-12-07 8:52 ` Steven Rostedt 0 siblings, 1 reply; 4+ messages in thread From: Su, David W @ 2017-12-07 1:27 UTC (permalink / raw) To: 'Steven Rostedt'; +Cc: linux-kernel, bigeasy, tglx, Su, David W From: Steven Rostedt [mailto:rostedt@goodmis.org] Sent: Thursday, November 30, 2017 6:09 PM > >On Thu, 30 Nov 2017 17:05:35 -0800 >David Su <david.w.su@intel.com> wrote: > >> Setting MSI/MSI-X ISR to be non-threaded will result in shorter and more >> deterministic IRQ delivery latencies to VFIO applications, because >> context switches to the ISR thread are eliminated. This is important >> for applications with low latency requirement running in virtual >> machines on RT Linux host with assigned devices through vfio-pci. >> >> A FPGA based interrupt testing device was used to compare latencies with >> threaded and non-threaded vfio-pci ISR. The device has a free running >> time stamp counter and a register recording the time an interrupt was >> sent to the host. With these registers the device driver and test >> application for the device are able to calculate and record the latency >> between the time an interrupt was sent and the time the ISR in the >> device's driver was invoked. >> >> The result is with non-threaded vfio-pci ISR the average latency is >> reduced by about 54% and the maximum-minimum latency range is reduced >by >> about 65%. >> >> Non-threaded vfio-pci ISR: >> Minimum 4.18us, Average 4.47us, Maximum 10.26us >> >> Threaded vfio-pci ISR: >> Minimum 8.97us, Average 9.65us, Maximum 26.11us >> >> Signed-off-by: David Su <david.w.su@intel.com> >> --- >> drivers/vfio/pci/vfio_pci_intrs.c | 2 +- >> 1 files changed, 1 insertions(+), 1 deletions(-) >> >> diff --git a/drivers/vfio/pci/vfio_pci_intrs.c >b/drivers/vfio/pci/vfio_pci_intrs.c >> index 1c46045..4c54e56 100644 >> --- a/drivers/vfio/pci/vfio_pci_intrs.c >> +++ b/drivers/vfio/pci/vfio_pci_intrs.c >> @@ -333,7 +333,7 @@ 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, >> + ret = request_irq(irq, vfio_msihandler, IRQF_NO_THREAD, >> vdev->ctx[vector].name, trigger); > >Hmm, but we have this: >static irqreturn_t vfio_msihandler(int irq, void *arg) >{ > struct eventfd_ctx *trigger = arg; > > eventfd_signal(trigger, 1); > return IRQ_HANDLED; >} > >__u64 eventfd_signal(struct eventfd_ctx *ctx, __u64 n) >{ > unsigned long flags; > > spin_lock_irqsave(&ctx->wqh.lock, flags); > if (ULLONG_MAX - ctx->count < n) > n = ULLONG_MAX - ctx->count; > ctx->count += n; > if (waitqueue_active(&ctx->wqh)) > wake_up_locked_poll(&ctx->wqh, POLLIN); > spin_unlock_irqrestore(&ctx->wqh.lock, flags); > > return n; >} > >And spin_lock() turns into a mutex in PREEMPT_RT, which means it can >sleep. You can't sleep in hard interrupt context. This will eventually >crash the kernel. Steve, thanks for your review and comment. I can think of 2 scenarios where there is contention for the eventfd context lock. One scenario is an eventfd is used to notify a VFIO application of 2 or more IRQs. But in this case the application wouldn't be able to tell which IRQ occurred and so I think it should be considered a programming error of the application and not a proper usage of VFIO. The other is a device IRQ is configured to be delivered to multiple CPU cores at the same time. However, I have never seen such a device and cannot think of any good reason for a device to be designed this way. So, IMHO it is safe to set vfio-pci ISR to non-threaded. > >And no, we are not going to convert the ctx->wqh.lock into a >raw_spin_lock. > >-- Steve > >> if (ret) { >> kfree(vdev->ctx[vector].name); ^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH RT] vfio-pci: Set MSI/MSI-X ISR to non-threaded 2017-12-07 1:27 ` Su, David W @ 2017-12-07 8:52 ` Steven Rostedt 0 siblings, 0 replies; 4+ messages in thread From: Steven Rostedt @ 2017-12-07 8:52 UTC (permalink / raw) To: Su, David W; +Cc: linux-kernel, bigeasy, tglx On Thu, 7 Dec 2017 01:27:03 +0000 "Su, David W" <david.w.su@intel.com> wrote: > >And spin_lock() turns into a mutex in PREEMPT_RT, which means it can > >sleep. You can't sleep in hard interrupt context. This will eventually > >crash the kernel. > > Steve, thanks for your review and comment. > > I can think of 2 scenarios where there is contention for the eventfd > context lock. > > One scenario is an eventfd is used to notify a VFIO application of > 2 or more IRQs. But in this case the application wouldn't be able to > tell which IRQ occurred and so I think it should be considered a > programming error of the application and not a proper usage of > VFIO. Remember, if there is contention, the system will CRASH! Boom, panic, end of story. Are you blowing this off to just a programming error of the application? I'm sure lots of root kit developers are excited about this. > > The other is a device IRQ is configured to be delivered to multiple > CPU cores at the same time. However, I have never seen such a > device and cannot think of any good reason for a device to be > designed this way. > > So, IMHO it is safe to set vfio-pci ISR to non-threaded. Please tell me that you are not arguing that it's OK to have a sleeping mutex in a hard threaded IRQ handler because "proper programming will prevent contention". If that is truly your argument, then I'm done here, with a perpetual NACK on your patches. -- Steve > > > > >And no, we are not going to convert the ctx->wqh.lock into a > >raw_spin_lock. > > ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2017-12-07 8:53 UTC | newest] Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed) -- links below jump to the message on this page -- 2017-12-01 1:05 [PATCH RT] vfio-pci: Set MSI/MSI-X ISR to non-threaded David Su 2017-12-01 2:08 ` Steven Rostedt 2017-12-07 1:27 ` Su, David W 2017-12-07 8:52 ` Steven Rostedt
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®