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;
|
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)
|
static int kvm_init(MachineState *ms)
|
||||||
{
|
{
|
||||||
MachineClass *mc = MACHINE_GET_CLASS(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);
|
s->as = g_new0(struct KVMAs, s->nr_as);
|
||||||
|
|
||||||
if (object_property_find(OBJECT(current_machine), "kvm-type")) {
|
type = find_kvm_machine_type(ms);
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type < 0) {
|
if (type < 0) {
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
goto err;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
ret = do_kvm_create_vm(ms, type);
|
||||||
ret = kvm_ioctl(s, KVM_CREATE_VM, type);
|
|
||||||
} while (ret == -EINTR);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
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;
|
goto err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user