KVM: VMX: Assert that IRQs are disabled when putting vCPU on PI wakeup list
authorSean Christopherson <seanjc@google.com>
Tue, 1 Apr 2025 15:47:26 +0000 (08:47 -0700)
committerPaolo Bonzini <pbonzini@redhat.com>
Fri, 4 Apr 2025 11:11:59 +0000 (07:11 -0400)
Assert that IRQs are already disabled when putting a vCPU on a CPU's PI
wakeup list, as opposed to saving/disabling+restoring IRQs.  KVM relies on
IRQs being disabled until the vCPU task is fully scheduled out, i.e. until
the scheduler has dropped all of its per-CPU locks (e.g. for the runqueue),
as attempting to wake the task while it's being scheduled out could lead
to deadlock.

Signed-off-by: Sean Christopherson <seanjc@google.com>
Reviewed-by: Maxim Levitsky <mlevitsk@redhat.com>
Reviewed-by: Yan Zhao <yan.y.zhao@intel.com>
Message-ID: <20250401154727.835231-2-seanjc@google.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/vmx/posted_intr.c

index ec08fa3caf43ce465b562e756cf88eeba04c95b7..840d435229a8728a4886054d127c3ee9285829f6 100644 (file)
@@ -148,9 +148,8 @@ static void pi_enable_wakeup_handler(struct kvm_vcpu *vcpu)
        struct pi_desc *pi_desc = vcpu_to_pi_desc(vcpu);
        struct vcpu_vmx *vmx = to_vmx(vcpu);
        struct pi_desc old, new;
-       unsigned long flags;
 
-       local_irq_save(flags);
+       lockdep_assert_irqs_disabled();
 
        raw_spin_lock(&per_cpu(wakeup_vcpus_on_cpu_lock, vcpu->cpu));
        list_add_tail(&vmx->pi_wakeup_list,
@@ -176,8 +175,6 @@ static void pi_enable_wakeup_handler(struct kvm_vcpu *vcpu)
         */
        if (pi_test_on(&new))
                __apic_send_IPI_self(POSTED_INTR_WAKEUP_VECTOR);
-
-       local_irq_restore(flags);
 }
 
 static bool vmx_needs_pi_wakeup(struct kvm_vcpu *vcpu)