[Libguestfs] [PATCH] always 'max' for the appliance CPU model on all targes except ppc
Laszlo Ersek
lersek at redhat.com
Wed Jul 20 11:54:48 UTC 2022
On 07/20/22 13:51, Richard W.M. Jones wrote:
> On Wed, Jul 20, 2022 at 10:14:00AM +0200, Laszlo Ersek wrote:
>> On 05/27/22 10:21, Laszlo Ersek wrote:
>>> On 05/25/22 15:30, Daniel P. Berrangé wrote:
>>>> The current logic for selecting CPU model to use with the appliance
>>>> selects 'max' for all architectures except for ppc64le and aarch64.
>>>>
>>>> On aarch64, it selects 'host' if KVM is available which is identical
>>>> to 'max'. For TCG it selects 'cortex-a57'. The 'max' model is a
>>>> superset of 'cortex-a57', so it is reasonable to use 'max' for TCG
>>>> too.
>>>>
>>>> On ppc64, it selects no CPU model due to a historical bug where
>>>> using 'host' would break ability to fallback to TCG. Unfortunately
>>>> we can't use 'max' on PPC as this is actually an old G4 vintage
>>>> 32-bit model, rather than a synonym for 'host' / all-TCG-features
>>>> as on other targets.
>>>>
>>>> We can at least simplify the code to use 'max' in all scenarios
>>>> for appliance CPU model, and simply skip a CPU model for PPC.
>>>>
>>>> Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
>>>> ---
>>>> docs/C_SOURCE_FILES | 1 -
>>>> lib/Makefile.am | 1 -
>>>> lib/appliance-cpu.c | 93 ------------------------------------------
>>>> lib/guestfs-internal.h | 3 --
>>>> lib/launch-direct.c | 25 +++++-------
>>>> lib/launch-libvirt.c | 40 ++++++++----------
>>>> po/POTFILES | 1 -
>>>> 7 files changed, 27 insertions(+), 137 deletions(-)
>>>> delete mode 100644 lib/appliance-cpu.c
>>>>
>>>> diff --git a/docs/C_SOURCE_FILES b/docs/C_SOURCE_FILES
>>>> index a367c93a0..a26487d99 100644
>>>> --- a/docs/C_SOURCE_FILES
>>>> +++ b/docs/C_SOURCE_FILES
>>>> @@ -283,7 +283,6 @@ lib/actions-6.c
>>>> lib/actions-support.c
>>>> lib/actions-variants.c
>>>> lib/alloc.c
>>>> -lib/appliance-cpu.c
>>>> lib/appliance-kcmdline.c
>>>> lib/appliance-uefi.c
>>>> lib/appliance.c
>>>> diff --git a/lib/Makefile.am b/lib/Makefile.am
>>>> index 212bcb94a..40a4c9ac3 100644
>>>> --- a/lib/Makefile.am
>>>> +++ b/lib/Makefile.am
>>>> @@ -71,7 +71,6 @@ libguestfs_la_SOURCES = \
>>>> actions-variants.c \
>>>> alloc.c \
>>>> appliance.c \
>>>> - appliance-cpu.c \
>>>> appliance-kcmdline.c \
>>>> appliance-uefi.c \
>>>> available.c \
>>>> diff --git a/lib/appliance-cpu.c b/lib/appliance-cpu.c
>>>> deleted file mode 100644
>>>> index 54ac6e2e3..000000000
>>>> --- a/lib/appliance-cpu.c
>>>> +++ /dev/null
>>>> @@ -1,93 +0,0 @@
>>>> -/* libguestfs
>>>> - * Copyright (C) 2009-2020 Red Hat Inc.
>>>> - *
>>>> - * This library is free software; you can redistribute it and/or
>>>> - * modify it under the terms of the GNU Lesser General Public
>>>> - * License as published by the Free Software Foundation; either
>>>> - * version 2 of the License, or (at your option) any later version.
>>>> - *
>>>> - * This library is distributed in the hope that it will be useful,
>>>> - * but WITHOUT ANY WARRANTY; without even the implied warranty of
>>>> - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
>>>> - * Lesser General Public License for more details.
>>>> - *
>>>> - * You should have received a copy of the GNU Lesser General Public
>>>> - * License along with this library; if not, write to the Free Software
>>>> - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
>>>> - */
>>>> -
>>>> -/**
>>>> - * The appliance choice of CPU model.
>>>> - */
>>>> -
>>>> -#include <config.h>
>>>> -
>>>> -#include <stdio.h>
>>>> -#include <stdlib.h>
>>>> -
>>>> -#include "guestfs.h"
>>>> -#include "guestfs-internal.h"
>>>> -
>>>> -/**
>>>> - * Return the right CPU model to use as the qemu C<-cpu> parameter or
>>>> - * its equivalent in libvirt. This returns:
>>>> - *
>>>> - * =over 4
>>>> - *
>>>> - * =item C<"host">
>>>> - *
>>>> - * The literal string C<"host"> means use C<-cpu host>.
>>>> - *
>>>> - * =item C<"max">
>>>> - *
>>>> - * The literal string C<"max"> means use C<-cpu max> (the best
>>>> - * possible). This requires awkward translation for libvirt.
>>>> - *
>>>> - * =item some string
>>>> - *
>>>> - * Some string such as C<"cortex-a57"> means use C<-cpu cortex-a57>.
>>>> - *
>>>> - * =item C<NULL>
>>>> - *
>>>> - * C<NULL> means no C<-cpu> option at all. Note returning C<NULL>
>>>> - * does not indicate an error.
>>>> - *
>>>> - * =back
>>>> - *
>>>> - * This is made unnecessarily hard and fragile because of two stupid
>>>> - * choices in QEMU:
>>>> - *
>>>> - * =over 4
>>>> - *
>>>> - * =item *
>>>> - *
>>>> - * The default for C<qemu-system-aarch64 -M virt> is to emulate a
>>>> - * C<cortex-a15> (WTF?).
>>>> - *
>>>> - * =item *
>>>> - *
>>>> - * We don't know for sure if KVM will work, but C<-cpu host> is broken
>>>> - * with TCG, so we almost always pass a broken C<-cpu> flag if KVM is
>>>> - * semi-broken in any way.
>>>> - *
>>>> - * =back
>>>> - */
>>>> -const char *
>>>> -guestfs_int_get_cpu_model (int kvm)
>>>> -{
>>>> -#if defined(__aarch64__)
>>>> - /* With -M virt, the default -cpu is cortex-a15. Stupid. */
>>>> - if (kvm)
>>>> - return "host";
>>>> - else
>>>> - return "cortex-a57";
>>>> -#elif defined(__powerpc64__)
>>>> - /* See discussion in https://bugzilla.redhat.com/show_bug.cgi?id=1605071 */
>>>> - return NULL;
>>>> -#else
>>>> - /* On most architectures we can use "max" to get the best possible CPU.
>>>> - * For recent qemu this should work even on TCG.
>>>> - */
>>>> - return "max";
>>>> -#endif
>>>> -}
>>>> diff --git a/lib/guestfs-internal.h b/lib/guestfs-internal.h
>>>> index 16755cfb3..33037a26d 100644
>>>> --- a/lib/guestfs-internal.h
>>>> +++ b/lib/guestfs-internal.h
>>>> @@ -718,9 +718,6 @@ extern const char *guestfs_int_drive_protocol_to_string (enum drive_protocol pro
>>>> /* appliance.c */
>>>> extern int guestfs_int_build_appliance (guestfs_h *g, char **kernel, char **initrd, char **appliance);
>>>>
>>>> -/* appliance-cpu.c */
>>>> -const char *guestfs_int_get_cpu_model (int kvm);
>>>> -
>>>> /* appliance-kcmdline.c */
>>>> extern char *guestfs_int_appliance_command_line (guestfs_h *g, const char *appliance, int flags);
>>>> #define APPLIANCE_COMMAND_LINE_IS_TCG 1
>>>> diff --git a/lib/launch-direct.c b/lib/launch-direct.c
>>>> index ff0eaeb62..f41711353 100644
>>>> --- a/lib/launch-direct.c
>>>> +++ b/lib/launch-direct.c
>>>> @@ -354,7 +354,6 @@ launch_direct (guestfs_h *g, void *datav, const char *arg)
>>>> int force_tcg;
>>>> int force_kvm;
>>>> const char *accel_val = "kvm:tcg";
>>>> - const char *cpu_model;
>>>> CLEANUP_FREE char *append = NULL;
>>>> CLEANUP_FREE_STRING_LIST char **argv = NULL;
>>>>
>>>> @@ -517,20 +516,18 @@ launch_direct (guestfs_h *g, void *datav, const char *arg)
>>>> #endif
>>>> } end_list ();
>>>>
>>>> - cpu_model = guestfs_int_get_cpu_model (has_kvm && !force_tcg);
>>>> - if (cpu_model) {
>>>> -#if defined(__x86_64__)
>>>> - /* Temporary workaround for RHBZ#2082806 */
>>>> - if (STREQ (cpu_model, "max")) {
>>>> - start_list ("-cpu") {
>>>> - append_list (cpu_model);
>>>> - append_list ("la57=off");
>>>> - } end_list ();
>>>> - }
>>>> - else
>>>> + /*
>>>> + * Can't use 'max' on ppc64 since it is an old G4 model
>>>> + * Also can't use 'host' due to TCG fallback issues
>>>> + * https://bugzilla.redhat.com/show_bug.cgi?id=1605071
>>>> + */
>>>> +#if !defined(__powerpc64__)
>>>> +# if defined(__x86_64__)
>>>> + arg ("-cpu", "max,la57=off");
>>>> +# else
>>>> + arg ("-cpu", "max");
>>>> +# endif
>>>> #endif
>>>> - arg ("-cpu", cpu_model);
>>>> - }
>>>>
>>>> if (g->smp > 1)
>>>> arg_format ("-smp", "%d", g->smp);
>>>> diff --git a/lib/launch-libvirt.c b/lib/launch-libvirt.c
>>>> index 03d69e027..b97c91566 100644
>>>> --- a/lib/launch-libvirt.c
>>>> +++ b/lib/launch-libvirt.c
>>>> @@ -1161,8 +1161,6 @@ construct_libvirt_xml_cpu (guestfs_h *g,
>>>> const struct libvirt_xml_params *params,
>>>> xmlTextWriterPtr xo)
>>>> {
>>>> - const char *cpu_model;
>>>> -
>>>> start_element ("memory") {
>>>> attribute ("unit", "MiB");
>>>> string_format ("%d", g->memsize);
>>>> @@ -1173,30 +1171,24 @@ construct_libvirt_xml_cpu (guestfs_h *g,
>>>> string_format ("%d", g->memsize);
>>>> } end_element ();
>>>>
>>>> - cpu_model = guestfs_int_get_cpu_model (params->data->is_kvm);
>>>> - if (cpu_model) {
>>>> - start_element ("cpu") {
>>>> - if (STREQ (cpu_model, "host")) {
>>>> - attribute ("mode", "host-passthrough");
>>>> - start_element ("model") {
>>>> - attribute ("fallback", "allow");
>>>> - } end_element ();
>>>> - }
>>>> - else if (STREQ (cpu_model, "max")) {
>>>> - /* https://bugzilla.redhat.com/show_bug.cgi?id=1935572#c11 */
>>>> - attribute ("mode", "maximum");
>>>> + /*
>>>> + * Can't use 'max' on ppc64 since it is an old G4 model
>>>> + * Also can't use 'host' due to TCG fallback issues
>>>> + * https://bugzilla.redhat.com/show_bug.cgi?id=1605071
>>>> + */
>>>> +#if !defined(__powerpc64__)
>>>> + start_element ("cpu") {
>>>> + /* https://bugzilla.redhat.com/show_bug.cgi?id=1935572#c11 */
>>>> + attribute ("mode", "maximum");
>>>> #if defined(__x86_64__)
>>>> - /* Temporary workaround for RHBZ#2082806 */
>>>> - start_element ("feature") {
>>>> - attribute ("policy", "disable");
>>>> - attribute ("name", "la57");
>>>> - } end_element ();
>>>> -#endif
>>>> - }
>>>> - else
>>>> - single_element ("model", cpu_model);
>>>> + /* Temporary workaround for RHBZ#2082806 */
>>>> + start_element ("feature") {
>>>> + attribute ("policy", "disable");
>>>> + attribute ("name", "la57");
>>>> } end_element ();
>>>> - }
>>>> +#endif
>>>> + } end_element ();
>>>> +#endif
>>>>
>>>> single_element_format ("vcpu", "%d", g->smp);
>>>>
>>>> diff --git a/po/POTFILES b/po/POTFILES
>>>> index 32b975a04..67cdffb29 100644
>>>> --- a/po/POTFILES
>>>> +++ b/po/POTFILES
>>>> @@ -329,7 +329,6 @@ lib/actions-6.c
>>>> lib/actions-support.c
>>>> lib/actions-variants.c
>>>> lib/alloc.c
>>>> -lib/appliance-cpu.c
>>>> lib/appliance-kcmdline.c
>>>> lib/appliance-uefi.c
>>>> lib/appliance.c
>>>>
>>>
>>> Acked-by: Laszlo Ersek <lersek at redhat.com>
>>>
>>
>> Was this patch forgotten? I don't see it in the commit history (by subject).
>
> No, but in hindsight I'm lukewarm about deleting lib/appliance-cpu.c.
> Turns out we needed another exception for RISC-V, so keeping this file
> around seems like a good idea.
OK! Just wanted to reach closure on this thread, as I happened to look
at CPU models for a different reason.
Laszlo
More information about the Libguestfs
mailing list