]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
KVM: nSVM: Move VMRUN instruction retirement after entering guest mode
authorYosry Ahmed <yosry@kernel.org>
Wed, 27 May 2026 23:46:58 +0000 (23:46 +0000)
committerSean Christopherson <seanjc@google.com>
Thu, 28 May 2026 01:45:48 +0000 (18:45 -0700)
A successful VMRUN retires in guest mode and should be counted by the
PMU as a guest instruction. Move the call to
kvm_pmu_instruction_retired() after potentially entering guest mode,
such that VMRUN is counted correctly.

The PMU event will be matched against L2's CPL, but otherwise this does
not change the behavior in terms of guest vs. host, because KVM does
not virtualize Host-Only/Guest-Only PMC controls yet, so all
instructions are counted regardless of the vCPU's host/guest state. But
this change is needed for the incoming support for Host-Only/Guest-Only
controls to count VMRUN correctly.

Signed-off-by: Yosry Ahmed <yosry@kernel.org>
Link: https://patch.msgid.link/20260527234711.4175166-5-yosry@kernel.org
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/svm/nested.c

index 2ef31efd4c9d106618add5a68a592a783fa8f892..3a90b7f83d8e3412e54368ea9d78d7d33c1d6389 100644 (file)
@@ -1150,10 +1150,8 @@ int nested_svm_vmrun(struct kvm_vcpu *vcpu)
        if (!svm_skip_emulated_instruction(vcpu))
                return 0;
 
-       kvm_pmu_instruction_retired(vcpu);
-
        if (ret)
-               return 1;
+               goto insn_retired;
 
        /*
         * Since vmcb01 is not in use, we can use it to store some of the L1
@@ -1183,6 +1181,12 @@ int nested_svm_vmrun(struct kvm_vcpu *vcpu)
                nested_svm_vmexit(svm);
        }
 
+insn_retired:
+       /*
+        * A successful VMRUN is counted by the PMU in guest mode, so only
+        * retire the instruction after potentially entering guest mode.
+        */
+       kvm_pmu_instruction_retired(vcpu);
        return 1;
 }