All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sam Bobroff <sam.bobroff@au1.ibm.com>
To: David Gibson <david@gibson.dropbear.id.au>
Cc: lvivier@redhat.com, thuth@redhat.com, qemu-devel@nongnu.org,
	ehabkost@redhat.com, aik@ozlabs.ru, mdroth@linux.vnet.ibm.com,
	agraf@suse.de, qemu-ppc@nongnu.org
Subject: Re: [Qemu-devel] [Qemu-ppc] [PATCHv2 07/10] pseries: DEFINE_SPAPR_MACHINE
Date: Tue, 8 Dec 2015 13:38:42 +1100	[thread overview]
Message-ID: <20151208023842.GA8706@tungsten.ozlabs.ibm.com> (raw)
In-Reply-To: <1449459280-14983-8-git-send-email-david@gibson.dropbear.id.au>

On Mon, Dec 07, 2015 at 02:34:37PM +1100, David Gibson wrote:
> At the moment all the class_init functions and TypeInfo structures for the
> various versioned pseries machine types are open-coded.  As more versions
> are created this is getting increasingly clumsy.
> 
> This patch borrows the approach used in PC, using a DEFINE_SPAPR_MACHINE()
> macro to construct most of the boilerplate from simpler 'class_options' and
> 'instance_options' functions.
> 
> This patch makes a small semantic change - the versioned machine types are
> now registered through machine_init() instead of type_init().  Since the
> new way is how PC already did it, I'm assuming that's correct.
> 
> Signed-off-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>  hw/ppc/spapr.c | 119 ++++++++++++++++++++++++---------------------------------
>  1 file changed, 49 insertions(+), 70 deletions(-)
> 
> diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
> index 3078e60..4f645f3 100644
> --- a/hw/ppc/spapr.c
> +++ b/hw/ppc/spapr.c
> @@ -2302,24 +2302,47 @@ static const TypeInfo spapr_machine_info = {
>      },
>  };
>  
> +#define DEFINE_SPAPR_MACHINE(suffix, verstr)                         \
> +    static void spapr_machine_##suffix##_class_init(ObjectClass *oc, \
> +                                                    void *data)      \
> +    {                                                                \
> +        MachineClass *mc = MACHINE_CLASS(oc);                        \
> +        spapr_machine_##suffix##_class_options(mc);                  \
> +    }                                                                \
> +    static void spapr_machine_##suffix##_instance_init(Object *obj)  \
> +    {                                                                \
> +        MachineState *machine = MACHINE(obj);                        \
> +        spapr_machine_##suffix##_instance_options(machine);          \
> +    }                                                                \
> +    static const TypeInfo spapr_machine_##suffix##_info = {          \
> +        .name = MACHINE_TYPE_NAME("pseries-" verstr),                \
> +        .parent = TYPE_SPAPR_MACHINE,                                \
> +        .class_init = spapr_machine_##suffix##_class_init,           \
> +        .instance_init = spapr_machine_##suffix##_instance_init,     \
> +    };                                                               \
> +    static void spapr_machine_register_##suffix(void)                \
> +    {                                                                \
> +        type_register(&spapr_machine_##suffix##_info);               \
> +    }                                                                \
> +    machine_init(spapr_machine_register_##suffix)
> +
>  /*
>   * pseries-2.5
>   */
> -static void spapr_machine_2_5_class_init(ObjectClass *oc, void *data)
> +static void spapr_machine_2_5_instance_options(MachineState *machine)
>  {
> -    MachineClass *mc = MACHINE_CLASS(oc);
> -    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(oc);
> +}
> +
> +static void spapr_machine_2_5_class_options(MachineClass *mc)
> +{
> +    sPAPRMachineClass *smc = SPAPR_MACHINE_CLASS(mc);
>  
>      mc->alias = "pseries";
>      mc->is_default = 1;
>      smc->dr_lmb_enabled = true;
>  }
>  
> -static const TypeInfo spapr_machine_2_5_info = {
> -    .name          = MACHINE_TYPE_NAME("pseries-2.5"),
> -    .parent        = TYPE_SPAPR_MACHINE,
> -    .class_init    = spapr_machine_2_5_class_init,
> -};
> +DEFINE_SPAPR_MACHINE(2_5, "2.5");
>  
>  /*
>   * pseries-2.4
> @@ -2327,18 +2350,17 @@ static const TypeInfo spapr_machine_2_5_info = {
>  #define SPAPR_COMPAT_2_4 \
>          HW_COMPAT_2_4
>  
> -static void spapr_machine_2_4_class_init(ObjectClass *oc, void *data)
> +static void spapr_machine_2_4_instance_options(MachineState *machine)
>  {
> -    MachineClass *mc = MACHINE_CLASS(oc);
> +    spapr_machine_2_5_instance_options(machine);
> +}
>  
> +static void spapr_machine_2_4_class_options(MachineClass *mc)
> +{
>      SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_4);
>  }
>  
> -static const TypeInfo spapr_machine_2_4_info = {
> -    .name          = MACHINE_TYPE_NAME("pseries-2.4"),
> -    .parent        = TYPE_SPAPR_MACHINE,
> -    .class_init    = spapr_machine_2_4_class_init,
> -};
> +DEFINE_SPAPR_MACHINE(2_4, "2.4");
>  
>  /*
>   * pseries-2.3
> @@ -2352,30 +2374,18 @@ static const TypeInfo spapr_machine_2_4_info = {
>              .value    = "off",\
>          },
>  
> -static void spapr_compat_2_3(Object *obj)
> +static void spapr_machine_2_3_instance_options(MachineState *machine)
>  {
> +    spapr_machine_2_4_instance_options(machine);
>      savevm_skip_section_footers();
>      global_state_set_optional();
>  }
>  
> -static void spapr_machine_2_3_instance_init(Object *obj)
> -{
> -    spapr_compat_2_3(obj);
> -}
> -
> -static void spapr_machine_2_3_class_init(ObjectClass *oc, void *data)
> +static void spapr_machine_2_3_class_options(MachineClass *mc)
>  {
> -    MachineClass *mc = MACHINE_CLASS(oc);
> -
>      SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_3);
>  }
> -
> -static const TypeInfo spapr_machine_2_3_info = {
> -    .name          = MACHINE_TYPE_NAME("pseries-2.3"),
> -    .parent        = TYPE_SPAPR_MACHINE,
> -    .class_init    = spapr_machine_2_3_class_init,
> -    .instance_init = spapr_machine_2_3_instance_init,
> -};
> +DEFINE_SPAPR_MACHINE(2_3, "2.3");
>  
>  /*
>   * pseries-2.2
> @@ -2390,29 +2400,16 @@ static const TypeInfo spapr_machine_2_3_info = {
>              .value    = "0x20000000",\
>          },
>  
> -static void spapr_compat_2_2(Object *obj)
> -{
> -    spapr_compat_2_3(obj);
> -}
> -
> -static void spapr_machine_2_2_instance_init(Object *obj)
> +static void spapr_machine_2_2_instance_options(MachineState *machine)
>  {
> -    spapr_compat_2_2(obj);
> +    spapr_machine_2_3_instance_options(machine);
>  }
>  
> -static void spapr_machine_2_2_class_init(ObjectClass *oc, void *data)
> +static void spapr_machine_2_2_class_options(MachineClass *mc)
>  {
> -    MachineClass *mc = MACHINE_CLASS(oc);
> -
>      SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_2);
>  }
> -
> -static const TypeInfo spapr_machine_2_2_info = {
> -    .name          = MACHINE_TYPE_NAME("pseries-2.2"),
> -    .parent        = TYPE_SPAPR_MACHINE,
> -    .class_init    = spapr_machine_2_2_class_init,
> -    .instance_init = spapr_machine_2_2_instance_init,
> -};
> +DEFINE_SPAPR_MACHINE(2_2, "2.2");
>  
>  /*
>   * pseries-2.1
> @@ -2421,38 +2418,20 @@ static const TypeInfo spapr_machine_2_2_info = {
>          SPAPR_COMPAT_2_2 \
>          HW_COMPAT_2_1
>  
> -static void spapr_compat_2_1(Object *obj)
> -{
> -    spapr_compat_2_2(obj);
> -}
> -
> -static void spapr_machine_2_1_instance_init(Object *obj)
> +static void spapr_machine_2_1_instance_options(MachineState *machine)
>  {
> -    spapr_compat_2_1(obj);
> +    spapr_machine_2_2_instance_options(machine);
>  }
>  
> -static void spapr_machine_2_1_class_init(ObjectClass *oc, void *data)
> +static void spapr_machine_2_1_class_options(MachineClass *mc)
>  {
> -    MachineClass *mc = MACHINE_CLASS(oc);
> -
>      SET_MACHINE_COMPAT(mc, SPAPR_COMPAT_2_1);
>  }
> -
> -static const TypeInfo spapr_machine_2_1_info = {
> -    .name          = MACHINE_TYPE_NAME("pseries-2.1"),
> -    .parent        = TYPE_SPAPR_MACHINE,
> -    .class_init    = spapr_machine_2_1_class_init,
> -    .instance_init = spapr_machine_2_1_instance_init,
> -};
> +DEFINE_SPAPR_MACHINE(2_1, "2.1");
>  
>  static void spapr_machine_register_types(void)
>  {
>      type_register_static(&spapr_machine_info);
> -    type_register_static(&spapr_machine_2_1_info);
> -    type_register_static(&spapr_machine_2_2_info);
> -    type_register_static(&spapr_machine_2_3_info);
> -    type_register_static(&spapr_machine_2_4_info);
> -    type_register_static(&spapr_machine_2_5_info);
>  }
>  
>  type_init(spapr_machine_register_types)
> -- 
> 2.5.0

Looks good to me. Just one nit: I couldn't help noticing that the suffix and
verstr parameters to the macro were both encoding the same information.

Did you consider a macro with the major and minor version as the parameters?

e.g.
#define DEFINE_SPAPR_MACHINE(major, minor)

So usage would be:
DEFINE_SPAPR_MACHINE(2, 1);

Reviewed-by: Sam Bobroff <sam.bobroff@au1.ibm.com>

  reply	other threads:[~2015-12-08  2:40 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2015-12-07  3:34 [Qemu-devel] [PATCHv2 00/10] Clean up pseries machine versioning David Gibson
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 01/10] pseries: Remove redundant setting of mc->name for pseries-2.5 machine David Gibson
2015-12-09  3:31   ` Alexey Kardashevskiy
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 02/10] pseries: Rearrange versioned machine type code David Gibson
2015-12-07 10:21   ` Thomas Huth
2015-12-09  2:53     ` David Gibson
2015-12-09  3:43   ` Alexey Kardashevskiy
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 03/10] pseries: Remove redundant calls to spapr_machine_initfn() David Gibson
2015-12-07 10:25   ` Thomas Huth
2015-12-09  3:32   ` Alexey Kardashevskiy
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 04/10] pseries: Remove versions from mc->desc David Gibson
2015-12-07 10:07   ` Thomas Huth
2015-12-09  3:32   ` Alexey Kardashevskiy
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 05/10] Move SET_MACHINE_COMPAT macro to boards.h David Gibson
2015-12-09  3:32   ` Alexey Kardashevskiy
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 06/10] pseries: Use SET_MACHINE_COMPAT David Gibson
2015-12-07 10:27   ` Thomas Huth
2015-12-09  3:32   ` Alexey Kardashevskiy
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 07/10] pseries: DEFINE_SPAPR_MACHINE David Gibson
2015-12-08  2:38   ` Sam Bobroff [this message]
2015-12-09  3:30     ` [Qemu-devel] [Qemu-ppc] " Alexey Kardashevskiy
2015-12-09  3:38       ` Alexey Kardashevskiy
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 08/10] pseries: Restructure class_options functions David Gibson
2015-12-09  3:36   ` Alexey Kardashevskiy
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 09/10] pseries: Improve setting of default machine version David Gibson
2015-12-09  3:37   ` Alexey Kardashevskiy
2015-12-07  3:34 ` [Qemu-devel] [PATCHv2 10/10] pseries: Add pseries-2.6 machine type David Gibson
2015-12-09  3:37   ` Alexey Kardashevskiy
2015-12-09  4:37 ` [Qemu-devel] [PATCHv2 00/10] Clean up pseries machine versioning David Gibson

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20151208023842.GA8706@tungsten.ozlabs.ibm.com \
    --to=sam.bobroff@au1.ibm.com \
    --cc=agraf@suse.de \
    --cc=aik@ozlabs.ru \
    --cc=david@gibson.dropbear.id.au \
    --cc=ehabkost@redhat.com \
    --cc=lvivier@redhat.com \
    --cc=mdroth@linux.vnet.ibm.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-ppc@nongnu.org \
    --cc=thuth@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.