KVM: Directly return result from kvm_arch_check_processor_compat()
Add a wrapper to invoke kvm_arch_check_processor_compat() so that the boilerplate ugliness of checking virtualization support on all CPUs is hidden from the arch specific code. x86's implementation in particular is quite heinous, as it unnecessarily propagates the out-param pattern into kvm_x86_ops. While the x86 specific issue could be resolved solely by changing kvm_x86_ops, make the change for all architectures as returning a value directly is prettier and technically more robust, e.g. s390 doesn't set the out param, which could lead to subtle breakage in the (highly unlikely) scenario where the out-param was not pre-initialized by the caller. Opportunistically annotate svm_check_processor_compat() with __init. Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com> Reviewed-by: Cornelia Huck <cohuck@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
0532dd52df
commit
f257d6dcda
|
@ -123,9 +123,9 @@ int kvm_arch_hardware_setup(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void kvm_arch_check_processor_compat(void *rtn)
|
||||
int kvm_arch_check_processor_compat(void)
|
||||
{
|
||||
*(int *)rtn = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||
|
|
|
@ -425,9 +425,9 @@ int kvm_arch_hardware_setup(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void kvm_arch_check_processor_compat(void *rtn)
|
||||
int kvm_arch_check_processor_compat(void)
|
||||
{
|
||||
*(int *)rtn = kvmppc_core_check_processor_compat();
|
||||
return kvmppc_core_check_processor_compat();
|
||||
}
|
||||
|
||||
int kvm_arch_init_vm(struct kvm *kvm, unsigned long type)
|
||||
|
|
|
@ -905,7 +905,6 @@ extern int kvm_s390_gisc_register(struct kvm *kvm, u32 gisc);
|
|||
extern int kvm_s390_gisc_unregister(struct kvm *kvm, u32 gisc);
|
||||
|
||||
static inline void kvm_arch_hardware_disable(void) {}
|
||||
static inline void kvm_arch_check_processor_compat(void *rtn) {}
|
||||
static inline void kvm_arch_sync_events(struct kvm *kvm) {}
|
||||
static inline void kvm_arch_vcpu_uninit(struct kvm_vcpu *vcpu) {}
|
||||
static inline void kvm_arch_sched_in(struct kvm_vcpu *vcpu, int cpu) {}
|
||||
|
|
|
@ -227,6 +227,11 @@ int kvm_arch_hardware_enable(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
int kvm_arch_check_processor_compat(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void kvm_gmap_notifier(struct gmap *gmap, unsigned long start,
|
||||
unsigned long end);
|
||||
|
||||
|
|
|
@ -999,7 +999,7 @@ struct kvm_x86_ops {
|
|||
int (*disabled_by_bios)(void); /* __init */
|
||||
int (*hardware_enable)(void);
|
||||
void (*hardware_disable)(void);
|
||||
void (*check_processor_compatibility)(void *rtn);
|
||||
int (*check_processor_compatibility)(void);/* __init */
|
||||
int (*hardware_setup)(void); /* __init */
|
||||
void (*hardware_unsetup)(void); /* __exit */
|
||||
bool (*cpu_has_accelerated_tpr)(void);
|
||||
|
|
|
@ -5871,9 +5871,9 @@ svm_patch_hypercall(struct kvm_vcpu *vcpu, unsigned char *hypercall)
|
|||
hypercall[2] = 0xd9;
|
||||
}
|
||||
|
||||
static void svm_check_processor_compat(void *rtn)
|
||||
static int __init svm_check_processor_compat(void)
|
||||
{
|
||||
*(int *)rtn = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool svm_cpu_has_accelerated_tpr(void)
|
||||
|
|
|
@ -6733,22 +6733,22 @@ static int vmx_vm_init(struct kvm *kvm)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static void __init vmx_check_processor_compat(void *rtn)
|
||||
static int __init vmx_check_processor_compat(void)
|
||||
{
|
||||
struct vmcs_config vmcs_conf;
|
||||
struct vmx_capability vmx_cap;
|
||||
|
||||
*(int *)rtn = 0;
|
||||
if (setup_vmcs_config(&vmcs_conf, &vmx_cap) < 0)
|
||||
*(int *)rtn = -EIO;
|
||||
return -EIO;
|
||||
if (nested)
|
||||
nested_vmx_setup_ctls_msrs(&vmcs_conf.nested, vmx_cap.ept,
|
||||
enable_apicv);
|
||||
if (memcmp(&vmcs_config, &vmcs_conf, sizeof(struct vmcs_config)) != 0) {
|
||||
printk(KERN_ERR "kvm: CPU %d feature inconsistency!\n",
|
||||
smp_processor_id());
|
||||
*(int *)rtn = -EIO;
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static u64 vmx_get_mt_mask(struct kvm_vcpu *vcpu, gfn_t gfn, bool is_mmio)
|
||||
|
|
|
@ -9082,9 +9082,9 @@ void kvm_arch_hardware_unsetup(void)
|
|||
kvm_x86_ops->hardware_unsetup();
|
||||
}
|
||||
|
||||
void kvm_arch_check_processor_compat(void *rtn)
|
||||
int kvm_arch_check_processor_compat(void)
|
||||
{
|
||||
kvm_x86_ops->check_processor_compatibility(rtn);
|
||||
return kvm_x86_ops->check_processor_compatibility();
|
||||
}
|
||||
|
||||
bool kvm_vcpu_is_reset_bsp(struct kvm_vcpu *vcpu)
|
||||
|
|
|
@ -870,7 +870,7 @@ int kvm_arch_hardware_enable(void);
|
|||
void kvm_arch_hardware_disable(void);
|
||||
int kvm_arch_hardware_setup(void);
|
||||
void kvm_arch_hardware_unsetup(void);
|
||||
void kvm_arch_check_processor_compat(void *rtn);
|
||||
int kvm_arch_check_processor_compat(void);
|
||||
int kvm_arch_vcpu_runnable(struct kvm_vcpu *vcpu);
|
||||
bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu);
|
||||
int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu);
|
||||
|
|
|
@ -105,9 +105,9 @@ int kvm_arch_hardware_setup(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
void kvm_arch_check_processor_compat(void *rtn)
|
||||
int kvm_arch_check_processor_compat(void)
|
||||
{
|
||||
*(int *)rtn = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -4224,6 +4224,11 @@ static void kvm_sched_out(struct preempt_notifier *pn,
|
|||
kvm_arch_vcpu_put(vcpu);
|
||||
}
|
||||
|
||||
static void check_processor_compat(void *rtn)
|
||||
{
|
||||
*(int *)rtn = kvm_arch_check_processor_compat();
|
||||
}
|
||||
|
||||
int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
|
||||
struct module *module)
|
||||
{
|
||||
|
@ -4255,9 +4260,7 @@ int kvm_init(void *opaque, unsigned vcpu_size, unsigned vcpu_align,
|
|||
goto out_free_0a;
|
||||
|
||||
for_each_online_cpu(cpu) {
|
||||
smp_call_function_single(cpu,
|
||||
kvm_arch_check_processor_compat,
|
||||
&r, 1);
|
||||
smp_call_function_single(cpu, check_processor_compat, &r, 1);
|
||||
if (r < 0)
|
||||
goto out_free_1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue