]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: x86: Clear pv_unhalted on all transitions to KVM_MP_STATE_RUNNABLE
authorJim Mattson <jmattson@google.com>
Mon, 13 Jan 2025 20:01:44 +0000 (12:01 -0800)
committerSean Christopherson <seanjc@google.com>
Wed, 12 Feb 2025 18:16:28 +0000 (10:16 -0800)
In kvm_set_mp_state(), ensure that vcpu->arch.pv.pv_unhalted is always
cleared on a transition to KVM_MP_STATE_RUNNABLE, so that the next HLT
instruction will be respected.

Fixes: 6aef266c6e17 ("kvm hypervisor : Add a hypercall to KVM hypervisor to support pv-ticketlocks")
Fixes: b6b8a1451fc4 ("KVM: nVMX: Rework interception of IRQs and NMIs")
Fixes: 38c0b192bd6d ("KVM: SVM: leave halted state on vmexit")
Fixes: 1a65105a5aba ("KVM: x86/xen: handle PV spinlocks slowpath")
Signed-off-by: Jim Mattson <jmattson@google.com>
Link: https://lore.kernel.org/r/20250113200150.487409-3-jmattson@google.com
[sean: add Xen PV spinlocks to the list of Fixes, tweak changelog]
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/sev.c
arch/x86/kvm/x86.c
arch/x86/kvm/x86.h

index 87d2840da6af81899c898c0e0b39b8a259f8c5c7..8bc62e9941389c72dbbdeef16f089586f3ca8336 100644 (file)
@@ -3883,7 +3883,6 @@ static int __sev_snp_update_protected_guest_state(struct kvm_vcpu *vcpu)
                svm->vmcb->control.vmsa_pa = pfn_to_hpa(pfn);
 
                /* Mark the vCPU as runnable */
-               vcpu->arch.pv.pv_unhalted = false;
                kvm_set_mp_state(vcpu, KVM_MP_STATE_RUNNABLE);
 
                svm->sev_es.snp_vmsa_gpa = INVALID_PAGE;
index 3041b8d8b59fa52553cb50e6a16b96bcd0418aa1..0aca2a5dac7e0b4e7e3f58dc9148dfa2bb0b7e12 100644 (file)
@@ -11215,7 +11215,6 @@ static inline int vcpu_block(struct kvm_vcpu *vcpu)
        switch(vcpu->arch.mp_state) {
        case KVM_MP_STATE_HALTED:
        case KVM_MP_STATE_AP_RESET_HOLD:
-               vcpu->arch.pv.pv_unhalted = false;
                kvm_set_mp_state(vcpu, KVM_MP_STATE_RUNNABLE);
                fallthrough;
        case KVM_MP_STATE_RUNNABLE:
index 34ca87049845ec6cebb36bec08bdfc0df31adece..5c1fd5230cee94861587545e7bcfed75cc477dc0 100644 (file)
@@ -124,6 +124,8 @@ static inline bool kvm_vcpu_has_run(struct kvm_vcpu *vcpu)
 static inline void kvm_set_mp_state(struct kvm_vcpu *vcpu, int mp_state)
 {
        vcpu->arch.mp_state = mp_state;
+       if (mp_state == KVM_MP_STATE_RUNNABLE)
+               vcpu->arch.pv.pv_unhalted = false;
 }
 
 static inline bool kvm_is_exception_pending(struct kvm_vcpu *vcpu)