[Libguestfs] [v2v PATCH 9/9] convert_linux: set "gcaps_default_cpu = false" for x86_64 RHEL-9.0+ guests

Laszlo Ersek
2022-04-20T16:23:33Z

RHEL >= 9.0 on x86_64 requires the processor to support the
"x86-64-v2"
microarchitecture level, which the default QEMU VCPU model does not
satisfy. Activate host-passthrough for such guest OSes.

(Libosinfo does not track processor support, so in the future we may have
to extend the expression added in this patch to other distros.)

Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2076013
Signed-off-by: Laszlo Ersek <lersek at redhat.com>
---
 convert/convert_linux.ml | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/convert/convert_linux.ml b/convert/convert_linux.ml
index 93b3922cac60..5660494973b1 100644
--- a/convert/convert_linux.ml
+++ b/convert/convert_linux.ml
@@ -139,65 +139,73 @@ let convert (g : G.guestfs) source inspect
keep_serial_console _             let { Libosinfo_utils.q35; vio10 }
Libosinfo_utils.os_support_of_osinfo_device_list devices in
            (if q35 then Q35 else I440FX), vio10
          with
          | Not_found ->
            (* Pivot on the year 2007.  Any Linux distro from earlier than 2007
             * should use i440fx, anything 2007 or newer should use q35.
             *)
            (match inspect.i_distro, inspect.i_major_version with
             | "fedora", _ -> Q35
             |
("rhel"|"centos"|"scientificlinux"|"redhat-based"|"oraclelinux"),
               major ->
               if major <= 4 then I440FX else Q35
             | ("sles"|"suse-based"|"opensuse"),
major ->
               if major < 10 then I440FX else Q35
             |
("debian"|"ubuntu"|"linuxmint"|"kalilinux"),
major ->
               if major < 4 then I440FX else Q35

             (* reasonable default for all modern Linux kernels *)
             | _, _ -> Q35
            ), true
         )

       | _ -> Virt, true
     in

+    (* RHEL >= 9.0 on x86_64 requires the processor to support the
"x86-64-v2"
+     * microarchitecture level, which the default QEMU VCPU model does not
+     * satisfy.  Refer to RHBZ#2076013.
+     *)
+    let default_cpu_suffices = inspect.i_distro <> "rhel" ||
+                               inspect.i_arch <> "x86_64" ||
+                               inspect.i_major_version < 9 in
+
     (* Return guest capabilities from the convert () function. *)
     let guestcaps = {
       gcaps_block_bus = block_type;
       gcaps_net_bus = net_type;
       gcaps_virtio_rng = kernel.ki_supports_virtio_rng;
       gcaps_virtio_balloon = kernel.ki_supports_virtio_balloon;
       gcaps_isa_pvpanic = kernel.ki_supports_isa_pvpanic;
       gcaps_virtio_socket = kernel.ki_supports_virtio_socket;
       gcaps_machine = machine;
       gcaps_arch = Utils.kvm_arch inspect.i_arch;
       gcaps_acpi = acpi;
       gcaps_virtio_1_0 = virtio_1_0;
-      gcaps_default_cpu = true;
+      gcaps_default_cpu = default_cpu_suffices;
     } in

     guestcaps

   and augeas_grub_configuration ()      if bootloader#set_augeas_configuration
() then
       Linux.augeas_reload g

   and unconfigure_xen ()      (* Remove kmod-xenpv-* (RHEL 3). *)
     let xenmods        List.filter_map (
         fun { G.app2_name = name } ->
           if name = "kmod-xenpv" || String.is_prefix name
"kmod-xenpv-" then
             Some name
           else
             None
       ) inspect.i_apps in
     Linux.remove g inspect xenmods;

     (* Undo related nastiness if kmod-xenpv was installed. *)
     if xenmods <> [] then (
       (* kmod-xenpv modules may have been manually copied to other kernels.
        * Hunt them down and destroy them.
        *)
       let dirs = g#find "/lib/modules" in
--
2.19.1.3.g30247aa5d201