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