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

From: Dong, Eddie
Date: Mon Aug 08 2022 - 19:26:59 EST


>
> 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