]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86: Fix SRCU list traversal in kvm_fire_mask_notifiers()
authorLi RongQing <lirongqing@baidu.com>
Wed, 4 Feb 2026 09:12:06 +0000 (04:12 -0500)
committerPaolo Bonzini <pbonzini@redhat.com>
Wed, 11 Mar 2026 17:41:11 +0000 (18:41 +0100)
The mask_notifier_list is protected by kvm->irq_srcu, but the traversal
in kvm_fire_mask_notifiers() incorrectly uses hlist_for_each_entry_rcu().
This leads to lockdep warnings because the standard RCU iterator expects
to be under rcu_read_lock(), not SRCU.

Replace the RCU variant with hlist_for_each_entry_srcu() and provide
the proper srcu_read_lock_held() annotation to ensure correct
synchronization and silence lockdep.

Signed-off-by: Li RongQing <lirongqing@baidu.com>
Link: https://patch.msgid.link/20260204091206.2617-1-lirongqing@baidu.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/ioapic.c

index bb257793b6cb9bfc6a95a42bef6fbd6429c1f102..eed96ff6e7229a65c3afb030753e78382a9df0ff 100644 (file)
@@ -321,7 +321,8 @@ void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin,
        idx = srcu_read_lock(&kvm->irq_srcu);
        gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin);
        if (gsi != -1)
-               hlist_for_each_entry_rcu(kimn, &ioapic->mask_notifier_list, link)
+               hlist_for_each_entry_srcu(kimn, &ioapic->mask_notifier_list, link,
+                               srcu_read_lock_held(&kvm->irq_srcu))
                        if (kimn->irq == gsi)
                                kimn->func(kimn, mask);
        srcu_read_unlock(&kvm->irq_srcu, idx);