mirror of https://github.com/xemu-project/xemu.git
kvm: refactor core virtual machine creation into its own function
Refactoring the core logic around KVM_CREATE_VM into its own separate function so that it can be called from other functions in subsequent patches. There is no functional change in this patch. CC: pbonzini@redhat.com CC: zhao1.liu@intel.com Signed-off-by: Ani Sinha <anisinha@redhat.com> Link: https://lore.kernel.org/r/20240808113838.1697366-1-anisinha@redhat.com Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
dc44854978
commit
67388078da
|
@ -2381,6 +2381,60 @@ uint32_t kvm_dirty_ring_size(void)
|
|||
return kvm_state->kvm_dirty_ring_size;
|
||||
}
|
||||
|
||||
static int do_kvm_create_vm(MachineState *ms, int type)
|
||||
{
|
||||
KVMState *s;
|
||||
int ret;
|
||||
|
||||
s = KVM_STATE(ms->accelerator);
|
||||
|
||||
do {
|
||||
ret = kvm_ioctl(s, KVM_CREATE_VM, type);
|
||||
} while (ret == -EINTR);
|
||||
|
||||
if (ret < 0) {
|
||||
error_report("ioctl(KVM_CREATE_VM) failed: %s", strerror(-ret));
|
||||
|
||||
#ifdef TARGET_S390X
|
||||
if (ret == -EINVAL) {
|
||||
error_printf("Host kernel setup problem detected."
|
||||
" Please verify:\n");
|
||||
error_printf("- for kernels supporting the"
|
||||
" switch_amode or user_mode parameters, whether");
|
||||
error_printf(" user space is running in primary address space\n");
|
||||
error_printf("- for kernels supporting the vm.allocate_pgste"
|
||||
" sysctl, whether it is enabled\n");
|
||||
}
|
||||
#elif defined(TARGET_PPC)
|
||||
if (ret == -EINVAL) {
|
||||
error_printf("PPC KVM module is not loaded. Try modprobe kvm_%s.\n",
|
||||
(type == 2) ? "pr" : "hv");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int find_kvm_machine_type(MachineState *ms)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
int type;
|
||||
|
||||
if (object_property_find(OBJECT(current_machine), "kvm-type")) {
|
||||
g_autofree char *kvm_type;
|
||||
kvm_type = object_property_get_str(OBJECT(current_machine),
|
||||
"kvm-type",
|
||||
&error_abort);
|
||||
type = mc->kvm_type(ms, kvm_type);
|
||||
} else if (mc->kvm_type) {
|
||||
type = mc->kvm_type(ms, NULL);
|
||||
} else {
|
||||
type = kvm_arch_get_default_type(ms);
|
||||
}
|
||||
return type;
|
||||
}
|
||||
|
||||
static int kvm_init(MachineState *ms)
|
||||
{
|
||||
MachineClass *mc = MACHINE_GET_CLASS(ms);
|
||||
|
@ -2463,45 +2517,14 @@ static int kvm_init(MachineState *ms)
|
|||
}
|
||||
s->as = g_new0(struct KVMAs, s->nr_as);
|
||||
|
||||
if (object_property_find(OBJECT(current_machine), "kvm-type")) {
|
||||
g_autofree char *kvm_type = object_property_get_str(OBJECT(current_machine),
|
||||
"kvm-type",
|
||||
&error_abort);
|
||||
type = mc->kvm_type(ms, kvm_type);
|
||||
} else if (mc->kvm_type) {
|
||||
type = mc->kvm_type(ms, NULL);
|
||||
} else {
|
||||
type = kvm_arch_get_default_type(ms);
|
||||
}
|
||||
|
||||
type = find_kvm_machine_type(ms);
|
||||
if (type < 0) {
|
||||
ret = -EINVAL;
|
||||
goto err;
|
||||
}
|
||||
|
||||
do {
|
||||
ret = kvm_ioctl(s, KVM_CREATE_VM, type);
|
||||
} while (ret == -EINTR);
|
||||
|
||||
ret = do_kvm_create_vm(ms, type);
|
||||
if (ret < 0) {
|
||||
error_report("ioctl(KVM_CREATE_VM) failed: %s", strerror(-ret));
|
||||
|
||||
#ifdef TARGET_S390X
|
||||
if (ret == -EINVAL) {
|
||||
error_printf("Host kernel setup problem detected."
|
||||
" Please verify:\n");
|
||||
error_printf("- for kernels supporting the"
|
||||
" switch_amode or user_mode parameters, whether");
|
||||
error_printf(" user space is running in primary address space\n");
|
||||
error_printf("- for kernels supporting the vm.allocate_pgste"
|
||||
" sysctl, whether it is enabled\n");
|
||||
}
|
||||
#elif defined(TARGET_PPC)
|
||||
if (ret == -EINVAL) {
|
||||
error_printf("PPC KVM module is not loaded. Try modprobe kvm_%s.\n",
|
||||
(type == 2) ? "pr" : "hv");
|
||||
}
|
||||
#endif
|
||||
goto err;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue