diff options
author | 2025-02-24 09:41:56 -0800 | |
---|---|---|
committer | 2025-02-28 15:43:18 -0800 | |
commit | 2a289aed3fcd7fdd6d5c8def0f992d31a0754094 (patch) | |
tree | 43ab18fbf26ef73df7141b2b2bb9d04069485ff2 | |
parent | KVM: x86: Use a dedicated flow for queueing re-injected exceptions (diff) | |
download | wireguard-linux-2a289aed3fcd7fdd6d5c8def0f992d31a0754094.tar.xz wireguard-linux-2a289aed3fcd7fdd6d5c8def0f992d31a0754094.zip |
KVM: x86: Always set mp_state to RUNNABLE on wakeup from HLT
When emulating HLT and a wake event is already pending, explicitly mark
the vCPU RUNNABLE (via kvm_set_mp_state()) instead of assuming the vCPU is
already in the appropriate state. Barring a KVM bug, it should be
impossible for the vCPU to be in a non-RUNNABLE state, but there is no
advantage to relying on that to hold true, and ensuring the vCPU is made
RUNNABLE avoids non-deterministic behavior with respect to pv_unhalted.
E.g. if the vCPU is not already RUNNABLE, then depending on when
pv_unhalted is set, KVM could either leave the vCPU in the non-RUNNABLE
state (set before __kvm_emulate_halt()), or transition the vCPU to HALTED
and then RUNNABLE (pv_unhalted set after the kvm_vcpu_has_events() check).
Link: https://lore.kernel.org/r/20250224174156.2362059-1-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
Diffstat (limited to '')
-rw-r--r-- | arch/x86/kvm/x86.c | 5 |
1 files changed, 2 insertions, 3 deletions
diff --git a/arch/x86/kvm/x86.c b/arch/x86/kvm/x86.c index 2231a2cd8489..bef63fd46d5a 100644 --- a/arch/x86/kvm/x86.c +++ b/arch/x86/kvm/x86.c @@ -11297,9 +11297,8 @@ static int __kvm_emulate_halt(struct kvm_vcpu *vcpu, int state, int reason) ++vcpu->stat.halt_exits; if (lapic_in_kernel(vcpu)) { if (kvm_vcpu_has_events(vcpu)) - vcpu->arch.pv.pv_unhalted = false; - else - kvm_set_mp_state(vcpu, state); + state = KVM_MP_STATE_RUNNABLE; + kvm_set_mp_state(vcpu, state); return 1; } else { vcpu->run->exit_reason = reason; |