Some guests require not just a specific architecture, but cannot run
on qemu's default CPU model, eg. requiring x86_64-v2. Since we
anticipate future guests requiring higher versions, let's encode the
minimum architecture version instead of a simple boolean.
This patch essentially just remaps:
gcaps_default_cpu = true => gcaps_arch_min_version = 0
gcaps_default_cpu = false => gcaps_arch_min_version = 2
and updates the comments.
Updates: commit a50b975024ac5e46e107882e27fea498bf425685
---
lib/types.mli | 19 +++++++++++--------
convert/convert_linux.ml | 9 +++++----
convert/convert_windows.ml | 2 +-
lib/types.ml | 6 +++---
output/create_libvirt_xml.ml | 4 ++--
output/output_qemu.ml | 6 +++---
6 files changed, 25 insertions(+), 21 deletions(-)
diff --git a/lib/types.mli b/lib/types.mli
index 24a93760cf..4a2bb5b371 100644
--- a/lib/types.mli
+++ b/lib/types.mli
@@ -263,24 +263,27 @@ type guestcaps = {
gcaps_machine : guestcaps_machine; (** Machine model. *)
gcaps_arch : string; (** Architecture that KVM must emulate. *)
- gcaps_virtio_1_0 : bool;
- (** The guest supports the virtio devices that it does at the virtio-1.0
- protocol level. *)
+ gcaps_arch_min_version : int;
+ (** Some guest OSes require not just a specific architecture, but a
+ minimum version. Notably RHEL >= 9 requires at least x86_64-v2.
- gcaps_default_cpu : bool;
- (** True iff the guest OS is capable of running on QEMU's default VCPU model
- (eg. "-cpu qemu64" with the Q35 and I440FX machine types).
+ If the guest is capable of running on QEMU's default VCPU model
+ for the architecture then this is set to [0].
This capability only matters for the QEMU and libvirt output modules,
- where, in case the capability is false *and* the source hypervisor does
+ where, in case the capability is false {b and} the source hypervisor does
not specify a VCPU model, we must manually present the guest OS with a
VCPU that looks as close as possible to a physical CPU. (In that case, we
- specify host-passthrough.)
+ specify host-model.)
The management applications targeted by the RHV and OpenStack output
modules have their own explicit VCPU defaults, overriding the QEMU default
model even in case the source hypervisor does not specify a VCPU model;
those modules ignore this capability therefore. Refer to RHBZ#2076013. *)
+
+ gcaps_virtio_1_0 : bool;
+ (** The guest supports the virtio devices that it does at the virtio-1.0
+ protocol level. *)
}
(** Guest capabilities after conversion. eg. Was virtio found or installed? *)
diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
index 460cbff0ed..d5c0f24dbb 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -203,9 +203,10 @@ let convert (g : G.guestfs) source inspect i_firmware
keep_serial_console _ =
* microarchitecture level, which the default QEMU VCPU model does not
* satisfy. Refer to RHBZ#2076013 RHBZ#2166619.
*)
- let default_cpu_suffices = family <> `RHEL_family ||
- inspect.i_arch <> "x86_64" ||
- inspect.i_major_version < 9 in
+ let arch_min_version =
+ if family <> `RHEL_family || inspect.i_arch <> "x86_64" ||
+ inspect.i_major_version < 9
+ then 0 else 2 in
(* Return guest capabilities from the convert () function. *)
let guestcaps = {
@@ -217,8 +218,8 @@ let convert (g : G.guestfs) source inspect i_firmware
keep_serial_console _ =
gcaps_virtio_socket = kernel.ki_supports_virtio_socket;
gcaps_machine = machine;
gcaps_arch = Utils.kvm_arch inspect.i_arch;
+ gcaps_arch_min_version = arch_min_version;
gcaps_virtio_1_0 = virtio_1_0;
- gcaps_default_cpu = default_cpu_suffices;
} in
guestcaps
diff --git a/convert/convert_windows.ml b/convert/convert_windows.ml
index 8d3737995f..9d8d271d05 100644
--- a/convert/convert_windows.ml
+++ b/convert/convert_windows.ml
@@ -265,8 +265,8 @@ let convert (g : G.guestfs) _ inspect i_firmware _ static_ips =
gcaps_machine = of_virtio_win_machine_type
virtio_win_installed.Inject_virtio_win.machine;
gcaps_arch = Utils.kvm_arch inspect.i_arch;
+ gcaps_arch_min_version = 0;
gcaps_virtio_1_0 = virtio_win_installed.Inject_virtio_win.virtio_1_0;
- gcaps_default_cpu = true;
} in
guestcaps
diff --git a/lib/types.ml b/lib/types.ml
index 98f8bc6fa5..6c019ae130 100644
--- a/lib/types.ml
+++ b/lib/types.ml
@@ -397,8 +397,8 @@ type guestcaps = {
gcaps_virtio_socket : bool;
gcaps_machine : guestcaps_machine;
gcaps_arch : string;
+ gcaps_arch_min_version : int;
gcaps_virtio_1_0 : bool;
- gcaps_default_cpu : bool;
}
and guestcaps_block_type = Virtio_blk | IDE
and guestcaps_net_type = Virtio_net | E1000 | RTL8139
@@ -426,8 +426,8 @@ let string_of_guestcaps gcaps =
gcaps_virtio_socket = %b\n\
gcaps_machine = %s\n\
gcaps_arch = %s\n\
+ gcaps_arch_min_version = %d\n\
gcaps_virtio_1_0 = %b\n\
- gcaps_default_cpu = %b\n\
"
(string_of_block_type gcaps.gcaps_block_bus)
(string_of_net_type gcaps.gcaps_net_bus)
@@ -437,8 +437,8 @@ let string_of_guestcaps gcaps =
gcaps.gcaps_virtio_socket
(string_of_machine gcaps.gcaps_machine)
gcaps.gcaps_arch
+ gcaps.gcaps_arch_min_version
gcaps.gcaps_virtio_1_0
- gcaps.gcaps_default_cpu
type target_buses = {
target_virtio_blk_bus : target_bus_slot array;
diff --git a/output/create_libvirt_xml.ml b/output/create_libvirt_xml.ml
index 60977cf5bb..e9c6c8c150 100644
--- a/output/create_libvirt_xml.ml
+++ b/output/create_libvirt_xml.ml
@@ -185,14 +185,14 @@ let create_libvirt_xml ?pool source inspect
];
if source.s_cpu_model <> None ||
- not guestcaps.gcaps_default_cpu ||
+ guestcaps.gcaps_arch_min_version >= 1 ||
source.s_cpu_topology <> None then (
let cpu_attrs = ref []
and cpu = ref [] in
(match source.s_cpu_model with
| None ->
- if not guestcaps.gcaps_default_cpu then
+ if guestcaps.gcaps_arch_min_version >= 1 then
List.push_back cpu_attrs ("mode", "host-model");
| Some model ->
List.push_back cpu_attrs ("match", "minimum");
diff --git a/output/output_qemu.ml b/output/output_qemu.ml
index b667e782ed..491906ebf9 100644
--- a/output/output_qemu.ml
+++ b/output/output_qemu.ml
@@ -175,9 +175,9 @@ module QEMU = struct
arg "-m" (Int64.to_string (source.s_memory /^ 1024L /^ 1024L));
- (match source.s_cpu_model, guestcaps.gcaps_default_cpu with
- | None, true -> ()
- | None, false -> arg "-cpu" "host"
+ (match source.s_cpu_model, guestcaps.gcaps_arch_min_version with
+ | None, 0 -> ()
+ | None, _ -> arg "-cpu" "host"
| Some model, _ -> arg "-cpu" model
);
--
2.39.0