diff mbox

[PULL,v2,2/9] well-defined listing order for machine types

Message ID 1413965859-7698-3-git-send-email-mst@redhat.com
State New
Headers show

Commit Message

Michael S. Tsirkin Oct. 22, 2014, 8:18 a.m. UTC
From: Laszlo Ersek <lersek@redhat.com>

Commit 261747f1 ("vl: Use MachineClass instead of global QEMUMachine
list") broke the ordering of the machine types in the user-visible output
of

  qemu-system-XXXX -M \?

This occurred because registration was rebased from a manually maintained
linked list to GLib hash tables:

  qemu_register_machine()
    type_register()
      type_register_internal()
        type_table_add()
          g_hash_table_insert()

and because the listing was rebased accordingly, from the traversal of the
list to the traversal of the hash table (rendered as an ad-hoc list):

  machine_parse()
    object_class_get_list(TYPE_MACHINE)
      object_class_foreach()
        g_hash_table_foreach()

The current order is a "random" one, for practical purposes, which is
annoying for users.

Introduce new members QEMUMachine.family and MachineClass.family, allowing
machine types to be "clustered". Introduce a comparator function that
establishes a total ordering between machine types, ordering machine types
in the same family next to each other. In machine_parse(), list the
supported machine types sorted with the comparator function.

The comparator function:
- sorts whole families before standalone machine types,
- sorts whole families between each other in alphabetically increasing
  order,
- sorts machine types inside the same family in alphabetically decreasing
  order,
- sorts standalone machine types between each other in alphabetically
  increasing order.

After this patch, all machine types are considered standalone, and
accordingly, the output is alphabetically ascending. This will be refined
in the following patches.

Effects on the x86_64 output:

Before:

> Supported machines are:
> pc-0.13              Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-2.0        Standard PC (i440FX + PIIX, 1996)
> pc-1.0               Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-2.1        Standard PC (i440FX + PIIX, 1996)
> pc-q35-1.7           Standard PC (Q35 + ICH9, 2009)
> pc-1.1               Standard PC (i440FX + PIIX, 1996)
> pc-0.14              Standard PC (i440FX + PIIX, 1996)
> pc-q35-2.0           Standard PC (Q35 + ICH9, 2009)
> pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-1.5        Standard PC (i440FX + PIIX, 1996)
> pc-0.15              Standard PC (i440FX + PIIX, 1996)
> pc-q35-1.4           Standard PC (Q35 + ICH9, 2009)
> isapc                ISA-only PC
> pc                   Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.2)
> pc-i440fx-2.2        Standard PC (i440FX + PIIX, 1996) (default)
> pc-1.2               Standard PC (i440FX + PIIX, 1996)
> pc-0.10              Standard PC (i440FX + PIIX, 1996)
> pc-0.11              Standard PC (i440FX + PIIX, 1996)
> pc-q35-2.1           Standard PC (Q35 + ICH9, 2009)
> q35                  Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.2)
> pc-q35-2.2           Standard PC (Q35 + ICH9, 2009)
> pc-i440fx-1.6        Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-1.7        Standard PC (i440FX + PIIX, 1996)
> none                 empty machine
> pc-q35-1.5           Standard PC (Q35 + ICH9, 2009)
> pc-q35-1.6           Standard PC (Q35 + ICH9, 2009)
> pc-0.12              Standard PC (i440FX + PIIX, 1996)
> pc-1.3               Standard PC (i440FX + PIIX, 1996)

After:

> Supported machines are:
> isapc                ISA-only PC
> none                 empty machine
> pc-0.10              Standard PC (i440FX + PIIX, 1996)
> pc-0.11              Standard PC (i440FX + PIIX, 1996)
> pc-0.12              Standard PC (i440FX + PIIX, 1996)
> pc-0.13              Standard PC (i440FX + PIIX, 1996)
> pc-0.14              Standard PC (i440FX + PIIX, 1996)
> pc-0.15              Standard PC (i440FX + PIIX, 1996)
> pc-1.0               Standard PC (i440FX + PIIX, 1996)
> pc-1.1               Standard PC (i440FX + PIIX, 1996)
> pc-1.2               Standard PC (i440FX + PIIX, 1996)
> pc-1.3               Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-1.5        Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-1.6        Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-1.7        Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-2.0        Standard PC (i440FX + PIIX, 1996)
> pc-i440fx-2.1        Standard PC (i440FX + PIIX, 1996)
> pc                   Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.2)
> pc-i440fx-2.2        Standard PC (i440FX + PIIX, 1996) (default)
> pc-q35-1.4           Standard PC (Q35 + ICH9, 2009)
> pc-q35-1.5           Standard PC (Q35 + ICH9, 2009)
> pc-q35-1.6           Standard PC (Q35 + ICH9, 2009)
> pc-q35-1.7           Standard PC (Q35 + ICH9, 2009)
> pc-q35-2.0           Standard PC (Q35 + ICH9, 2009)
> pc-q35-2.1           Standard PC (Q35 + ICH9, 2009)
> q35                  Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.2)
> pc-q35-2.2           Standard PC (Q35 + ICH9, 2009)

Effects on the aarch64 output:

Before:

> Supported machines are:
> lm3s811evb           Stellaris LM3S811EVB
> canon-a1100          Canon PowerShot A1100 IS
> vexpress-a15         ARM Versatile Express for Cortex-A15
> vexpress-a9          ARM Versatile Express for Cortex-A9
> xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
> connex               Gumstix Connex (PXA255)
> n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
> lm3s6965evb          Stellaris LM3S6965EVB
> versatileab          ARM Versatile/AB (ARM926EJ-S)
> borzoi               Borzoi PDA (PXA270)
> tosa                 Tosa PDA (PXA255)
> cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
> midway               Calxeda Midway (ECX-2000)
> mainstone            Mainstone II (PXA27x)
> n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
> terrier              Terrier PDA (PXA270)
> highbank             Calxeda Highbank (ECX-1000)
> cubieboard           cubietech cubieboard
> sx1-v1               Siemens SX1 (OMAP310) V1
> sx1                  Siemens SX1 (OMAP310) V2
> realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
> kzm                  ARM KZM Emulation Baseboard (ARM1136)
> akita                Akita PDA (PXA270)
> z2                   Zipit Z2 (PXA27x)
> musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
> realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
> versatilepb          ARM Versatile/PB (ARM926EJ-S)
> realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
> realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
> spitz                Spitz PDA (PXA270)
> none                 empty machine
> virt                 ARM Virtual Machine
> collie               Collie PDA (SA-1110)
> smdkc210             Samsung SMDKC210 board (Exynos4210)
> verdex               Gumstix Verdex (PXA270)
> nuri                 Samsung NURI board (Exynos4210)
> integratorcp         ARM Integrator/CP (ARM926EJ-S)

After:

> Supported machines are:
> akita                Akita PDA (PXA270)
> borzoi               Borzoi PDA (PXA270)
> canon-a1100          Canon PowerShot A1100 IS
> cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
> collie               Collie PDA (SA-1110)
> connex               Gumstix Connex (PXA255)
> cubieboard           cubietech cubieboard
> highbank             Calxeda Highbank (ECX-1000)
> integratorcp         ARM Integrator/CP (ARM926EJ-S)
> kzm                  ARM KZM Emulation Baseboard (ARM1136)
> lm3s6965evb          Stellaris LM3S6965EVB
> lm3s811evb           Stellaris LM3S811EVB
> mainstone            Mainstone II (PXA27x)
> midway               Calxeda Midway (ECX-2000)
> musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
> n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
> n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
> none                 empty machine
> nuri                 Samsung NURI board (Exynos4210)
> realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
> realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
> realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
> realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
> smdkc210             Samsung SMDKC210 board (Exynos4210)
> spitz                Spitz PDA (PXA270)
> sx1                  Siemens SX1 (OMAP310) V2
> sx1-v1               Siemens SX1 (OMAP310) V1
> terrier              Terrier PDA (PXA270)
> tosa                 Tosa PDA (PXA255)
> verdex               Gumstix Verdex (PXA270)
> versatileab          ARM Versatile/AB (ARM926EJ-S)
> versatilepb          ARM Versatile/PB (ARM926EJ-S)
> vexpress-a15         ARM Versatile Express for Cortex-A15
> vexpress-a9          ARM Versatile Express for Cortex-A9
> virt                 ARM Virtual Machine
> xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
> z2                   Zipit Z2 (PXA27x)

RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1145042
Signed-off-by: Laszlo Ersek <lersek@redhat.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
Reviewed-by: Marcel Apfelbaum <marcel.a@redhat.com>
Acked-by: David Gibson <david@gibson.dropbear.id.au>
---
 include/hw/boards.h |  2 ++
 hw/i386/pc.c        |  1 +
 vl.c                | 38 +++++++++++++++++++++++++++++++++++++-
 3 files changed, 40 insertions(+), 1 deletion(-)

Comments

Laszlo Ersek Nov. 3, 2014, 1:04 p.m. UTC | #1
On 10/22/14 10:18, Michael S. Tsirkin wrote:
> From: Laszlo Ersek <lersek@redhat.com>
> 
> Commit 261747f1 ("vl: Use MachineClass instead of global QEMUMachine
> list") broke the ordering of the machine types in the user-visible output
> of
> 
>   qemu-system-XXXX -M \?
> 
> This occurred because registration was rebased from a manually maintained
> linked list to GLib hash tables:
> 
>   qemu_register_machine()
>     type_register()
>       type_register_internal()
>         type_table_add()
>           g_hash_table_insert()
> 
> and because the listing was rebased accordingly, from the traversal of the
> list to the traversal of the hash table (rendered as an ad-hoc list):
> 
>   machine_parse()
>     object_class_get_list(TYPE_MACHINE)
>       object_class_foreach()
>         g_hash_table_foreach()
> 
> The current order is a "random" one, for practical purposes, which is
> annoying for users.
> 
> Introduce new members QEMUMachine.family and MachineClass.family, allowing
> machine types to be "clustered". Introduce a comparator function that
> establishes a total ordering between machine types, ordering machine types
> in the same family next to each other. In machine_parse(), list the
> supported machine types sorted with the comparator function.
> 
> The comparator function:
> - sorts whole families before standalone machine types,
> - sorts whole families between each other in alphabetically increasing
>   order,
> - sorts machine types inside the same family in alphabetically decreasing
>   order,
> - sorts standalone machine types between each other in alphabetically
>   increasing order.
> 
> After this patch, all machine types are considered standalone, and
> accordingly, the output is alphabetically ascending. This will be refined
> in the following patches.
> 
> Effects on the x86_64 output:
> 
> Before:
> 
>> Supported machines are:
>> pc-0.13              Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-2.0        Standard PC (i440FX + PIIX, 1996)
>> pc-1.0               Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-2.1        Standard PC (i440FX + PIIX, 1996)
>> pc-q35-1.7           Standard PC (Q35 + ICH9, 2009)
>> pc-1.1               Standard PC (i440FX + PIIX, 1996)
>> pc-0.14              Standard PC (i440FX + PIIX, 1996)
>> pc-q35-2.0           Standard PC (Q35 + ICH9, 2009)
>> pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-1.5        Standard PC (i440FX + PIIX, 1996)
>> pc-0.15              Standard PC (i440FX + PIIX, 1996)
>> pc-q35-1.4           Standard PC (Q35 + ICH9, 2009)
>> isapc                ISA-only PC
>> pc                   Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.2)
>> pc-i440fx-2.2        Standard PC (i440FX + PIIX, 1996) (default)
>> pc-1.2               Standard PC (i440FX + PIIX, 1996)
>> pc-0.10              Standard PC (i440FX + PIIX, 1996)
>> pc-0.11              Standard PC (i440FX + PIIX, 1996)
>> pc-q35-2.1           Standard PC (Q35 + ICH9, 2009)
>> q35                  Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.2)
>> pc-q35-2.2           Standard PC (Q35 + ICH9, 2009)
>> pc-i440fx-1.6        Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-1.7        Standard PC (i440FX + PIIX, 1996)
>> none                 empty machine
>> pc-q35-1.5           Standard PC (Q35 + ICH9, 2009)
>> pc-q35-1.6           Standard PC (Q35 + ICH9, 2009)
>> pc-0.12              Standard PC (i440FX + PIIX, 1996)
>> pc-1.3               Standard PC (i440FX + PIIX, 1996)
> 
> After:
> 
>> Supported machines are:
>> isapc                ISA-only PC
>> none                 empty machine
>> pc-0.10              Standard PC (i440FX + PIIX, 1996)
>> pc-0.11              Standard PC (i440FX + PIIX, 1996)
>> pc-0.12              Standard PC (i440FX + PIIX, 1996)
>> pc-0.13              Standard PC (i440FX + PIIX, 1996)
>> pc-0.14              Standard PC (i440FX + PIIX, 1996)
>> pc-0.15              Standard PC (i440FX + PIIX, 1996)
>> pc-1.0               Standard PC (i440FX + PIIX, 1996)
>> pc-1.1               Standard PC (i440FX + PIIX, 1996)
>> pc-1.2               Standard PC (i440FX + PIIX, 1996)
>> pc-1.3               Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-1.5        Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-1.6        Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-1.7        Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-2.0        Standard PC (i440FX + PIIX, 1996)
>> pc-i440fx-2.1        Standard PC (i440FX + PIIX, 1996)
>> pc                   Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.2)
>> pc-i440fx-2.2        Standard PC (i440FX + PIIX, 1996) (default)
>> pc-q35-1.4           Standard PC (Q35 + ICH9, 2009)
>> pc-q35-1.5           Standard PC (Q35 + ICH9, 2009)
>> pc-q35-1.6           Standard PC (Q35 + ICH9, 2009)
>> pc-q35-1.7           Standard PC (Q35 + ICH9, 2009)
>> pc-q35-2.0           Standard PC (Q35 + ICH9, 2009)
>> pc-q35-2.1           Standard PC (Q35 + ICH9, 2009)
>> q35                  Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.2)
>> pc-q35-2.2           Standard PC (Q35 + ICH9, 2009)
> 
> Effects on the aarch64 output:
> 
> Before:
> 
>> Supported machines are:
>> lm3s811evb           Stellaris LM3S811EVB
>> canon-a1100          Canon PowerShot A1100 IS
>> vexpress-a15         ARM Versatile Express for Cortex-A15
>> vexpress-a9          ARM Versatile Express for Cortex-A9
>> xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
>> connex               Gumstix Connex (PXA255)
>> n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
>> lm3s6965evb          Stellaris LM3S6965EVB
>> versatileab          ARM Versatile/AB (ARM926EJ-S)
>> borzoi               Borzoi PDA (PXA270)
>> tosa                 Tosa PDA (PXA255)
>> cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
>> midway               Calxeda Midway (ECX-2000)
>> mainstone            Mainstone II (PXA27x)
>> n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
>> terrier              Terrier PDA (PXA270)
>> highbank             Calxeda Highbank (ECX-1000)
>> cubieboard           cubietech cubieboard
>> sx1-v1               Siemens SX1 (OMAP310) V1
>> sx1                  Siemens SX1 (OMAP310) V2
>> realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
>> kzm                  ARM KZM Emulation Baseboard (ARM1136)
>> akita                Akita PDA (PXA270)
>> z2                   Zipit Z2 (PXA27x)
>> musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
>> realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
>> versatilepb          ARM Versatile/PB (ARM926EJ-S)
>> realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
>> realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
>> spitz                Spitz PDA (PXA270)
>> none                 empty machine
>> virt                 ARM Virtual Machine
>> collie               Collie PDA (SA-1110)
>> smdkc210             Samsung SMDKC210 board (Exynos4210)
>> verdex               Gumstix Verdex (PXA270)
>> nuri                 Samsung NURI board (Exynos4210)
>> integratorcp         ARM Integrator/CP (ARM926EJ-S)
> 
> After:
> 
>> Supported machines are:
>> akita                Akita PDA (PXA270)
>> borzoi               Borzoi PDA (PXA270)
>> canon-a1100          Canon PowerShot A1100 IS
>> cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
>> collie               Collie PDA (SA-1110)
>> connex               Gumstix Connex (PXA255)
>> cubieboard           cubietech cubieboard
>> highbank             Calxeda Highbank (ECX-1000)
>> integratorcp         ARM Integrator/CP (ARM926EJ-S)
>> kzm                  ARM KZM Emulation Baseboard (ARM1136)
>> lm3s6965evb          Stellaris LM3S6965EVB
>> lm3s811evb           Stellaris LM3S811EVB
>> mainstone            Mainstone II (PXA27x)
>> midway               Calxeda Midway (ECX-2000)
>> musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
>> n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
>> n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
>> none                 empty machine
>> nuri                 Samsung NURI board (Exynos4210)
>> realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
>> realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
>> realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
>> realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
>> smdkc210             Samsung SMDKC210 board (Exynos4210)
>> spitz                Spitz PDA (PXA270)
>> sx1                  Siemens SX1 (OMAP310) V2
>> sx1-v1               Siemens SX1 (OMAP310) V1
>> terrier              Terrier PDA (PXA270)
>> tosa                 Tosa PDA (PXA255)
>> verdex               Gumstix Verdex (PXA270)
>> versatileab          ARM Versatile/AB (ARM926EJ-S)
>> versatilepb          ARM Versatile/PB (ARM926EJ-S)
>> vexpress-a15         ARM Versatile Express for Cortex-A15
>> vexpress-a9          ARM Versatile Express for Cortex-A9
>> virt                 ARM Virtual Machine
>> xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
>> z2                   Zipit Z2 (PXA27x)
> 
> RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1145042
> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
> Reviewed-by: Marcel Apfelbaum <marcel.a@redhat.com>
> Acked-by: David Gibson <david@gibson.dropbear.id.au>
> ---
>  include/hw/boards.h |  2 ++
>  hw/i386/pc.c        |  1 +
>  vl.c                | 38 +++++++++++++++++++++++++++++++++++++-
>  3 files changed, 40 insertions(+), 1 deletion(-)
> 
> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index e07c03f..4429a1e 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -19,6 +19,7 @@ typedef void QEMUMachineHotAddCPUFunc(const int64_t id, Error **errp);
>  typedef int QEMUMachineGetKvmtypeFunc(const char *arg);
>  
>  struct QEMUMachine {
> +    const char *family; /* NULL iff @name identifies a standalone machtype */
>      const char *name;
>      const char *alias;
>      const char *desc;
> @@ -76,6 +77,7 @@ struct MachineClass {
>      ObjectClass parent_class;
>      /*< public >*/
>  
> +    const char *family; /* NULL iff @name identifies a standalone machtype */
>      const char *name;
>      const char *alias;
>      const char *desc;
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index d045e8b..21beb72 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -1516,6 +1516,7 @@ static void pc_generic_machine_class_init(ObjectClass *oc, void *data)
>      MachineClass *mc = MACHINE_CLASS(oc);
>      QEMUMachine *qm = data;
>  
> +    mc->family = qm->family;
>      mc->name = qm->name;
>      mc->alias = qm->alias;
>      mc->desc = qm->desc;
> diff --git a/vl.c b/vl.c
> index aee73e1..a518f84 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -1460,6 +1460,7 @@ static void machine_class_init(ObjectClass *oc, void *data)
>      MachineClass *mc = MACHINE_CLASS(oc);
>      QEMUMachine *qm = data;
>  
> +    mc->family = qm->family;
>      mc->name = qm->name;
>      mc->alias = qm->alias;
>      mc->desc = qm->desc;
> @@ -2534,7 +2535,41 @@ static int debugcon_parse(const char *devname)
>      return 0;
>  }
>  
> -static MachineClass *machine_parse(const char *name)
> +static gint machine_class_cmp(gconstpointer a, gconstpointer b)
> +{
> +    const MachineClass *mc1 = a, *mc2 = b;
> +    int res;
> +
> +    if (mc1->family == NULL) {
> +        if (mc2->family == NULL) {
> +            /* Compare standalone machine types against each other; they sort
> +             * in increasing order.
> +             */
> +            return strcmp(object_class_get_name(OBJECT_CLASS(mc1)),
> +                          object_class_get_name(OBJECT_CLASS(mc2)));
> +        }
> +
> +        /* Standalone machine types sort after families. */
> +        return 1;
> +    }
> +
> +    if (mc2->family == NULL) {
> +        /* Families sort before standalone machine types. */
> +        return -1;
> +    }
> +
> +    /* Families sort between each other alphabetically increasingly. */
> +    res = strcmp(mc1->family, mc2->family);
> +    if (res != 0) {
> +        return res;
> +    }
> +
> +    /* Within the same family, machine types sort in decreasing order. */
> +    return strcmp(object_class_get_name(OBJECT_CLASS(mc2)),
> +                  object_class_get_name(OBJECT_CLASS(mc1)));
> +}
> +
> + static MachineClass *machine_parse(const char *name)
>  {
>      MachineClass *mc = NULL;
>      GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
> @@ -2550,6 +2585,7 @@ static MachineClass *machine_parse(const char *name)
>          error_printf("Use -machine help to list supported machines!\n");
>      } else {
>          printf("Supported machines are:\n");
> +        machines = g_slist_sort(machines, machine_class_cmp);
>          for (el = machines; el; el = el->next) {
>              MachineClass *mc = el->data;
>              if (mc->alias) {
> 

May I ask about the fate of this PULL request (in particular I care
about this patch, and the next one)?

Thank you,
Laszlo
Laszlo Ersek Nov. 3, 2014, 1:10 p.m. UTC | #2
On 11/03/14 14:04, Laszlo Ersek wrote:
> On 10/22/14 10:18, Michael S. Tsirkin wrote:
>> From: Laszlo Ersek <lersek@redhat.com>

> 
> May I ask about the fate of this PULL request (in particular I care
> about this patch, and the next one)?

Never mind, I can see Michael's new PULL req, posted about half an hour ago.

http://thread.gmane.org/gmane.comp.emulators.qemu/304600

Sorry about the noise.

Thanks!
Laszlo
Andreas Färber Nov. 3, 2014, 1:11 p.m. UTC | #3
Am 03.11.2014 um 14:04 schrieb Laszlo Ersek:
> On 10/22/14 10:18, Michael S. Tsirkin wrote:
>> From: Laszlo Ersek <lersek@redhat.com>
>>
>> Commit 261747f1 ("vl: Use MachineClass instead of global QEMUMachine
>> list") broke the ordering of the machine types in the user-visible output
>> of
>>
>>   qemu-system-XXXX -M \?
>>
>> This occurred because registration was rebased from a manually maintained
>> linked list to GLib hash tables:
>>
>>   qemu_register_machine()
>>     type_register()
>>       type_register_internal()
>>         type_table_add()
>>           g_hash_table_insert()
>>
>> and because the listing was rebased accordingly, from the traversal of the
>> list to the traversal of the hash table (rendered as an ad-hoc list):
>>
>>   machine_parse()
>>     object_class_get_list(TYPE_MACHINE)
>>       object_class_foreach()
>>         g_hash_table_foreach()
>>
>> The current order is a "random" one, for practical purposes, which is
>> annoying for users.
>>
>> Introduce new members QEMUMachine.family and MachineClass.family, allowing
>> machine types to be "clustered". Introduce a comparator function that
>> establishes a total ordering between machine types, ordering machine types
>> in the same family next to each other. In machine_parse(), list the
>> supported machine types sorted with the comparator function.
>>
>> The comparator function:
>> - sorts whole families before standalone machine types,
>> - sorts whole families between each other in alphabetically increasing
>>   order,
>> - sorts machine types inside the same family in alphabetically decreasing
>>   order,
>> - sorts standalone machine types between each other in alphabetically
>>   increasing order.
>>
>> After this patch, all machine types are considered standalone, and
>> accordingly, the output is alphabetically ascending. This will be refined
>> in the following patches.
>>
>> Effects on the x86_64 output:
>>
>> Before:
>>
>>> Supported machines are:
>>> pc-0.13              Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-2.0        Standard PC (i440FX + PIIX, 1996)
>>> pc-1.0               Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-2.1        Standard PC (i440FX + PIIX, 1996)
>>> pc-q35-1.7           Standard PC (Q35 + ICH9, 2009)
>>> pc-1.1               Standard PC (i440FX + PIIX, 1996)
>>> pc-0.14              Standard PC (i440FX + PIIX, 1996)
>>> pc-q35-2.0           Standard PC (Q35 + ICH9, 2009)
>>> pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-1.5        Standard PC (i440FX + PIIX, 1996)
>>> pc-0.15              Standard PC (i440FX + PIIX, 1996)
>>> pc-q35-1.4           Standard PC (Q35 + ICH9, 2009)
>>> isapc                ISA-only PC
>>> pc                   Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.2)
>>> pc-i440fx-2.2        Standard PC (i440FX + PIIX, 1996) (default)
>>> pc-1.2               Standard PC (i440FX + PIIX, 1996)
>>> pc-0.10              Standard PC (i440FX + PIIX, 1996)
>>> pc-0.11              Standard PC (i440FX + PIIX, 1996)
>>> pc-q35-2.1           Standard PC (Q35 + ICH9, 2009)
>>> q35                  Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.2)
>>> pc-q35-2.2           Standard PC (Q35 + ICH9, 2009)
>>> pc-i440fx-1.6        Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-1.7        Standard PC (i440FX + PIIX, 1996)
>>> none                 empty machine
>>> pc-q35-1.5           Standard PC (Q35 + ICH9, 2009)
>>> pc-q35-1.6           Standard PC (Q35 + ICH9, 2009)
>>> pc-0.12              Standard PC (i440FX + PIIX, 1996)
>>> pc-1.3               Standard PC (i440FX + PIIX, 1996)
>>
>> After:
>>
>>> Supported machines are:
>>> isapc                ISA-only PC
>>> none                 empty machine
>>> pc-0.10              Standard PC (i440FX + PIIX, 1996)
>>> pc-0.11              Standard PC (i440FX + PIIX, 1996)
>>> pc-0.12              Standard PC (i440FX + PIIX, 1996)
>>> pc-0.13              Standard PC (i440FX + PIIX, 1996)
>>> pc-0.14              Standard PC (i440FX + PIIX, 1996)
>>> pc-0.15              Standard PC (i440FX + PIIX, 1996)
>>> pc-1.0               Standard PC (i440FX + PIIX, 1996)
>>> pc-1.1               Standard PC (i440FX + PIIX, 1996)
>>> pc-1.2               Standard PC (i440FX + PIIX, 1996)
>>> pc-1.3               Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-1.5        Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-1.6        Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-1.7        Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-2.0        Standard PC (i440FX + PIIX, 1996)
>>> pc-i440fx-2.1        Standard PC (i440FX + PIIX, 1996)
>>> pc                   Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.2)
>>> pc-i440fx-2.2        Standard PC (i440FX + PIIX, 1996) (default)
>>> pc-q35-1.4           Standard PC (Q35 + ICH9, 2009)
>>> pc-q35-1.5           Standard PC (Q35 + ICH9, 2009)
>>> pc-q35-1.6           Standard PC (Q35 + ICH9, 2009)
>>> pc-q35-1.7           Standard PC (Q35 + ICH9, 2009)
>>> pc-q35-2.0           Standard PC (Q35 + ICH9, 2009)
>>> pc-q35-2.1           Standard PC (Q35 + ICH9, 2009)
>>> q35                  Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.2)
>>> pc-q35-2.2           Standard PC (Q35 + ICH9, 2009)
>>
>> Effects on the aarch64 output:
>>
>> Before:
>>
>>> Supported machines are:
>>> lm3s811evb           Stellaris LM3S811EVB
>>> canon-a1100          Canon PowerShot A1100 IS
>>> vexpress-a15         ARM Versatile Express for Cortex-A15
>>> vexpress-a9          ARM Versatile Express for Cortex-A9
>>> xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
>>> connex               Gumstix Connex (PXA255)
>>> n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
>>> lm3s6965evb          Stellaris LM3S6965EVB
>>> versatileab          ARM Versatile/AB (ARM926EJ-S)
>>> borzoi               Borzoi PDA (PXA270)
>>> tosa                 Tosa PDA (PXA255)
>>> cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
>>> midway               Calxeda Midway (ECX-2000)
>>> mainstone            Mainstone II (PXA27x)
>>> n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
>>> terrier              Terrier PDA (PXA270)
>>> highbank             Calxeda Highbank (ECX-1000)
>>> cubieboard           cubietech cubieboard
>>> sx1-v1               Siemens SX1 (OMAP310) V1
>>> sx1                  Siemens SX1 (OMAP310) V2
>>> realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
>>> kzm                  ARM KZM Emulation Baseboard (ARM1136)
>>> akita                Akita PDA (PXA270)
>>> z2                   Zipit Z2 (PXA27x)
>>> musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
>>> realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
>>> versatilepb          ARM Versatile/PB (ARM926EJ-S)
>>> realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
>>> realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
>>> spitz                Spitz PDA (PXA270)
>>> none                 empty machine
>>> virt                 ARM Virtual Machine
>>> collie               Collie PDA (SA-1110)
>>> smdkc210             Samsung SMDKC210 board (Exynos4210)
>>> verdex               Gumstix Verdex (PXA270)
>>> nuri                 Samsung NURI board (Exynos4210)
>>> integratorcp         ARM Integrator/CP (ARM926EJ-S)
>>
>> After:
>>
>>> Supported machines are:
>>> akita                Akita PDA (PXA270)
>>> borzoi               Borzoi PDA (PXA270)
>>> canon-a1100          Canon PowerShot A1100 IS
>>> cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
>>> collie               Collie PDA (SA-1110)
>>> connex               Gumstix Connex (PXA255)
>>> cubieboard           cubietech cubieboard
>>> highbank             Calxeda Highbank (ECX-1000)
>>> integratorcp         ARM Integrator/CP (ARM926EJ-S)
>>> kzm                  ARM KZM Emulation Baseboard (ARM1136)
>>> lm3s6965evb          Stellaris LM3S6965EVB
>>> lm3s811evb           Stellaris LM3S811EVB
>>> mainstone            Mainstone II (PXA27x)
>>> midway               Calxeda Midway (ECX-2000)
>>> musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
>>> n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
>>> n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
>>> none                 empty machine
>>> nuri                 Samsung NURI board (Exynos4210)
>>> realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
>>> realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
>>> realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
>>> realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
>>> smdkc210             Samsung SMDKC210 board (Exynos4210)
>>> spitz                Spitz PDA (PXA270)
>>> sx1                  Siemens SX1 (OMAP310) V2
>>> sx1-v1               Siemens SX1 (OMAP310) V1
>>> terrier              Terrier PDA (PXA270)
>>> tosa                 Tosa PDA (PXA255)
>>> verdex               Gumstix Verdex (PXA270)
>>> versatileab          ARM Versatile/AB (ARM926EJ-S)
>>> versatilepb          ARM Versatile/PB (ARM926EJ-S)
>>> vexpress-a15         ARM Versatile Express for Cortex-A15
>>> vexpress-a9          ARM Versatile Express for Cortex-A9
>>> virt                 ARM Virtual Machine
>>> xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
>>> z2                   Zipit Z2 (PXA27x)
>>
>> RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1145042
>> Signed-off-by: Laszlo Ersek <lersek@redhat.com>
>> Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
>> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
>> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
>> Reviewed-by: Marcel Apfelbaum <marcel.a@redhat.com>
>> Acked-by: David Gibson <david@gibson.dropbear.id.au>
[...]
> 
> May I ask about the fate of this PULL request (in particular I care
> about this patch, and the next one)?

Michael sent a new, larger PULL shortly before you asked. :)

Cheers,
Andreas
Michael S. Tsirkin Nov. 3, 2014, 1:11 p.m. UTC | #4
On Mon, Nov 03, 2014 at 02:04:25PM +0100, Laszlo Ersek wrote:
> On 10/22/14 10:18, Michael S. Tsirkin wrote:
> > From: Laszlo Ersek <lersek@redhat.com>
> > 
> > Commit 261747f1 ("vl: Use MachineClass instead of global QEMUMachine
> > list") broke the ordering of the machine types in the user-visible output
> > of
> > 
> >   qemu-system-XXXX -M \?
> > 
> > This occurred because registration was rebased from a manually maintained
> > linked list to GLib hash tables:
> > 
> >   qemu_register_machine()
> >     type_register()
> >       type_register_internal()
> >         type_table_add()
> >           g_hash_table_insert()
> > 
> > and because the listing was rebased accordingly, from the traversal of the
> > list to the traversal of the hash table (rendered as an ad-hoc list):
> > 
> >   machine_parse()
> >     object_class_get_list(TYPE_MACHINE)
> >       object_class_foreach()
> >         g_hash_table_foreach()
> > 
> > The current order is a "random" one, for practical purposes, which is
> > annoying for users.
> > 
> > Introduce new members QEMUMachine.family and MachineClass.family, allowing
> > machine types to be "clustered". Introduce a comparator function that
> > establishes a total ordering between machine types, ordering machine types
> > in the same family next to each other. In machine_parse(), list the
> > supported machine types sorted with the comparator function.
> > 
> > The comparator function:
> > - sorts whole families before standalone machine types,
> > - sorts whole families between each other in alphabetically increasing
> >   order,
> > - sorts machine types inside the same family in alphabetically decreasing
> >   order,
> > - sorts standalone machine types between each other in alphabetically
> >   increasing order.
> > 
> > After this patch, all machine types are considered standalone, and
> > accordingly, the output is alphabetically ascending. This will be refined
> > in the following patches.
> > 
> > Effects on the x86_64 output:
> > 
> > Before:
> > 
> >> Supported machines are:
> >> pc-0.13              Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-2.0        Standard PC (i440FX + PIIX, 1996)
> >> pc-1.0               Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-2.1        Standard PC (i440FX + PIIX, 1996)
> >> pc-q35-1.7           Standard PC (Q35 + ICH9, 2009)
> >> pc-1.1               Standard PC (i440FX + PIIX, 1996)
> >> pc-0.14              Standard PC (i440FX + PIIX, 1996)
> >> pc-q35-2.0           Standard PC (Q35 + ICH9, 2009)
> >> pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-1.5        Standard PC (i440FX + PIIX, 1996)
> >> pc-0.15              Standard PC (i440FX + PIIX, 1996)
> >> pc-q35-1.4           Standard PC (Q35 + ICH9, 2009)
> >> isapc                ISA-only PC
> >> pc                   Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.2)
> >> pc-i440fx-2.2        Standard PC (i440FX + PIIX, 1996) (default)
> >> pc-1.2               Standard PC (i440FX + PIIX, 1996)
> >> pc-0.10              Standard PC (i440FX + PIIX, 1996)
> >> pc-0.11              Standard PC (i440FX + PIIX, 1996)
> >> pc-q35-2.1           Standard PC (Q35 + ICH9, 2009)
> >> q35                  Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.2)
> >> pc-q35-2.2           Standard PC (Q35 + ICH9, 2009)
> >> pc-i440fx-1.6        Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-1.7        Standard PC (i440FX + PIIX, 1996)
> >> none                 empty machine
> >> pc-q35-1.5           Standard PC (Q35 + ICH9, 2009)
> >> pc-q35-1.6           Standard PC (Q35 + ICH9, 2009)
> >> pc-0.12              Standard PC (i440FX + PIIX, 1996)
> >> pc-1.3               Standard PC (i440FX + PIIX, 1996)
> > 
> > After:
> > 
> >> Supported machines are:
> >> isapc                ISA-only PC
> >> none                 empty machine
> >> pc-0.10              Standard PC (i440FX + PIIX, 1996)
> >> pc-0.11              Standard PC (i440FX + PIIX, 1996)
> >> pc-0.12              Standard PC (i440FX + PIIX, 1996)
> >> pc-0.13              Standard PC (i440FX + PIIX, 1996)
> >> pc-0.14              Standard PC (i440FX + PIIX, 1996)
> >> pc-0.15              Standard PC (i440FX + PIIX, 1996)
> >> pc-1.0               Standard PC (i440FX + PIIX, 1996)
> >> pc-1.1               Standard PC (i440FX + PIIX, 1996)
> >> pc-1.2               Standard PC (i440FX + PIIX, 1996)
> >> pc-1.3               Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-1.4        Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-1.5        Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-1.6        Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-1.7        Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-2.0        Standard PC (i440FX + PIIX, 1996)
> >> pc-i440fx-2.1        Standard PC (i440FX + PIIX, 1996)
> >> pc                   Standard PC (i440FX + PIIX, 1996) (alias of pc-i440fx-2.2)
> >> pc-i440fx-2.2        Standard PC (i440FX + PIIX, 1996) (default)
> >> pc-q35-1.4           Standard PC (Q35 + ICH9, 2009)
> >> pc-q35-1.5           Standard PC (Q35 + ICH9, 2009)
> >> pc-q35-1.6           Standard PC (Q35 + ICH9, 2009)
> >> pc-q35-1.7           Standard PC (Q35 + ICH9, 2009)
> >> pc-q35-2.0           Standard PC (Q35 + ICH9, 2009)
> >> pc-q35-2.1           Standard PC (Q35 + ICH9, 2009)
> >> q35                  Standard PC (Q35 + ICH9, 2009) (alias of pc-q35-2.2)
> >> pc-q35-2.2           Standard PC (Q35 + ICH9, 2009)
> > 
> > Effects on the aarch64 output:
> > 
> > Before:
> > 
> >> Supported machines are:
> >> lm3s811evb           Stellaris LM3S811EVB
> >> canon-a1100          Canon PowerShot A1100 IS
> >> vexpress-a15         ARM Versatile Express for Cortex-A15
> >> vexpress-a9          ARM Versatile Express for Cortex-A9
> >> xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
> >> connex               Gumstix Connex (PXA255)
> >> n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
> >> lm3s6965evb          Stellaris LM3S6965EVB
> >> versatileab          ARM Versatile/AB (ARM926EJ-S)
> >> borzoi               Borzoi PDA (PXA270)
> >> tosa                 Tosa PDA (PXA255)
> >> cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
> >> midway               Calxeda Midway (ECX-2000)
> >> mainstone            Mainstone II (PXA27x)
> >> n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
> >> terrier              Terrier PDA (PXA270)
> >> highbank             Calxeda Highbank (ECX-1000)
> >> cubieboard           cubietech cubieboard
> >> sx1-v1               Siemens SX1 (OMAP310) V1
> >> sx1                  Siemens SX1 (OMAP310) V2
> >> realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
> >> kzm                  ARM KZM Emulation Baseboard (ARM1136)
> >> akita                Akita PDA (PXA270)
> >> z2                   Zipit Z2 (PXA27x)
> >> musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
> >> realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
> >> versatilepb          ARM Versatile/PB (ARM926EJ-S)
> >> realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
> >> realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
> >> spitz                Spitz PDA (PXA270)
> >> none                 empty machine
> >> virt                 ARM Virtual Machine
> >> collie               Collie PDA (SA-1110)
> >> smdkc210             Samsung SMDKC210 board (Exynos4210)
> >> verdex               Gumstix Verdex (PXA270)
> >> nuri                 Samsung NURI board (Exynos4210)
> >> integratorcp         ARM Integrator/CP (ARM926EJ-S)
> > 
> > After:
> > 
> >> Supported machines are:
> >> akita                Akita PDA (PXA270)
> >> borzoi               Borzoi PDA (PXA270)
> >> canon-a1100          Canon PowerShot A1100 IS
> >> cheetah              Palm Tungsten|E aka. Cheetah PDA (OMAP310)
> >> collie               Collie PDA (SA-1110)
> >> connex               Gumstix Connex (PXA255)
> >> cubieboard           cubietech cubieboard
> >> highbank             Calxeda Highbank (ECX-1000)
> >> integratorcp         ARM Integrator/CP (ARM926EJ-S)
> >> kzm                  ARM KZM Emulation Baseboard (ARM1136)
> >> lm3s6965evb          Stellaris LM3S6965EVB
> >> lm3s811evb           Stellaris LM3S811EVB
> >> mainstone            Mainstone II (PXA27x)
> >> midway               Calxeda Midway (ECX-2000)
> >> musicpal             Marvell 88w8618 / MusicPal (ARM926EJ-S)
> >> n800                 Nokia N800 tablet aka. RX-34 (OMAP2420)
> >> n810                 Nokia N810 tablet aka. RX-44 (OMAP2420)
> >> none                 empty machine
> >> nuri                 Samsung NURI board (Exynos4210)
> >> realview-eb          ARM RealView Emulation Baseboard (ARM926EJ-S)
> >> realview-eb-mpcore   ARM RealView Emulation Baseboard (ARM11MPCore)
> >> realview-pb-a8       ARM RealView Platform Baseboard for Cortex-A8
> >> realview-pbx-a9      ARM RealView Platform Baseboard Explore for Cortex-A9
> >> smdkc210             Samsung SMDKC210 board (Exynos4210)
> >> spitz                Spitz PDA (PXA270)
> >> sx1                  Siemens SX1 (OMAP310) V2
> >> sx1-v1               Siemens SX1 (OMAP310) V1
> >> terrier              Terrier PDA (PXA270)
> >> tosa                 Tosa PDA (PXA255)
> >> verdex               Gumstix Verdex (PXA270)
> >> versatileab          ARM Versatile/AB (ARM926EJ-S)
> >> versatilepb          ARM Versatile/PB (ARM926EJ-S)
> >> vexpress-a15         ARM Versatile Express for Cortex-A15
> >> vexpress-a9          ARM Versatile Express for Cortex-A9
> >> virt                 ARM Virtual Machine
> >> xilinx-zynq-a9       Xilinx Zynq Platform Baseboard for Cortex-A9
> >> z2                   Zipit Z2 (PXA27x)
> > 
> > RHBZ: https://bugzilla.redhat.com/show_bug.cgi?id=1145042
> > Signed-off-by: Laszlo Ersek <lersek@redhat.com>
> > Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
> > Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
> > Reviewed-by: Paolo Bonzini <pbonzini@redhat.com>
> > Reviewed-by: Marcel Apfelbaum <marcel.a@redhat.com>
> > Acked-by: David Gibson <david@gibson.dropbear.id.au>
> > ---
> >  include/hw/boards.h |  2 ++
> >  hw/i386/pc.c        |  1 +
> >  vl.c                | 38 +++++++++++++++++++++++++++++++++++++-
> >  3 files changed, 40 insertions(+), 1 deletion(-)
> > 
> > diff --git a/include/hw/boards.h b/include/hw/boards.h
> > index e07c03f..4429a1e 100644
> > --- a/include/hw/boards.h
> > +++ b/include/hw/boards.h
> > @@ -19,6 +19,7 @@ typedef void QEMUMachineHotAddCPUFunc(const int64_t id, Error **errp);
> >  typedef int QEMUMachineGetKvmtypeFunc(const char *arg);
> >  
> >  struct QEMUMachine {
> > +    const char *family; /* NULL iff @name identifies a standalone machtype */
> >      const char *name;
> >      const char *alias;
> >      const char *desc;
> > @@ -76,6 +77,7 @@ struct MachineClass {
> >      ObjectClass parent_class;
> >      /*< public >*/
> >  
> > +    const char *family; /* NULL iff @name identifies a standalone machtype */
> >      const char *name;
> >      const char *alias;
> >      const char *desc;
> > diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> > index d045e8b..21beb72 100644
> > --- a/hw/i386/pc.c
> > +++ b/hw/i386/pc.c
> > @@ -1516,6 +1516,7 @@ static void pc_generic_machine_class_init(ObjectClass *oc, void *data)
> >      MachineClass *mc = MACHINE_CLASS(oc);
> >      QEMUMachine *qm = data;
> >  
> > +    mc->family = qm->family;
> >      mc->name = qm->name;
> >      mc->alias = qm->alias;
> >      mc->desc = qm->desc;
> > diff --git a/vl.c b/vl.c
> > index aee73e1..a518f84 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -1460,6 +1460,7 @@ static void machine_class_init(ObjectClass *oc, void *data)
> >      MachineClass *mc = MACHINE_CLASS(oc);
> >      QEMUMachine *qm = data;
> >  
> > +    mc->family = qm->family;
> >      mc->name = qm->name;
> >      mc->alias = qm->alias;
> >      mc->desc = qm->desc;
> > @@ -2534,7 +2535,41 @@ static int debugcon_parse(const char *devname)
> >      return 0;
> >  }
> >  
> > -static MachineClass *machine_parse(const char *name)
> > +static gint machine_class_cmp(gconstpointer a, gconstpointer b)
> > +{
> > +    const MachineClass *mc1 = a, *mc2 = b;
> > +    int res;
> > +
> > +    if (mc1->family == NULL) {
> > +        if (mc2->family == NULL) {
> > +            /* Compare standalone machine types against each other; they sort
> > +             * in increasing order.
> > +             */
> > +            return strcmp(object_class_get_name(OBJECT_CLASS(mc1)),
> > +                          object_class_get_name(OBJECT_CLASS(mc2)));
> > +        }
> > +
> > +        /* Standalone machine types sort after families. */
> > +        return 1;
> > +    }
> > +
> > +    if (mc2->family == NULL) {
> > +        /* Families sort before standalone machine types. */
> > +        return -1;
> > +    }
> > +
> > +    /* Families sort between each other alphabetically increasingly. */
> > +    res = strcmp(mc1->family, mc2->family);
> > +    if (res != 0) {
> > +        return res;
> > +    }
> > +
> > +    /* Within the same family, machine types sort in decreasing order. */
> > +    return strcmp(object_class_get_name(OBJECT_CLASS(mc2)),
> > +                  object_class_get_name(OBJECT_CLASS(mc1)));
> > +}
> > +
> > + static MachineClass *machine_parse(const char *name)
> >  {
> >      MachineClass *mc = NULL;
> >      GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
> > @@ -2550,6 +2585,7 @@ static MachineClass *machine_parse(const char *name)
> >          error_printf("Use -machine help to list supported machines!\n");
> >      } else {
> >          printf("Supported machines are:\n");
> > +        machines = g_slist_sort(machines, machine_class_cmp);
> >          for (el = machines; el; el = el->next) {
> >              MachineClass *mc = el->data;
> >              if (mc->alias) {
> > 
> 
> May I ask about the fate of this PULL request (in particular I care
> about this patch, and the next one)?
> 
> Thank you,
> Laszlo

I just sent a new request today including this patch.
Pls take a look, and let me know if something's missing.
diff mbox

Patch

diff --git a/include/hw/boards.h b/include/hw/boards.h
index e07c03f..4429a1e 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -19,6 +19,7 @@  typedef void QEMUMachineHotAddCPUFunc(const int64_t id, Error **errp);
 typedef int QEMUMachineGetKvmtypeFunc(const char *arg);
 
 struct QEMUMachine {
+    const char *family; /* NULL iff @name identifies a standalone machtype */
     const char *name;
     const char *alias;
     const char *desc;
@@ -76,6 +77,7 @@  struct MachineClass {
     ObjectClass parent_class;
     /*< public >*/
 
+    const char *family; /* NULL iff @name identifies a standalone machtype */
     const char *name;
     const char *alias;
     const char *desc;
diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index d045e8b..21beb72 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -1516,6 +1516,7 @@  static void pc_generic_machine_class_init(ObjectClass *oc, void *data)
     MachineClass *mc = MACHINE_CLASS(oc);
     QEMUMachine *qm = data;
 
+    mc->family = qm->family;
     mc->name = qm->name;
     mc->alias = qm->alias;
     mc->desc = qm->desc;
diff --git a/vl.c b/vl.c
index aee73e1..a518f84 100644
--- a/vl.c
+++ b/vl.c
@@ -1460,6 +1460,7 @@  static void machine_class_init(ObjectClass *oc, void *data)
     MachineClass *mc = MACHINE_CLASS(oc);
     QEMUMachine *qm = data;
 
+    mc->family = qm->family;
     mc->name = qm->name;
     mc->alias = qm->alias;
     mc->desc = qm->desc;
@@ -2534,7 +2535,41 @@  static int debugcon_parse(const char *devname)
     return 0;
 }
 
-static MachineClass *machine_parse(const char *name)
+static gint machine_class_cmp(gconstpointer a, gconstpointer b)
+{
+    const MachineClass *mc1 = a, *mc2 = b;
+    int res;
+
+    if (mc1->family == NULL) {
+        if (mc2->family == NULL) {
+            /* Compare standalone machine types against each other; they sort
+             * in increasing order.
+             */
+            return strcmp(object_class_get_name(OBJECT_CLASS(mc1)),
+                          object_class_get_name(OBJECT_CLASS(mc2)));
+        }
+
+        /* Standalone machine types sort after families. */
+        return 1;
+    }
+
+    if (mc2->family == NULL) {
+        /* Families sort before standalone machine types. */
+        return -1;
+    }
+
+    /* Families sort between each other alphabetically increasingly. */
+    res = strcmp(mc1->family, mc2->family);
+    if (res != 0) {
+        return res;
+    }
+
+    /* Within the same family, machine types sort in decreasing order. */
+    return strcmp(object_class_get_name(OBJECT_CLASS(mc2)),
+                  object_class_get_name(OBJECT_CLASS(mc1)));
+}
+
+ static MachineClass *machine_parse(const char *name)
 {
     MachineClass *mc = NULL;
     GSList *el, *machines = object_class_get_list(TYPE_MACHINE, false);
@@ -2550,6 +2585,7 @@  static MachineClass *machine_parse(const char *name)
         error_printf("Use -machine help to list supported machines!\n");
     } else {
         printf("Supported machines are:\n");
+        machines = g_slist_sort(machines, machine_class_cmp);
         for (el = machines; el; el = el->next) {
             MachineClass *mc = el->data;
             if (mc->alias) {