[PATCH v6 08/12] KVM: nSVM: Disable LBRV in nested control cache when unsupported
From: Sean Christopherson
Date: Wed Sep 30 2026 - 16:46:31 EST
From: Shivansh Dhiman <shivansh.dhiman@xxxxxxx>
Clear SVM_MISC2_ENABLE_V_LBR in __nested_copy_vmcb_control_to_cache() when
the vCPU does not support LBR Virtualization. This lets the cached value be
consumed directly instead of re-checking X86_FEATURE_LBRV on every access.
Suggested-by: Yosry Ahmed <yosry@xxxxxxxxxx>
Signed-off-by: Shivansh Dhiman <shivansh.dhiman@xxxxxxx>
Signed-off-by: Sean Christopherson <seanjc@xxxxxxxxxx>
---
arch/x86/kvm/svm/nested.c | 8 +++++---
arch/x86/kvm/svm/svm.c | 2 +-
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/arch/x86/kvm/svm/nested.c b/arch/x86/kvm/svm/nested.c
index b61149814acc..aca2bbc66f47 100644
--- a/arch/x86/kvm/svm/nested.c
+++ b/arch/x86/kvm/svm/nested.c
@@ -527,12 +527,16 @@ void __nested_copy_vmcb_control_to_cache(struct kvm_vcpu *vcpu,
/* Always clear misc_ctl bits that the guest cannot use */
to->misc_ctl = from->misc_ctl;
+ to->misc_ctl2 = from->misc_ctl2;
if (!guest_cpu_cap_has(vcpu, X86_FEATURE_NPT))
to->misc_ctl &= ~SVM_MISC_ENABLE_NP;
if (!gmet_enabled || !guest_cpu_cap_has(vcpu, X86_FEATURE_GMET))
to->misc_ctl &= ~SVM_MISC_ENABLE_GMET;
+ if (!guest_cpu_cap_has(vcpu, X86_FEATURE_LBRV))
+ to->misc_ctl2 &= ~SVM_MISC2_ENABLE_V_LBR;
+
to->iopm_base_pa = from->iopm_base_pa & PAGE_MASK;
to->msrpm_base_pa = from->msrpm_base_pa & PAGE_MASK;
to->tsc_offset = from->tsc_offset;
@@ -550,7 +554,6 @@ void __nested_copy_vmcb_control_to_cache(struct kvm_vcpu *vcpu,
to->event_inj_err = from->event_inj_err;
to->next_rip = from->next_rip;
to->nested_cr3 = from->nested_cr3;
- to->misc_ctl2 = from->misc_ctl2;
to->pause_filter_count = from->pause_filter_count;
to->pause_filter_thresh = from->pause_filter_thresh;
@@ -737,8 +740,7 @@ static int nested_svm_load_cr3(struct kvm_vcpu *vcpu, unsigned long cr3,
static bool nested_vmcb12_has_lbrv(struct kvm_vcpu *vcpu)
{
- return guest_cpu_cap_has(vcpu, X86_FEATURE_LBRV) &&
- (to_svm(vcpu)->nested.ctl.misc_ctl2 & SVM_MISC2_ENABLE_V_LBR);
+ return to_svm(vcpu)->nested.ctl.misc_ctl2 & SVM_MISC2_ENABLE_V_LBR;
}
static void nested_vmcb02_prepare_save(struct vcpu_svm *svm)
diff --git a/arch/x86/kvm/svm/svm.c b/arch/x86/kvm/svm/svm.c
index 775eccfb7b24..5253c0143666 100644
--- a/arch/x86/kvm/svm/svm.c
+++ b/arch/x86/kvm/svm/svm.c
@@ -882,7 +882,7 @@ static bool svm_need_lbr_virtualization(struct kvm_vcpu *vcpu)
if (svm->vmcb->save.dbgctl & DEBUGCTLMSR_LBR)
return true;
- return is_guest_mode(vcpu) && guest_cpu_cap_has(vcpu, X86_FEATURE_LBRV) &&
+ return is_guest_mode(vcpu) &&
(svm->nested.ctl.misc_ctl2 & SVM_MISC2_ENABLE_V_LBR);
}
--
2.56.0.rc1.315.gc6ed9934b7-goog