Commit 5a1a726e authored by Sean Christopherson's avatar Sean Christopherson
Browse files

KVM: x86: Use KVM_REQ_RECALC_INTERCEPTS to react to CPUID updates



Defer recalculating MSR and instruction intercepts after a CPUID update
via RECALC_INTERCEPTS to converge on RECALC_INTERCEPTS as the "official"
mechanism for triggering recalcs.  As a bonus, because KVM does a "recalc"
during vCPU creation, and every functional VMM sets CPUID at least once,
for all intents and purposes this saves at least one recalc.

Tested-by: default avatarXudong Hao <xudong.hao@intel.com>
Link: https://lore.kernel.org/r/20250806195706.1650976-26-seanjc@google.com


Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
parent 60574973
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -448,6 +448,8 @@ void kvm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
	 * adjustments to the reserved GPA bits.
	 */
	kvm_mmu_after_set_cpuid(vcpu);

	kvm_make_request(KVM_REQ_RECALC_INTERCEPTS, vcpu);
}

int cpuid_query_maxphyaddr(struct kvm_vcpu *vcpu)
+1 −3
Original line number Diff line number Diff line
@@ -1225,7 +1225,7 @@ static void init_vmcb(struct kvm_vcpu *vcpu)

	svm_hv_init_vmcb(vmcb);

	svm_recalc_intercepts(vcpu);
	kvm_make_request(KVM_REQ_RECALC_INTERCEPTS, vcpu);

	vmcb_mark_all_dirty(vmcb);

@@ -4478,8 +4478,6 @@ static void svm_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)

	if (sev_guest(vcpu->kvm))
		sev_vcpu_after_set_cpuid(svm);

	svm_recalc_intercepts(vcpu);
}

static bool svm_has_wbinvd_exit(void)
+0 −3
Original line number Diff line number Diff line
@@ -7806,9 +7806,6 @@ void vmx_vcpu_after_set_cpuid(struct kvm_vcpu *vcpu)
		vmx->msr_ia32_feature_control_valid_bits &=
			~FEAT_CTL_SGX_LC_ENABLED;

	/* Recalc MSR interception to account for feature changes. */
	vmx_recalc_intercepts(vcpu);

	/* Refresh #PF interception to account for MAXPHYADDR changes. */
	vmx_update_exception_bitmap(vcpu);
}