[Libguestfs] [PATCH v2v v2 2/3] -o libvirt: Always use host-model unless overridden by source hypervisor
Richard W.M. Jones
rjones at redhat.com
Mon Feb 20 11:10:49 UTC 2023
On Mon, Feb 20, 2023 at 11:30:54AM +0100, Laszlo Ersek wrote:
> On 2/17/23 12:44, Richard W.M. Jones wrote:
> > In the case where the source hypervisor doesn't specify a CPU model,
> > previously we chose qemu64 (qemu's most basic model), except for a few
> > guests that we know won't work on qemu64, eg. RHEL 9 requires
> > x86_64-v2 where we use <cpu mode='host-model'/>
> >
> > However we recently encountered an obscure KVM bug related to this
> > (https://bugzilla.redhat.com/show_bug.cgi?id=2168082). Windows 11
> > thinks the qemu64 CPU model when booted on real AMD Milan is an AMD
> > Phenom and tried to apply an ancient erratum to it. Since KVM didn't
> > emulate the correct MSRs for this it caused the guest to fail to boot.
> >
> > After discussion upstream we can't see any reason not to give all
> > guests host-model. This should fix the bug above and also generally
> > improve performance by allowing the guest to exploit all host
> > features.
> >
> > Related: https://bugzilla.redhat.com/show_bug.cgi?id=2168082#c19
> > Related: https://listman.redhat.com/archives/libguestfs/2023-February/030624.html
> > Thanks: Laszlo Ersek, Dr. David Alan Gilbert, Daniel Berrangé
> > ---
> > output/create_libvirt_xml.ml | 59 +++++++++++++++++-------------------
> > tests/test-v2v-i-ova.xml | 1 +
> > 2 files changed, 28 insertions(+), 32 deletions(-)
> >
> > diff --git a/output/create_libvirt_xml.ml b/output/create_libvirt_xml.ml
> > index e9c6c8c150..1d77139b45 100644
> > --- a/output/create_libvirt_xml.ml
> > +++ b/output/create_libvirt_xml.ml
> > @@ -184,41 +184,36 @@ let create_libvirt_xml ?pool source inspect
> > e "vcpu" [] [PCData (string_of_int source.s_vcpu)]
> > ];
> >
> > - if source.s_cpu_model <> None ||
> > - guestcaps.gcaps_arch_min_version >= 1 ||
> > - source.s_cpu_topology <> None then (
> > - let cpu_attrs = ref []
> > - and cpu = ref [] in
> > + let cpu_attrs = ref []
> > + and cpu = ref [] in
> >
> > - (match source.s_cpu_model with
> > - | None ->
> > - 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");
> > - if model = "qemu64" then
> > - List.push_back cpu_attrs ("check", "none");
> > - (match source.s_cpu_vendor with
> > - | None -> ()
> > - | Some vendor ->
> > - List.push_back cpu (e "vendor" [] [PCData vendor])
> > - );
> > - List.push_back cpu (e "model" ["fallback", "allow"] [PCData model])
> > - );
> > - (match source.s_cpu_topology with
> > - | None -> ()
> > - | Some { s_cpu_sockets; s_cpu_cores; s_cpu_threads } ->
> > - let topology_attrs = [
> > - "sockets", string_of_int s_cpu_sockets;
> > - "cores", string_of_int s_cpu_cores;
> > - "threads", string_of_int s_cpu_threads;
> > - ] in
> > - List.push_back cpu (e "topology" topology_attrs [])
> > - );
> > -
> > - List.push_back_list body [ e "cpu" !cpu_attrs !cpu ]
> > + (match source.s_cpu_model with
> > + | None ->
> > + List.push_back cpu_attrs ("mode", "host-model");
>
> The indentation of "List.push_back" is off by one space here, as far as
> I can tell (only 1 space used instead of 2). If possible, please fix it
> up when you push the patches.
>
> Reviewed-by: Laszlo Ersek <lersek at redhat.com>
Thanks - fixed the indentation in my local copy.
Rich.
> Thanks!
> Laszlo
>
>
>
> > + | Some model ->
> > + List.push_back cpu_attrs ("match", "minimum");
> > + if model = "qemu64" then
> > + List.push_back cpu_attrs ("check", "none");
> > + (match source.s_cpu_vendor with
> > + | None -> ()
> > + | Some vendor ->
> > + List.push_back cpu (e "vendor" [] [PCData vendor])
> > + );
> > + List.push_back cpu (e "model" ["fallback", "allow"] [PCData model])
> > + );
> > + (match source.s_cpu_topology with
> > + | None -> ()
> > + | Some { s_cpu_sockets; s_cpu_cores; s_cpu_threads } ->
> > + let topology_attrs = [
> > + "sockets", string_of_int s_cpu_sockets;
> > + "cores", string_of_int s_cpu_cores;
> > + "threads", string_of_int s_cpu_threads;
> > + ] in
> > + List.push_back cpu (e "topology" topology_attrs [])
> > );
> >
> > + List.push_back_list body [ e "cpu" !cpu_attrs !cpu ];
> > +
> > let uefi_firmware =
> > match target_firmware with
> > | TargetBIOS -> None
> > diff --git a/tests/test-v2v-i-ova.xml b/tests/test-v2v-i-ova.xml
> > index da1db473e5..e5907ea1cc 100644
> > --- a/tests/test-v2v-i-ova.xml
> > +++ b/tests/test-v2v-i-ova.xml
> > @@ -10,6 +10,7 @@
> > <memory unit='KiB'>2097152</memory>
> > <currentMemory unit='KiB'>2097152</currentMemory>
> > <vcpu>1</vcpu>
> > + <cpu mode='host-model'/>
> > <features>
> > <acpi/>
> > <apic/>
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
nbdkit - Flexible, fast NBD server with plugins
https://gitlab.com/nbdkit/nbdkit
More information about the Libguestfs
mailing list