struct irq_bypass_producer *);
 void kvm_arch_irq_bypass_stop(struct irq_bypass_consumer *);
 void kvm_arch_irq_bypass_start(struct irq_bypass_consumer *);
+int kvm_arch_update_irqfd_routing(struct kvm *kvm, unsigned int host_irq,
+                                 uint32_t guest_irq, bool set);
 #endif /* CONFIG_HAVE_KVM_IRQ_BYPASS */
 #endif
 
                                struct irq_bypass_consumer *cons)
 {
 }
+
+int  __attribute__((weak)) kvm_arch_update_irqfd_routing(
+                               struct kvm *kvm, unsigned int host_irq,
+                               uint32_t guest_irq, bool set)
+{
+       return 0;
+}
 #endif
 
 static int
 
        spin_lock_irq(&kvm->irqfds.lock);
 
-       list_for_each_entry(irqfd, &kvm->irqfds.items, list)
+       list_for_each_entry(irqfd, &kvm->irqfds.items, list) {
                irqfd_update(kvm, irqfd);
 
+#ifdef CONFIG_HAVE_KVM_IRQ_BYPASS
+               if (irqfd->producer) {
+                       int ret = kvm_arch_update_irqfd_routing(
+                                       irqfd->kvm, irqfd->producer->irq,
+                                       irqfd->gsi, 1);
+                       WARN_ON(ret);
+               }
+#endif
+       }
+
        spin_unlock_irq(&kvm->irqfds.lock);
 }