qemu-arm
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-arm] [Qemu-devel] [PATCH for-3.2 v5 08/19] hw: apply machine c


From: Marc-André Lureau
Subject: Re: [Qemu-arm] [Qemu-devel] [PATCH for-3.2 v5 08/19] hw: apply machine compat properties without touching globals
Date: Tue, 11 Dec 2018 18:30:32 +0400

Hi

On Tue, Dec 11, 2018 at 6:24 PM Eduardo Habkost <address@hidden> wrote:
>
> I have specific questions about the approach we are using to
> eliminate the macros.
>
> My main goal when asking this to be moved to a separate patch is
> to not make this discussion block the register_global_properties() &
> device_post_init() changes (which look good to me).
>
>
> On Tue, Dec 04, 2018 at 06:20:12PM +0400, Marc-André Lureau wrote:
> [...]
> > -#define VIRT_COMPAT_3_0 \
> > +static GlobalProperty virt_compat_3_0[] = {
> >      HW_COMPAT_3_0
> > +};
>
> What about moving the array inside virt_machine_3_0_options()?

Sure

>
> >
> >  static void virt_3_0_instance_init(Object *obj)
> >  {
> > @@ -1883,12 +1884,14 @@ static void virt_3_0_instance_init(Object *obj)
> >  static void virt_machine_3_0_options(MachineClass *mc)
> >  {
> >      virt_machine_3_1_options(mc);
> > -    SET_MACHINE_COMPAT(mc, VIRT_COMPAT_3_0);
> > +    compat_props_add(mc->compat_props,
> > +                     virt_compat_3_0, G_N_ELEMENTS(virt_compat_3_0));
> >  }
> >  DEFINE_VIRT_MACHINE(3, 0)
>
> This is nice, because it's basically the same amount of
> boilerplate code, but I would find a NULL-terminated array much
> easier to use than having to use G_N_ELEMENTS().

But easier to get wrong too. I prefer the explicit N arguments. (it
also gives some flexibility, since you can point to inner pointer +
size, although we don't care at this point)

>
> This would be nice in cases like virt, because we wouldn't even
> need to declare a separate array.  We could do something like:
>
>     compat_props_add(mc->compat_props, hw_compat_3_0);
>
> and that's all.  No need for HW_COMPAT_* macros, no need for
> extra arrays to be declared.
>
>
> [...]
> > diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> > index 7092d6d13f..575566e466 100644
> > --- a/hw/i386/pc_piix.c
> > +++ b/hw/i386/pc_piix.c
> > @@ -438,74 +438,112 @@ static void 
> > pc_i440fx_3_1_machine_options(MachineClass *m)
> >  DEFINE_I440FX_MACHINE(v3_1, "pc-i440fx-3.1", NULL,
> >                        pc_i440fx_3_1_machine_options);
> >
> > +static GlobalProperty pc_compat_3_0[] = {
> > +    PC_COMPAT_3_0
> > +};
> > +
> >  static void pc_i440fx_3_0_machine_options(MachineClass *m)
> >  {
> >      pc_i440fx_3_1_machine_options(m);
> >      m->is_default = 0;
> >      m->alias = NULL;
> > -    SET_MACHINE_COMPAT(m, PC_COMPAT_3_0);
> > +
> > +    compat_props_add(m->compat_props,
> > +                     pc_compat_3_0, G_N_ELEMENTS(pc_compat_3_0));
> >  }
> >
> >  DEFINE_I440FX_MACHINE(v3_0, "pc-i440fx-3.0", NULL,
> >                        pc_i440fx_3_0_machine_options);
>
> Now, this is requiring _more_ boilerplate code than before.  I'd
> like us to find a way to eliminate the macro without increasing
> the amount of boilerplate code.

I am open to ideas

>
>
> [...]
> > diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> > index 7afd1a175b..d801ba71eb 100644
> > --- a/hw/ppc/spapr.c
> > +++ b/hw/ppc/spapr.c
> > @@ -3973,8 +3973,9 @@ DEFINE_SPAPR_MACHINE(3_1, "3.1", true);
> >  /*
> >   * pseries-3.0
> >   */
> > -#define SPAPR_COMPAT_3_0                                              \
> > +static GlobalProperty spapr_compat_3_0[] = {
> >      HW_COMPAT_3_0
> > +};
> >
> >  static void spapr_machine_3_0_instance_options(MachineState *machine)
> >  {
> > @@ -3986,7 +3987,8 @@ static void 
> > spapr_machine_3_0_class_options(MachineClass *mc)
> >      sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
> >
> >      spapr_machine_3_1_class_options(mc);
> > -    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_3_0);
> > +    compat_props_add(mc->compat_props,
> > +                     spapr_compat_3_0, G_N_ELEMENTS(spapr_compat_3_0));
> >
> >      smc->legacy_irq_allocation = true;
> >      smc->irq = &spapr_irq_xics_legacy;
> > @@ -3997,18 +3999,19 @@ DEFINE_SPAPR_MACHINE(3_0, "3.0", false);
> >  /*
> >   * pseries-2.12
> >   */
> > -#define SPAPR_COMPAT_2_12                                              \
> > -    HW_COMPAT_2_12                                                     \
> > -    {                                                                  \
> > -        .driver = TYPE_POWERPC_CPU,                                    \
> > -        .property = "pre-3.0-migration",                               \
> > -        .value    = "on",                                              \
> > -    },                                                                 \
> > -    {                                                                  \
> > -        .driver = TYPE_SPAPR_CPU_CORE,                                 \
> > -        .property = "pre-3.0-migration",                               \
> > -        .value    = "on",                                              \
> > +static GlobalProperty spapr_compat_2_12[] = {
> > +    HW_COMPAT_2_12
> > +    {
> > +        .driver = TYPE_POWERPC_CPU,
> > +        .property = "pre-3.0-migration",
> > +        .value    = "on",
> > +    },
> > +    {
> > +        .driver = TYPE_SPAPR_CPU_CORE,
> > +        .property = "pre-3.0-migration",
> > +        .value    = "on",
> >      },
> > +};
> >
> >  static void spapr_machine_2_12_instance_options(MachineState *machine)
> >  {
> > @@ -4020,7 +4023,8 @@ static void 
> > spapr_machine_2_12_class_options(MachineClass *mc)
> >      sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
> >
> >      spapr_machine_3_0_class_options(mc);
> > -    SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_12);
> > +    compat_props_add(mc->compat_props,
> > +                     spapr_compat_2_12, G_N_ELEMENTS(spapr_compat_2_12));
>
> It would be nice to be able to write this as:
>
>     static GlobalProperty spapr_compat_2_12[] = {
>         {
>             .driver = TYPE_POWERPC_CPU,
>             .property = "pre-3.0-migration",
>             .value    = "on",
>         },
>         {
>             .driver = TYPE_SPAPR_CPU_CORE,
>             .property = "pre-3.0-migration",
>             .value    = "on",
>         },
>         { /* end of list */ },
>     };
>
>     compat_props_add(mc->compat_props, hw_compat_3_0);
>     compat_props_add(mc->compat_props, spapr_compat_2_12);
>
> This way we won't need the HW_COMPAT_* macros anymore.

That could be done on top, I imagine. I can give it a try.

>
> Other than that, it's also basically the same amount of
> boilerplate as before, so that's good.
>
>
> >
> >      /* We depend on kvm_enabled() to choose a default value for the
> >       * hpt-max-page-size capability. Of course we can't do it here
> [...]
> > diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
> > index a0615a8b35..275cbe5da4 100644
> > --- a/hw/s390x/s390-virtio-ccw.c
> > +++ b/hw/s390x/s390-virtio-ccw.c
> > @@ -651,96 +651,106 @@ bool css_migration_enabled(void)
> >      }                                                                      
> >    \
> >      type_init(ccw_machine_register_##suffix)
> >
> > -#define CCW_COMPAT_3_0 \
> > -        HW_COMPAT_3_0
> > -
> > -#define CCW_COMPAT_2_12 \
> > -        HW_COMPAT_2_12
> > -
> > -#define CCW_COMPAT_2_11 \
> > -        HW_COMPAT_2_11 \
> > -        {\
> > -            .driver   = TYPE_SCLP_EVENT_FACILITY,\
> > -            .property = "allow_all_mask_sizes",\
> > -            .value    = "off",\
> > -        },
> [...]
> > +static GlobalProperty ccw_compat_3_0[] = {
> > +    HW_COMPAT_3_0
> > +};
> > +
> > +static GlobalProperty ccw_compat_2_12[] = {
> > +    HW_COMPAT_2_12
> > +};
> > +
> > +static GlobalProperty ccw_compat_2_11[] = {
> > +    HW_COMPAT_2_11
> > +    {
> > +        .driver   = TYPE_SCLP_EVENT_FACILITY,
> > +        .property = "allow_all_mask_sizes",
> > +        .value    = "off",
> > +    },
> > +};
> [...]
> >
> >  static void ccw_machine_3_1_instance_options(MachineState *machine)
> >  {
> > @@ -762,7 +772,8 @@ static void ccw_machine_3_0_class_options(MachineClass 
> > *mc)
> >
> >      s390mc->hpage_1m_allowed = false;
> >      ccw_machine_3_1_class_options(mc);
> > -    SET_MACHINE_COMPAT(mc, CCW_COMPAT_3_0);
> > +    compat_props_add(mc->compat_props,
> > +                     ccw_compat_3_0, G_N_ELEMENTS(ccw_compat_3_0));
>
> Same comments from spapr apply here: getting rid of the
> HW_COMPAT_* macros would be nice, but this version is good enough
> because it has the same amount of boilerplate code.
>
>

thanks

> >  }
> >  DEFINE_CCW_MACHINE(3_0, "3.0", false);
> [...]
>
> --
> Eduardo
>


-- 
Marc-André Lureau



reply via email to

[Prev in Thread] Current Thread [Next in Thread]