Skip to content

Commit ef3719e

Browse files
committed
KVM: x86: Assert that non-MSI doesn't have bypass vCPU when deleting producer
When disconnecting a non-MSI irqfd from an IRQ bypass producer, WARN if the irqfd is configured for IRQ bypass and set its IRTE back to remapped mode to harden against kernel/KVM bugs (keeping the irqfd in bypass mode is often fatal to the host). Deactivating an irqfd (removing it from the list of irqfds), updating irqfd routes, and the code in question are all mutually exclusive (all run under irqfds.lock). If an irqfd is configured for bypass, and the irqfd is deassigned at the same time IRQ routing is updated (to change the routing to non-MSI), then either kvm_arch_update_irqfd_routing() should process the irqfd routing change and put the IRTE into remapped mode (routing update "wins"), or kvm_arch_irq_bypass_del_producer() should see the MSI routing info (deactivation "wins"). Link: https://patch.msgid.link/[email protected] Signed-off-by: Sean Christopherson <[email protected]>
1 parent b4d37cd commit ef3719e

1 file changed

Lines changed: 2 additions & 1 deletion

File tree

arch/x86/kvm/irq.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,8 @@ void kvm_arch_irq_bypass_del_producer(struct irq_bypass_consumer *cons,
514514
*/
515515
spin_lock_irq(&kvm->irqfds.lock);
516516

517-
if (irqfd->irq_entry.type == KVM_IRQ_ROUTING_MSI) {
517+
if (irqfd->irq_entry.type == KVM_IRQ_ROUTING_MSI ||
518+
WARN_ON_ONCE(irqfd->irq_bypass_vcpu)) {
518519
ret = kvm_pi_update_irte(irqfd, NULL);
519520
if (ret)
520521
pr_info("irq bypass consumer (eventfd %p) unregistration fails: %d\n",

0 commit comments

Comments
 (0)