144 lines
4.8 KiB
Diff
144 lines
4.8 KiB
Diff
|
From 90a18a9e2e585413eba96ab96df4a878f6c405be Mon Sep 17 00:00:00 2001
|
||
|
From: Ani Sinha <anisinha@redhat.com>
|
||
|
Date: Thu, 8 Aug 2024 17:08:38 +0530
|
||
|
Subject: [PATCH 3/9] kvm: refactor core virtual machine creation into its own
|
||
|
function
|
||
|
|
||
|
RH-Author: Peter Xu <peterx@redhat.com>
|
||
|
RH-MergeRequest: 284: KVM: Dynamic sized kvm memslots array
|
||
|
RH-Jira: RHEL-57682
|
||
|
RH-Acked-by: Juraj Marcin <None>
|
||
|
RH-Commit: [2/7] 3db75ee31b109048ef2de5c7f193116ab8c185a7 (peterx/qemu-kvm)
|
||
|
|
||
|
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>
|
||
|
(cherry picked from commit 67388078da1cf6dac89e5a7c748cca3444d49690)
|
||
|
Signed-off-by: Peter Xu <peterx@redhat.com>
|
||
|
---
|
||
|
accel/kvm/kvm-all.c | 89 ++++++++++++++++++++++++++++-----------------
|
||
|
1 file changed, 56 insertions(+), 33 deletions(-)
|
||
|
|
||
|
diff --git a/accel/kvm/kvm-all.c b/accel/kvm/kvm-all.c
|
||
|
index b51441523d..4f96d8b45e 100644
|
||
|
--- a/accel/kvm/kvm-all.c
|
||
|
+++ b/accel/kvm/kvm-all.c
|
||
|
@@ -2385,6 +2385,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);
|
||
|
@@ -2467,45 +2521,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;
|
||
|
}
|
||
|
|
||
|
--
|
||
|
2.39.3
|
||
|
|