On Tue, Dec 08, 2020 at 12:32:46PM -0300, Daniel Henrique Barboza wrote:
> 
> 
> On 12/8/20 11:33 AM, Greg Kurz wrote:
> > Hi Daniel,
> > 
> > On Tue,  8 Dec 2020 10:45:36 -0300
> > Daniel Henrique Barboza <danielhb...@gmail.com> wrote:
> > 
> > > spapr_kvm_type() is considering 'vm_type=NULL' as a valid input, where
> > > the function returns 0. This is relying on the current QEMU machine
> > > options handling logic, where the absence of the 'kvm-type' option
> > > will be reflected as 'vm_type=NULL' in this function.
> > > 
> > > This is not robust, and will break if QEMU options code decides to 
> > > propagate
> > > something else in the case mentioned above (e.g. an empty string instead
> > > of NULL).
> > > 
> > > Let's avoid this entirely by setting a non-NULL default value in case of
> > > no user input for 'kvm-type'. spapr_kvm_type() was changed to handle 3 
> > > fixed
> > > values of kvm-type: "HV", "PR" and, if no kvm-type was set by the user,
> > > DEFAULT_KVM_TYPE. This allows us always be predictable regardless of any
> > > enhancements/changes made in QEMU options mechanics.
> > > 
> > > While we're at it, let's also document in 'kvm-type' description what
> > > happens if the user does not set this option. This information is based
> > > on how the pseries kernel handles the KVM_CREATE_VM ioctl(), where the
> > > default value '0' makes the kernel choose an available KVM module to
> > > use, giving precedence to kvm_hv. This logic is described in the kernel
> > > source file arch/powerpc/kvm/powerpc.c, function kvm_arch_init_vm().
> > > 
> > > Signed-off-by: Daniel Henrique Barboza <danielhb...@gmail.com>
> > > ---
> > > 
> > > The case I mentioned in the second paragraph is happening when we try to
> > > execute a pseries guest with '--enable-kvm' using Paolo's patch
> > > "vl: make qemu_get_machine_opts static" [1]:
> > > 
> > > $ sudo ./ppc64-softmmu/qemu-system-ppc64 -nographic -nodefaults -machine 
> > > pseries --enable-kvm
> > > qemu-system-ppc64: Unknown kvm-type specified ''
> > > 
> > > This happens due to the differences between how qemu_opt_get() and
> > > object_property_get_str() works when there is no 'kvm-type' specified.
> > > See [2] for more info about the issue found.
> > > 
> > > 
> > > [1] https://lists.gnu.org/archive/html/qemu-devel/2020-12/msg00471.html
> > > [2] https://lists.gnu.org/archive/html/qemu-devel/2020-12/msg01578.html
> > > 
> > > 
> > >   hw/ppc/spapr.c | 19 +++++++++++++++++--
> > >   1 file changed, 17 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > > index b7e0894019..32d938dc6a 100644
> > > --- a/hw/ppc/spapr.c
> > > +++ b/hw/ppc/spapr.c
> > > @@ -3021,9 +3021,10 @@ static void spapr_machine_init(MachineState 
> > > *machine)
> > >       qemu_cond_init(&spapr->fwnmi_machine_check_interlock_cond);
> > >   }
> > > +#define DEFAULT_KVM_TYPE "auto"
> > >   static int spapr_kvm_type(MachineState *machine, const char *vm_type)
> > >   {
> > > -    if (!vm_type) {
> > > +    if (!strcmp(vm_type, DEFAULT_KVM_TYPE)) {
> > >           return 0;
> > >       }
> > > @@ -3131,6 +3132,16 @@ static char *spapr_get_kvm_type(Object *obj, Error 
> > > **errp)
> > >   {
> > >       SpaprMachineState *spapr = SPAPR_MACHINE(obj);
> > > +    /*
> > > +     * In case the user didn't set 'kvm-type', return DEFAULT_KVM_TYPE
> > > +     * instead of NULL. This allows us to be more predictable with what
> > > +     * is expected to happen in spapr_kvm_type(), since we can stop 
> > > relying
> > > +     * on receiving a 'NULL' parameter as a valid input there.
> > > +     */
> > 
> > Returning what is obviously a default value is straightforward enough
> > that is doesn't need to a comment IMHO.
> > 
> > > +    if (!spapr->kvm_type) {
> > > +        return g_strdup(DEFAULT_KVM_TYPE);
> > > +    }
> > > +
> > >       return g_strdup(spapr->kvm_type);
> > 
> > Alternatively you could simply do:
> > 
> >      return g_strdup(spapr->kvm_type ? spapr->kvm_type : DEFAULT_KVM_TYPE);
> 
> Got it. I'll update it in v2.
> 
> > 
> > >   }
> > > @@ -3273,7 +3284,11 @@ static void spapr_instance_init(Object *obj)
> > >       object_property_add_str(obj, "kvm-type",
> > >                               spapr_get_kvm_type, spapr_set_kvm_type);
> > >       object_property_set_description(obj, "kvm-type",
> > > -                                    "Specifies the KVM virtualization 
> > > mode (HV, PR)");
> > > +                                    "Specifies the KVM virtualization 
> > > mode (HV, PR)."
> > 
> > Why not documenting "auto" as a valid option as well ?
> 
> 
> This was my first idea but I got cold feet about it. I got afraid that
> exposing the default 'auto' option might misled users into believing that
> we're adding a new configuration option, even thought it's just the
> same behavior users are dealing with for 7+ years. I chose to use the
> 'auto' value as an internal default that isn't documented . Granted, this
> also means that we have now a hidden 'kvm-type=auto' setting, so yeah.
> 
> If there is a consensus that exposing the "auto" default is the right
> thing to do in this case I'll just go ahead and expose it.

I think it should be fine to expose it.

> > While here you could maybe convert HV and PR to lowercase in order to
> > have a prettier "hv, pr, auto" set of valid values in the help string.
> > You'd need to convert the related checks in spapr_kvm_type() to still
> > check for the uppercase versions for compatibility, eg. by using
> > g_ascii_strcasecmp().
> 
> Roger that.
> 
> > 
> > > +                                    " If not specified, defaults to any 
> > > available KVM"
> > > +                                    " module loaded in the host. In case 
> > > both kvm_hv"
> > > +                                    " and kvm_pr are loaded, kvm_hv 
> > > takes precedence.");
> > > +
> > 
> > s/If not specified/If 'auto'/ and mention 'auto' as being the default value.
> 
> 
> As I said above, I'll happily mention the 'auto' default if we can agree
> that this will not lead to user confusion thinking this is a new option and
> so on.
> 
> 
> Thanks,
> 
> 
> DHB
> 
> > 
> > >       object_property_add_bool(obj, "modern-hotplug-events",
> > >                               spapr_get_modern_hotplug_events,
> > >                               spapr_set_modern_hotplug_events);
> > 
> 

-- 
David Gibson                    | I'll have my music baroque, and my code
david AT gibson.dropbear.id.au  | minimalist, thank you.  NOT _the_ _other_
                                | _way_ _around_!
http://www.ozlabs.org/~dgibson

Attachment: signature.asc
Description: PGP signature

Reply via email to