Commit d83420c2 authored by Sean Christopherson's avatar Sean Christopherson Committed by Paolo Bonzini
Browse files

KVM: x86: Move CPU compat checks hook to kvm_x86_ops (from kvm_x86_init_ops)



Move the .check_processor_compatibility() callback from kvm_x86_init_ops
to kvm_x86_ops to allow a future patch to do compatibility checks during
CPU hotplug.

Do kvm_ops_update() before compat checks so that static_call() can be
used during compat checks.

Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Reviewed-by: default avatarKai Huang <kai.huang@intel.com>
Message-Id: <20221130230934.1014142-40-seanjc@google.com>
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
parent 325fc957
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -14,6 +14,7 @@ BUILD_BUG_ON(1)
 * to make a definition optional, but in this case the default will
 * be __static_call_return0.
 */
KVM_X86_OP(check_processor_compatibility)
KVM_X86_OP(hardware_enable)
KVM_X86_OP(hardware_disable)
KVM_X86_OP(hardware_unsetup)
+2 −1
Original line number Diff line number Diff line
@@ -1511,6 +1511,8 @@ static inline u16 kvm_lapic_irq_dest_mode(bool dest_mode_logical)
struct kvm_x86_ops {
	const char *name;

	int (*check_processor_compatibility)(void);

	int (*hardware_enable)(void);
	void (*hardware_disable)(void);
	void (*hardware_unsetup)(void);
@@ -1722,7 +1724,6 @@ struct kvm_x86_nested_ops {
};

struct kvm_x86_init_ops {
	int (*check_processor_compatibility)(void);
	int (*hardware_setup)(void);
	unsigned int (*handle_intel_pt_intr)(void);

+3 −2
Original line number Diff line number Diff line
@@ -543,7 +543,7 @@ static bool kvm_is_svm_supported(void)
	return true;
}

static int __init svm_check_processor_compat(void)
static int svm_check_processor_compat(void)
{
	if (!kvm_is_svm_supported())
		return -EIO;
@@ -4701,6 +4701,8 @@ static int svm_vm_init(struct kvm *kvm)
static struct kvm_x86_ops svm_x86_ops __initdata = {
	.name = KBUILD_MODNAME,

	.check_processor_compatibility = svm_check_processor_compat,

	.hardware_unsetup = svm_hardware_unsetup,
	.hardware_enable = svm_hardware_enable,
	.hardware_disable = svm_hardware_disable,
@@ -5085,7 +5087,6 @@ static __init int svm_hardware_setup(void)

static struct kvm_x86_init_ops svm_init_ops __initdata = {
	.hardware_setup = svm_hardware_setup,
	.check_processor_compatibility = svm_check_processor_compat,

	.runtime_ops = &svm_x86_ops,
	.pmu_ops = &amd_pmu_ops,
+1 −1
Original line number Diff line number Diff line
@@ -526,7 +526,7 @@ int nested_evmcs_check_controls(struct vmcs12 *vmcs12)
	}									\
	while (0)

__init void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf)
void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf)
{
	evmcs_check_vmcs_conf(cpu_based_exec_ctrl, EXEC_CTRL);
	evmcs_check_vmcs_conf(pin_based_exec_ctrl, PINCTRL);
+1 −1
Original line number Diff line number Diff line
@@ -271,7 +271,7 @@ static inline void evmcs_load(u64 phys_addr)
	vp_ap->enlighten_vmentry = 1;
}

__init void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf);
void evmcs_sanitize_exec_ctrls(struct vmcs_config *vmcs_conf);
#else /* !IS_ENABLED(CONFIG_HYPERV) */
static __always_inline void evmcs_write64(unsigned long field, u64 value) {}
static inline void evmcs_write32(unsigned long field, u32 value) {}
Loading