RE: [PATCH v2 0/5] KVM: Fix oneshot interrupts forwarding

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 
> The existing KVM mechanism for forwarding of level-triggered interrupts using
> resample eventfd doesn't work quite correctly in the case of interrupts that are
> handled in a Linux guest as oneshot interrupts (IRQF_ONESHOT). Such an
> interrupt is acked to the device in its threaded irq handler, i.e. later than it is
> acked to the interrupt controller (EOI at the end of hardirq), not earlier. The
> existing KVM code doesn't take that into account, which results in erroneous
> extra interrupts in the guest caused by premature re-assert of an
> unacknowledged IRQ by the host.

Interesting...  How it behaviors in native side? 

> 
> This patch series fixes this issue (for now on x86 only) by checking if the
> interrupt is unmasked when we receive irq ack (EOI) and, in case if it's masked,
> postponing resamplefd notify until the guest unmasks it.
> 
> Patches 1 and 2 extend the existing support for irq mask notifiers in KVM,
> which is a prerequisite needed for KVM irqfd to use mask notifiers to know
> when an interrupt is masked or unmasked.
> 
> Patch 3 implements the actual fix: postponing resamplefd notify in irqfd until
> the irq is unmasked.
> 
> Patches 4 and 5 just do some optional renaming for consistency, as we are now
> using irq mask notifiers in irqfd along with irq ack notifiers.
> 
> Please see individual patches for more details.
> 
> v2:
>   - Fixed compilation failure on non-x86: mask_notifier_list moved from
>     x86 "struct kvm_arch" to generic "struct kvm".
>   - kvm_fire_mask_notifiers() also moved from x86 to generic code, even
>     though it is not called on other architectures for now.
>   - Instead of kvm_irq_is_masked() implemented
>     kvm_register_and_fire_irq_mask_notifier() to fix potential race
>     when reading the initial IRQ mask state.
>   - Renamed for clarity:
>       - irqfd_resampler_mask() -> irqfd_resampler_mask_notify()
>       - kvm_irq_has_notifier() -> kvm_irq_has_ack_notifier()
>       - resampler->notifier -> resampler->ack_notifier
>   - Reorganized code in irqfd_resampler_ack() and
>     irqfd_resampler_mask_notify() to make it easier to follow.
>   - Don't follow unwanted "return type on separate line" style for
>     irqfd_resampler_mask_notify().
> 
> Dmytro Maluka (5):
>   KVM: x86: Move irq mask notifiers from x86 to generic KVM
>   KVM: x86: Add kvm_register_and_fire_irq_mask_notifier()
>   KVM: irqfd: Postpone resamplefd notify for oneshot interrupts
>   KVM: irqfd: Rename resampler->notifier
>   KVM: Rename kvm_irq_has_notifier()
> 
>  arch/x86/include/asm/kvm_host.h |  17 +---
>  arch/x86/kvm/i8259.c            |   6 ++
>  arch/x86/kvm/ioapic.c           |   8 +-
>  arch/x86/kvm/ioapic.h           |   1 +
>  arch/x86/kvm/irq_comm.c         |  74 +++++++++++------
>  arch/x86/kvm/x86.c              |   1 -
>  include/linux/kvm_host.h        |  21 ++++-
>  include/linux/kvm_irqfd.h       |  16 +++-
>  virt/kvm/eventfd.c              | 136 ++++++++++++++++++++++++++++----
>  virt/kvm/kvm_main.c             |   1 +
>  10 files changed, 221 insertions(+), 60 deletions(-)
> 
> --
> 2.37.1.559.g78731f0fdb-goog





[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux