FYI, QEMU's Hyper-V emulation of HV_X64_MSR_EOM has been broken since QEMU commit c82d9d43ed ("KVM: Kick resamplefd for split kernel irqchip"), as nothing in KVM will forward the EOM notification to userspace. I have no idea if anything in QEMU besides hyperv_testdev.c cares. The bug is reproducible by running the hyperv_connections KVM-Unit-Test with a split IRQCHIP. Hacking QEMU and KVM (see KVM commit 654f1f13ea56 ("kvm: Check irqchip mode before assign irqfd") as below gets the test to pass. Assuming that's not a palatable solution, the other options I can think of would be for QEMU to intercept HV_X64_MSR_EOM when using a split IRQCHIP, or to modify KVM to do KVM_EXIT_HYPERV_SYNIC on writes to HV_X64_MSR_EOM with a split IRQCHIP. diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c index c65b790433..820bc1692e 100644 --- a/accel/kvm/kvm-all.c +++ b/accel/kvm/kvm-all.c @@ -2261,10 +2261,9 @@ static int kvm_irqchip_assign_irqfd(KVMState *s, EventNotifier *event, * the INTx slow path). */ kvm_resample_fd_insert(virq, resample); - } else { - irqfd.flags |= KVM_IRQFD_FLAG_RESAMPLE; - irqfd.resamplefd = rfd; } + irqfd.flags |= KVM_IRQFD_FLAG_RESAMPLE; + irqfd.resamplefd = rfd; } else if (!assign) { if (kvm_irqchip_is_split()) { kvm_resample_fd_remove(virq); diff --git a/arch/x86/kvm/irq.c b/arch/x86/kvm/irq.c index 63f66c51975a..0bf85f89eb27 100644 --- a/arch/x86/kvm/irq.c +++ b/arch/x86/kvm/irq.c @@ -166,9 +166,7 @@ void __kvm_migrate_timers(struct kvm_vcpu *vcpu) bool kvm_arch_irqfd_allowed(struct kvm *kvm, struct kvm_irqfd *args) { - bool resample = args->flags & KVM_IRQFD_FLAG_RESAMPLE; - - return resample ? irqchip_kernel(kvm) : irqchip_in_kernel(kvm); + return irqchip_in_kernel(kvm); } bool kvm_arch_irqchip_in_kernel(struct kvm *kvm)