[PATCH RFC 0/1] QOM type names and QAPI

Markus Armbruster posted 1 patch 3 years, 3 months ago
Test checkpatch passed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/qemu tags/patchew/20210129081519.3848145-1-armbru@redhat.com
Maintainers: Kevin Wolf <kwolf@redhat.com>, Fabien Chouteau <chouteau@adacore.com>, Alistair Francis <alistair@alistair23.me>, Gerd Hoffmann <kraxel@redhat.com>, "Michael S. Tsirkin" <mst@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>, Juan Quintela <quintela@redhat.com>, "Marc-André Lureau" <marcandre.lureau@redhat.com>, KONRAD Frederic <frederic.konrad@adacore.com>, Max Reitz <mreitz@redhat.com>, "Edgar E. Iglesias" <edgar.iglesias@gmail.com>, Peter Maydell <peter.maydell@linaro.org>, Andrey Smirnov <andrew.smirnov@gmail.com>, Peter Chubb <peter.chubb@nicta.com.au>, Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk>, Artyom Tarasenko <atar4qemu@gmail.com>, Marcel Apfelbaum <marcel.apfelbaum@gmail.com>, Jean-Christophe Dubois <jcd@tribudubois.net>, John Snow <jsnow@redhat.com>, "Dr. David Alan Gilbert" <dgilbert@redhat.com>
There is a newer version of this series
include/hw/arm/armv7m.h                      |  2 +-
include/hw/arm/fsl-imx25.h                   |  2 +-
include/hw/arm/fsl-imx31.h                   |  2 +-
include/hw/arm/fsl-imx6.h                    |  2 +-
include/hw/arm/fsl-imx6ul.h                  |  2 +-
include/hw/arm/fsl-imx7.h                    |  2 +-
include/hw/arm/xlnx-zynqmp.h                 |  2 +-
include/hw/cris/etraxfs.h                    |  2 +-
include/hw/i386/ich9.h                       |  2 +-
include/hw/misc/grlib_ahb_apb_pnp.h          |  4 ++--
include/hw/misc/zynq-xadc.h                  |  2 +-
include/hw/register.h                        |  2 +-
include/hw/sparc/grlib.h                     |  6 +++---
hw/arm/xilinx_zynq.c                         |  2 +-
hw/audio/cs4231.c                            |  2 +-
hw/block/fdc.c                               |  4 ++--
hw/char/etraxfs_ser.c                        |  2 +-
hw/cris/axis_dev88.c                         |  6 +++---
hw/display/tcx.c                             |  2 +-
hw/intc/etraxfs_pic.c                        |  2 +-
hw/microblaze/xlnx-zynqmp-pmu.c              |  2 +-
hw/misc/zynq_slcr.c                          |  2 +-
hw/sparc/sun4m.c                             | 12 ++++++------
hw/timer/etraxfs_timer.c                     |  2 +-
softmmu/vl.c                                 |  2 +-
tests/vmstate-static-checker-data/dump1.json |  4 ++--
tests/vmstate-static-checker-data/dump2.json |  4 ++--
27 files changed, 40 insertions(+), 40 deletions(-)
[PATCH RFC 0/1] QOM type names and QAPI
Posted by Markus Armbruster 3 years, 3 months ago
QAPI has naming rules.  docs/devel/qapi-code-gen.txt:

    === Naming rules and reserved names ===

    All names must begin with a letter, and contain only ASCII letters,
    digits, hyphen, and underscore.  There are two exceptions: enum values
    may start with a digit, and names that are downstream extensions (see
    section Downstream extensions) start with underscore.

    [More on reserved names, upper vs. lower case, '-' vs. '_'...]

The generator enforces the rules.

Naming rules help in at least three ways:

1. They help with keeping names in interfaces consistent and
   predictable.

2. They make avoiding collisions with the users' names in the
   generator simpler.

3. They enable quote-less, evolvable syntax.

   For instance, keyval_parse() syntax consists of names, values, and
   special characters ',', '=', '.'

   Since names cannot contain special characters, there is no need for
   quoting[*].  Simple.

   Values are unrestricted, but only ',' is special there.  We quote
   it by doubling.

   Together, we get exactly the same quoting as in QemuOpts.  This is
   a feature.

   If we ever decice to extend key syntax, we have plenty of special
   characters to choose from.  This is also a feature.

   Both features rely on naming rules.

QOM has no naming rules whatsoever.  Actual names aren't nearly as bad
as they could be.  Still, there are plenty of "funny" names.  This
will become a problem when we

* Switch from QemuOpts to keyval_parse()

  QOM type names must not contain special characters, unless we
  introduce more quoting.  Which we shouldn't, because the value of
  special characters in names is negligible compared to the hassle of
  having to quote them.

* QAPIfy (the compile-time static parts of) QOM

  QOM type names become QAPI enum values.  They must conform to QAPI
  naming rules.

Adopting QAPI naming rules for QOM type names takes care of both.

Let's review the existing offenders.

1. We have a few type names containing ',', and one containing ' '.
   The former require QemuOpts / keyval quoting (double the comma),
   the latter requires shell quoting.  There is no excuse for making
   our users remember and do such crap.  PATCH 1 eliminates it.

2. We have some 550 type names containing '.'.  QAPI's naming rules
   could be relaxed to accept '.', but keyval_parse()'s can't.

   Aside: I wish keyval_parse() would use '/' instead of '.', but it's
   designed to be compatible to the block layer's existing use of
   dotted keys (shoehorned into QemuOpts).

3. We have six type names containing '+'.  Four of them also contain
   '.'.  Naming rules could be relaxed to accept '+'.  I'm not sure
   it's worthwhile.

4. We have 19 names starting with a digit.  Three of them also contain
   '.'.  Leading digit is okay as QAPI enum, not okay as
   keyval_parse() key fragment.  We can either rename these types, or
   make keyval_parse() a bit less strict.

Of the type names containing '.' or '+'[**], 293 are CPUs, 107 are
machines, and 150 are something else.  48 of them can be plugged with
-device, all s390x or spapr CPUs.

Can we get rid of '.'?

I figure we could keep old names as deprecated aliases if we care.
Perhaps just the ones that can be plugged with -device.


[*] Paolo's "[PATCH 04/25] keyval: accept escaped commas in implied
option" provides for comma-quoting.  I'm ignoring it here for brevity.
I assure you it doesn't weaken my argument.

[**] They are:
    603e_v1.1-powerpc-cpu
    603e_v1.1-powerpc64-cpu
    603e_v1.2-powerpc-cpu
    603e_v1.2-powerpc64-cpu
    603e_v1.3-powerpc-cpu
    603e_v1.3-powerpc64-cpu
    603e_v1.4-powerpc-cpu
    603e_v1.4-powerpc64-cpu
    603e_v2.2-powerpc-cpu
    603e_v2.2-powerpc64-cpu
    603e_v4.1-powerpc-cpu
    603e_v4.1-powerpc64-cpu
    604e_v1.0-powerpc-cpu
    604e_v1.0-powerpc64-cpu
    604e_v2.2-powerpc-cpu
    604e_v2.2-powerpc64-cpu
    604e_v2.4-powerpc-cpu
    604e_v2.4-powerpc64-cpu
    7400_v1.0-powerpc-cpu
    7400_v1.0-powerpc64-cpu
    7400_v1.1-powerpc-cpu
    7400_v1.1-powerpc64-cpu
    7400_v2.0-powerpc-cpu
    7400_v2.0-powerpc64-cpu
    7400_v2.1-powerpc-cpu
    7400_v2.1-powerpc64-cpu
    7400_v2.2-powerpc-cpu
    7400_v2.2-powerpc64-cpu
    7400_v2.6-powerpc-cpu
    7400_v2.6-powerpc64-cpu
    7400_v2.7-powerpc-cpu
    7400_v2.7-powerpc64-cpu
    7400_v2.8-powerpc-cpu
    7400_v2.8-powerpc64-cpu
    7400_v2.9-powerpc-cpu
    7400_v2.9-powerpc64-cpu
    740_v1.0-powerpc-cpu
    740_v1.0-powerpc64-cpu
    740_v2.0-powerpc-cpu
    740_v2.0-powerpc64-cpu
    740_v2.1-powerpc-cpu
    740_v2.1-powerpc64-cpu
    740_v2.2-powerpc-cpu
    740_v2.2-powerpc64-cpu
    740_v3.0-powerpc-cpu
    740_v3.0-powerpc64-cpu
    740_v3.1-powerpc-cpu
    740_v3.1-powerpc64-cpu
    7410_v1.0-powerpc-cpu
    7410_v1.0-powerpc64-cpu
    7410_v1.1-powerpc-cpu
    7410_v1.1-powerpc64-cpu
    7410_v1.2-powerpc-cpu
    7410_v1.2-powerpc64-cpu
    7410_v1.3-powerpc-cpu
    7410_v1.3-powerpc64-cpu
    7410_v1.4-powerpc-cpu
    7410_v1.4-powerpc64-cpu
    7441_v2.1-powerpc-cpu
    7441_v2.1-powerpc64-cpu
    7441_v2.10-powerpc-cpu
    7441_v2.10-powerpc64-cpu
    7441_v2.3-powerpc-cpu
    7441_v2.3-powerpc64-cpu
    7445_v1.0-powerpc-cpu
    7445_v1.0-powerpc64-cpu
    7445_v2.1-powerpc-cpu
    7445_v2.1-powerpc64-cpu
    7445_v3.2-powerpc-cpu
    7445_v3.2-powerpc64-cpu
    7445_v3.3-powerpc-cpu
    7445_v3.3-powerpc64-cpu
    7445_v3.4-powerpc-cpu
    7445_v3.4-powerpc64-cpu
    7447_v1.0-powerpc-cpu
    7447_v1.0-powerpc64-cpu
    7447_v1.1-powerpc-cpu
    7447_v1.1-powerpc64-cpu
    7447a_v1.0-powerpc-cpu
    7447a_v1.0-powerpc64-cpu
    7447a_v1.1-powerpc-cpu
    7447a_v1.1-powerpc64-cpu
    7447a_v1.2-powerpc-cpu
    7447a_v1.2-powerpc64-cpu
    7448_v1.0-powerpc-cpu
    7448_v1.0-powerpc64-cpu
    7448_v1.1-powerpc-cpu
    7448_v1.1-powerpc64-cpu
    7448_v2.0-powerpc-cpu
    7448_v2.0-powerpc64-cpu
    7448_v2.1-powerpc-cpu
    7448_v2.1-powerpc64-cpu
    7450_v1.0-powerpc-cpu
    7450_v1.0-powerpc64-cpu
    7450_v1.1-powerpc-cpu
    7450_v1.1-powerpc64-cpu
    7450_v1.2-powerpc-cpu
    7450_v1.2-powerpc64-cpu
    7450_v2.0-powerpc-cpu
    7450_v2.0-powerpc64-cpu
    7450_v2.1-powerpc-cpu
    7450_v2.1-powerpc64-cpu
    7451_v2.10-powerpc-cpu
    7451_v2.10-powerpc64-cpu
    7451_v2.3-powerpc-cpu
    7451_v2.3-powerpc64-cpu
    7455_v1.0-powerpc-cpu
    7455_v1.0-powerpc64-cpu
    7455_v2.1-powerpc-cpu
    7455_v2.1-powerpc64-cpu
    7455_v3.2-powerpc-cpu
    7455_v3.2-powerpc64-cpu
    7455_v3.3-powerpc-cpu
    7455_v3.3-powerpc64-cpu
    7455_v3.4-powerpc-cpu
    7455_v3.4-powerpc64-cpu
    7457_v1.0-powerpc-cpu
    7457_v1.0-powerpc64-cpu
    7457_v1.1-powerpc-cpu
    7457_v1.1-powerpc64-cpu
    7457_v1.2-powerpc-cpu
    7457_v1.2-powerpc64-cpu
    7457a_v1.0-powerpc-cpu
    7457a_v1.0-powerpc64-cpu
    7457a_v1.1-powerpc-cpu
    7457a_v1.1-powerpc64-cpu
    7457a_v1.2-powerpc-cpu
    7457a_v1.2-powerpc64-cpu
    745_v1.0-powerpc-cpu
    745_v1.0-powerpc64-cpu
    745_v1.1-powerpc-cpu
    745_v1.1-powerpc64-cpu
    745_v2.0-powerpc-cpu
    745_v2.0-powerpc64-cpu
    745_v2.1-powerpc-cpu
    745_v2.1-powerpc64-cpu
    745_v2.2-powerpc-cpu
    745_v2.2-powerpc64-cpu
    745_v2.3-powerpc-cpu
    745_v2.3-powerpc64-cpu
    745_v2.4-powerpc-cpu
    745_v2.4-powerpc64-cpu
    745_v2.5-powerpc-cpu
    745_v2.5-powerpc64-cpu
    745_v2.6-powerpc-cpu
    745_v2.6-powerpc64-cpu
    745_v2.7-powerpc-cpu
    745_v2.7-powerpc64-cpu
    745_v2.8-powerpc-cpu
    745_v2.8-powerpc64-cpu
    750_v1.0-powerpc-cpu
    750_v1.0-powerpc64-cpu
    750_v2.0-powerpc-cpu
    750_v2.0-powerpc64-cpu
    750_v2.1-powerpc-cpu
    750_v2.1-powerpc64-cpu
    750_v2.2-powerpc-cpu
    750_v2.2-powerpc64-cpu
    750_v3.0-powerpc-cpu
    750_v3.0-powerpc64-cpu
    750_v3.1-powerpc-cpu
    750_v3.1-powerpc64-cpu
    750cl_v1.0-powerpc-cpu
    750cl_v1.0-powerpc64-cpu
    750cl_v2.0-powerpc-cpu
    750cl_v2.0-powerpc64-cpu
    750cx_v1.0-powerpc-cpu
    750cx_v1.0-powerpc64-cpu
    750cx_v2.0-powerpc-cpu
    750cx_v2.0-powerpc64-cpu
    750cx_v2.1-powerpc-cpu
    750cx_v2.1-powerpc64-cpu
    750cx_v2.2-powerpc-cpu
    750cx_v2.2-powerpc64-cpu
    750cxe_v2.1-powerpc-cpu
    750cxe_v2.1-powerpc64-cpu
    750cxe_v2.2-powerpc-cpu
    750cxe_v2.2-powerpc64-cpu
    750cxe_v2.3-powerpc-cpu
    750cxe_v2.3-powerpc64-cpu
    750cxe_v2.4-powerpc-cpu
    750cxe_v2.4-powerpc64-cpu
    750cxe_v2.4b-powerpc-cpu
    750cxe_v2.4b-powerpc64-cpu
    750cxe_v3.0-powerpc-cpu
    750cxe_v3.0-powerpc64-cpu
    750cxe_v3.1-powerpc-cpu
    750cxe_v3.1-powerpc64-cpu
    750cxe_v3.1b-powerpc-cpu
    750cxe_v3.1b-powerpc64-cpu
    750fx_v1.0-powerpc-cpu
    750fx_v1.0-powerpc64-cpu
    750fx_v2.0-powerpc-cpu
    750fx_v2.0-powerpc64-cpu
    750fx_v2.1-powerpc-cpu
    750fx_v2.1-powerpc64-cpu
    750fx_v2.2-powerpc-cpu
    750fx_v2.2-powerpc64-cpu
    750fx_v2.3-powerpc-cpu
    750fx_v2.3-powerpc64-cpu
    750gx_v1.0-powerpc-cpu
    750gx_v1.0-powerpc64-cpu
    750gx_v1.1-powerpc-cpu
    750gx_v1.1-powerpc64-cpu
    750gx_v1.2-powerpc-cpu
    750gx_v1.2-powerpc64-cpu
    750l_v2.0-powerpc-cpu
    750l_v2.0-powerpc64-cpu
    750l_v2.1-powerpc-cpu
    750l_v2.1-powerpc64-cpu
    750l_v2.2-powerpc-cpu
    750l_v2.2-powerpc64-cpu
    750l_v3.0-powerpc-cpu
    750l_v3.0-powerpc64-cpu
    750l_v3.2-powerpc-cpu
    750l_v3.2-powerpc64-cpu
    755_v1.0-powerpc-cpu
    755_v1.0-powerpc64-cpu
    755_v1.1-powerpc-cpu
    755_v1.1-powerpc64-cpu
    755_v2.0-powerpc-cpu
    755_v2.0-powerpc64-cpu
    755_v2.1-powerpc-cpu
    755_v2.1-powerpc64-cpu
    755_v2.2-powerpc-cpu
    755_v2.2-powerpc64-cpu
    755_v2.3-powerpc-cpu
    755_v2.3-powerpc64-cpu
    755_v2.4-powerpc-cpu
    755_v2.4-powerpc64-cpu
    755_v2.5-powerpc-cpu
    755_v2.5-powerpc64-cpu
    755_v2.6-powerpc-cpu
    755_v2.6-powerpc64-cpu
    755_v2.7-powerpc-cpu
    755_v2.7-powerpc64-cpu
    755_v2.8-powerpc-cpu
    755_v2.8-powerpc64-cpu
    970_v2.2-powerpc64-cpu
    970_v2.2-spapr-cpu-core
    970fx_v1.0-powerpc64-cpu
    970fx_v2.0-powerpc64-cpu
    970fx_v2.1-powerpc64-cpu
    970fx_v3.0-powerpc64-cpu
    970fx_v3.1-powerpc64-cpu
    970mp_v1.0-powerpc64-cpu
    970mp_v1.0-spapr-cpu-core
    970mp_v1.1-powerpc64-cpu
    970mp_v1.1-spapr-cpu-core
    ALTR.timer
    Sun-UltraSparc-IIIi+-sparc64-cpu
    Sun-UltraSparc-IV+-sparc64-cpu
    arm.cortex-a9-global-timer
    aspeed.fmc-ast2400
    aspeed.fmc-ast2500
    aspeed.fmc-ast2600
    aspeed.gpio
    aspeed.gpio-ast2400
    aspeed.gpio-ast2500
    aspeed.gpio-ast2600
    aspeed.gpio-ast2600-1_8v
    aspeed.i2c
    aspeed.i2c-ast2400
    aspeed.i2c-ast2500
    aspeed.i2c-ast2600
    aspeed.rtc
    aspeed.scu
    aspeed.scu-ast2400
    aspeed.scu-ast2500
    aspeed.scu-ast2600
    aspeed.sdhci
    aspeed.sdmc
    aspeed.sdmc-ast2400
    aspeed.sdmc-ast2500
    aspeed.sdmc-ast2600
    aspeed.smc
    aspeed.smc-ast2400
    aspeed.spi1-ast2400
    aspeed.spi1-ast2500
    aspeed.spi1-ast2600
    aspeed.spi2-ast2500
    aspeed.spi2-ast2600
    aspeed.timer
    aspeed.timer-ast2400
    aspeed.timer-ast2500
    aspeed.timer-ast2600
    aspeed.vic
    aspeed.wdt
    aspeed.wdt-ast2400
    aspeed.wdt-ast2500
    aspeed.wdt-ast2600
    aspeed.xdma
    cadence.sdhci
    cfi.pflash01
    cfi.pflash02
    exynos4210.clk
    exynos4210.combiner
    exynos4210.fimd
    exynos4210.gic
    exynos4210.i2c
    exynos4210.irq_gate
    exynos4210.mct
    exynos4210.pmu
    exynos4210.pwm
    exynos4210.rng
    exynos4210.rtc
    exynos4210.uart
    imx.avic
    imx.ccm
    imx.enet
    imx.epit
    imx.fec
    imx.gpio
    imx.i2c
    imx.rngc
    imx.serial
    imx.spi
    imx.usbphy
    imx2.wdt
    imx25.ccm
    imx25.gpt
    imx31.ccm
    imx31.gpt
    imx6.ccm
    imx6.gpt
    imx6.src
    imx6ul.ccm
    imx7.analog
    imx7.ccm
    imx7.gpr
    imx7.gpt
    imx7.snvs
    loongson.liointc
    mchp.pfsoc.ddr_cfg
    mchp.pfsoc.ddr_sgmii_phy
    mchp.pfsoc.ioscb
    mchp.pfsoc.sysreg
    microbit.i2c
    microchip.pfsoc
    nrf51_soc.gpio
    nrf51_soc.nvm
    nrf51_soc.rng
    nrf51_soc.timer
    nrf51_soc.uart
    pc-1.0-machine
    pc-1.1-machine
    pc-1.2-machine
    pc-1.3-machine
    pc-i440fx-1.4-machine
    pc-i440fx-1.5-machine
    pc-i440fx-1.6-machine
    pc-i440fx-1.7-machine
    pc-i440fx-2.0-machine
    pc-i440fx-2.1-machine
    pc-i440fx-2.10-machine
    pc-i440fx-2.11-machine
    pc-i440fx-2.12-machine
    pc-i440fx-2.2-machine
    pc-i440fx-2.3-machine
    pc-i440fx-2.4-machine
    pc-i440fx-2.5-machine
    pc-i440fx-2.6-machine
    pc-i440fx-2.7-machine
    pc-i440fx-2.8-machine
    pc-i440fx-2.9-machine
    pc-i440fx-3.0-machine
    pc-i440fx-3.1-machine
    pc-i440fx-4.0-machine
    pc-i440fx-4.1-machine
    pc-i440fx-4.2-machine
    pc-i440fx-5.0-machine
    pc-i440fx-5.1-machine
    pc-i440fx-5.2-machine
    pc-i440fx-6.0-machine
    pc-q35-2.10-machine
    pc-q35-2.11-machine
    pc-q35-2.12-machine
    pc-q35-2.4-machine
    pc-q35-2.5-machine
    pc-q35-2.6-machine
    pc-q35-2.7-machine
    pc-q35-2.8-machine
    pc-q35-2.9-machine
    pc-q35-3.0-machine
    pc-q35-3.1-machine
    pc-q35-4.0-machine
    pc-q35-4.0.1-machine
    pc-q35-4.1-machine
    pc-q35-4.2-machine
    pc-q35-5.0-machine
    pc-q35-5.1-machine
    pc-q35-5.2-machine
    pc-q35-6.0-machine
    power10_v1.0-pnv-chip
    power10_v1.0-powernv-cpu-core
    power10_v1.0-powerpc64-cpu
    power10_v1.0-spapr-cpu-core
    power5+_v2.1-powerpc64-cpu
    power5+_v2.1-spapr-cpu-core
    power7+_v2.1-powerpc64-cpu
    power7+_v2.1-spapr-cpu-core
    power7_v2.3-powerpc64-cpu
    power7_v2.3-spapr-cpu-core
    power8_v2.0-pnv-chip
    power8_v2.0-powernv-cpu-core
    power8_v2.0-powerpc64-cpu
    power8_v2.0-spapr-cpu-core
    power8e_v2.1-pnv-chip
    power8e_v2.1-powernv-cpu-core
    power8e_v2.1-powerpc64-cpu
    power8e_v2.1-spapr-cpu-core
    power8nvl_v1.0-pnv-chip
    power8nvl_v1.0-powernv-cpu-core
    power8nvl_v1.0-powerpc64-cpu
    power8nvl_v1.0-spapr-cpu-core
    power9_v1.0-powerpc64-cpu
    power9_v1.0-spapr-cpu-core
    power9_v2.0-pnv-chip
    power9_v2.0-powernv-cpu-core
    power9_v2.0-powerpc64-cpu
    power9_v2.0-spapr-cpu-core
    pseries-2.1-machine
    pseries-2.10-machine
    pseries-2.11-machine
    pseries-2.12-machine
    pseries-2.12-sxxm-machine
    pseries-2.2-machine
    pseries-2.3-machine
    pseries-2.4-machine
    pseries-2.5-machine
    pseries-2.6-machine
    pseries-2.7-machine
    pseries-2.8-machine
    pseries-2.9-machine
    pseries-3.0-machine
    pseries-3.1-machine
    pseries-4.0-machine
    pseries-4.1-machine
    pseries-4.2-machine
    pseries-5.0-machine
    pseries-5.1-machine
    pseries-5.2-machine
    pseries-6.0-machine
    qemu:dummy
    qemu:iommu-memory-region
    qemu:memory-region
    riscv.hart_array
    riscv.lowrisc.ibex.soc
    riscv.sifive.clint
    riscv.sifive.e.prci
    riscv.sifive.e.soc
    riscv.sifive.plic
    riscv.sifive.test
    riscv.sifive.u.otp
    riscv.sifive.u.prci
    riscv.sifive.u.soc
    s390-ccw-virtio-2.10-machine
    s390-ccw-virtio-2.11-machine
    s390-ccw-virtio-2.12-machine
    s390-ccw-virtio-2.4-machine
    s390-ccw-virtio-2.5-machine
    s390-ccw-virtio-2.6-machine
    s390-ccw-virtio-2.7-machine
    s390-ccw-virtio-2.8-machine
    s390-ccw-virtio-2.9-machine
    s390-ccw-virtio-3.0-machine
    s390-ccw-virtio-3.1-machine
    s390-ccw-virtio-4.0-machine
    s390-ccw-virtio-4.1-machine
    s390-ccw-virtio-4.2-machine
    s390-ccw-virtio-5.0-machine
    s390-ccw-virtio-5.1-machine
    s390-ccw-virtio-5.2-machine
    s390-ccw-virtio-6.0-machine
    sifive.pdma
    sifive_soc.gpio
    virt-2.10-machine
    virt-2.11-machine
    virt-2.12-machine
    virt-2.6-machine
    virt-2.7-machine
    virt-2.8-machine
    virt-2.9-machine
    virt-3.0-machine
    virt-3.1-machine
    virt-4.0-machine
    virt-4.1-machine
    virt-4.2-machine
    virt-5.0-machine
    virt-5.1-machine
    virt-5.2-machine
    virt-6.0-machine
    xenfv-3.1-machine
    xenfv-4.2-machine
    xlnx-zynmp.rtc
    xlnx.axi-dma
    xlnx.axi-ethernet
    xlnx.dpdma
    xlnx.pmu_io_intc
    xlnx.ps7-dev-cfg
    xlnx.ps7-qspi
    xlnx.ps7-spi
    xlnx.usmp-gqspi
    xlnx.v-dp
    xlnx.versal-usb2
    xlnx.versal-usb2-ctrl-regs
    xlnx.xps-ethernetlite
    xlnx.xps-intc
    xlnx.xps-spi
    xlnx.xps-timer
    xlnx.xps-uartlite
    xlnx.zdma
    xlnx.zynqmp-can
    xlnx.zynqmp_ipi
    z10BC.2-base-s390x-cpu
    z10BC.2-s390x-cpu
    z10EC.2-base-s390x-cpu
    z10EC.2-s390x-cpu
    z10EC.3-base-s390x-cpu
    z10EC.3-s390x-cpu
    z13.2-base-s390x-cpu
    z13.2-s390x-cpu
    z14.2-base-s390x-cpu
    z14.2-s390x-cpu
    z196.2-base-s390x-cpu
    z196.2-s390x-cpu
    z890.2-base-s390x-cpu
    z890.2-s390x-cpu
    z890.3-base-s390x-cpu
    z890.3-s390x-cpu
    z900.2-base-s390x-cpu
    z900.2-s390x-cpu
    z900.3-base-s390x-cpu
    z900.3-s390x-cpu
    z990.2-base-s390x-cpu
    z990.2-s390x-cpu
    z990.3-base-s390x-cpu
    z990.3-s390x-cpu
    z990.4-base-s390x-cpu
    z990.4-s390x-cpu
    z990.5-base-s390x-cpu
    z990.5-s390x-cpu
    z9BC.2-base-s390x-cpu
    z9BC.2-s390x-cpu
    z9EC.2-base-s390x-cpu
    z9EC.2-s390x-cpu
    z9EC.3-base-s390x-cpu
    z9EC.3-s390x-cpu
    zEC12.2-base-s390x-cpu
    zEC12.2-s390x-cpu

Markus Armbruster (1):
  hw: Replace anti-social QOM type names

 include/hw/arm/armv7m.h                      |  2 +-
 include/hw/arm/fsl-imx25.h                   |  2 +-
 include/hw/arm/fsl-imx31.h                   |  2 +-
 include/hw/arm/fsl-imx6.h                    |  2 +-
 include/hw/arm/fsl-imx6ul.h                  |  2 +-
 include/hw/arm/fsl-imx7.h                    |  2 +-
 include/hw/arm/xlnx-zynqmp.h                 |  2 +-
 include/hw/cris/etraxfs.h                    |  2 +-
 include/hw/i386/ich9.h                       |  2 +-
 include/hw/misc/grlib_ahb_apb_pnp.h          |  4 ++--
 include/hw/misc/zynq-xadc.h                  |  2 +-
 include/hw/register.h                        |  2 +-
 include/hw/sparc/grlib.h                     |  6 +++---
 hw/arm/xilinx_zynq.c                         |  2 +-
 hw/audio/cs4231.c                            |  2 +-
 hw/block/fdc.c                               |  4 ++--
 hw/char/etraxfs_ser.c                        |  2 +-
 hw/cris/axis_dev88.c                         |  6 +++---
 hw/display/tcx.c                             |  2 +-
 hw/intc/etraxfs_pic.c                        |  2 +-
 hw/microblaze/xlnx-zynqmp-pmu.c              |  2 +-
 hw/misc/zynq_slcr.c                          |  2 +-
 hw/sparc/sun4m.c                             | 12 ++++++------
 hw/timer/etraxfs_timer.c                     |  2 +-
 softmmu/vl.c                                 |  2 +-
 tests/vmstate-static-checker-data/dump1.json |  4 ++--
 tests/vmstate-static-checker-data/dump2.json |  4 ++--
 27 files changed, 40 insertions(+), 40 deletions(-)

-- 
2.26.2


Re: [PATCH RFC 0/1] QOM type names and QAPI
Posted by Markus Armbruster 3 years, 3 months ago
Forgot to mention:

Based-on: <20210125162402.1807394-1-armbru@redhat.com>
[PATCH 0/3] Drop deprecated floppy config & bogus -drive if=T


Re: [PATCH RFC 0/1] QOM type names and QAPI
Posted by Markus Armbruster 3 years, 3 months ago
Markus Armbruster <armbru@redhat.com> writes:

> QAPI has naming rules.  docs/devel/qapi-code-gen.txt:
>
>     === Naming rules and reserved names ===
>
>     All names must begin with a letter, and contain only ASCII letters,
>     digits, hyphen, and underscore.  There are two exceptions: enum values
>     may start with a digit, and names that are downstream extensions (see
>     section Downstream extensions) start with underscore.
>
>     [More on reserved names, upper vs. lower case, '-' vs. '_'...]
>
> The generator enforces the rules.
>
> Naming rules help in at least three ways:
>
> 1. They help with keeping names in interfaces consistent and
>    predictable.
>
> 2. They make avoiding collisions with the users' names in the
>    generator simpler.
>
> 3. They enable quote-less, evolvable syntax.
>
>    For instance, keyval_parse() syntax consists of names, values, and
>    special characters ',', '=', '.'
>
>    Since names cannot contain special characters, there is no need for
>    quoting[*].  Simple.
>
>    Values are unrestricted, but only ',' is special there.  We quote
>    it by doubling.
>
>    Together, we get exactly the same quoting as in QemuOpts.  This is
>    a feature.
>
>    If we ever decice to extend key syntax, we have plenty of special
>    characters to choose from.  This is also a feature.
>
>    Both features rely on naming rules.
>
> QOM has no naming rules whatsoever.  Actual names aren't nearly as bad
> as they could be.  Still, there are plenty of "funny" names.  This
> will become a problem when we
>
> * Switch from QemuOpts to keyval_parse()
>
>   QOM type names must not contain special characters, unless we
>   introduce more quoting.  Which we shouldn't, because the value of
>   special characters in names is negligible compared to the hassle of
>   having to quote them.
>
> * QAPIfy (the compile-time static parts of) QOM
>
>   QOM type names become QAPI enum values.  They must conform to QAPI
>   naming rules.
>
> Adopting QAPI naming rules for QOM type names takes care of both.
>
> Let's review the existing offenders.
>
> 1. We have a few type names containing ',', and one containing ' '.
>    The former require QemuOpts / keyval quoting (double the comma),
>    the latter requires shell quoting.  There is no excuse for making
>    our users remember and do such crap.  PATCH 1 eliminates it.
>
> 2. We have some 550 type names containing '.'.  QAPI's naming rules
>    could be relaxed to accept '.', but keyval_parse()'s can't.

Thinko: keyval_parse() copes.  QOM type names occur as *value*, not as
key.

One more thing on QAPI naming rules.  QAPI names get mapped to (parts
of) C identifiers.  These mappings are not injective.  The basic mapping
is simple: replace characters other than letters and digits by '_'.

This means names distinct QAPI names can clash in C.  Fairly harmless
when the only "other" characters are '-' and '_'.  The more "others" we
permit, the more likely confusing clashes become.  Not a show stopper,
"merely" an issue of ergonomics.

>    Aside: I wish keyval_parse() would use '/' instead of '.', but it's
>    designed to be compatible to the block layer's existing use of
>    dotted keys (shoehorned into QemuOpts).
>
> 3. We have six type names containing '+'.  Four of them also contain
>    '.'.  Naming rules could be relaxed to accept '+'.  I'm not sure
>    it's worthwhile.
>
> 4. We have 19 names starting with a digit.  Three of them also contain
>    '.'.  Leading digit is okay as QAPI enum, not okay as
>    keyval_parse() key fragment.  We can either rename these types, or
>    make keyval_parse() a bit less strict.
>
> Of the type names containing '.' or '+'[**], 293 are CPUs, 107 are
> machines, and 150 are something else.  48 of them can be plugged with
> -device, all s390x or spapr CPUs.
>
> Can we get rid of '.'?
>
> I figure we could keep old names as deprecated aliases if we care.
> Perhaps just the ones that can be plugged with -device.
>
>
> [*] Paolo's "[PATCH 04/25] keyval: accept escaped commas in implied
> option" provides for comma-quoting.  I'm ignoring it here for brevity.
> I assure you it doesn't weaken my argument.
>
> [**] They are:
>     603e_v1.1-powerpc-cpu
[...]


Re: [PATCH RFC 0/1] QOM type names and QAPI
Posted by Peter Maydell 3 years, 3 months ago
On Fri, 29 Jan 2021 at 08:15, Markus Armbruster <armbru@redhat.com> wrote:
> 2. We have some 550 type names containing '.'.  QAPI's naming rules
>    could be relaxed to accept '.', but keyval_parse()'s can't.
>
>    Aside: I wish keyval_parse() would use '/' instead of '.', but it's
>    designed to be compatible to the block layer's existing use of
>    dotted keys (shoehorned into QemuOpts).

> Of the type names containing '.' or '+'[**], 293 are CPUs, 107 are
> machines, and 150 are something else.  48 of them can be plugged with
> -device, all s390x or spapr CPUs.
>
> Can we get rid of '.'?

On this one, my vote would be "no". "Versioned machine names
include the QEMU version number" is pretty well entrenched,
and requiring users to remember that when they want version 4.2
they need to remember some other way of writing it than "4.2"
seems rather unfriendly. And 550 uses of '.' is a lot.

thanks
-- PMM

Re: [PATCH RFC 0/1] QOM type names and QAPI
Posted by Daniel P. Berrangé 3 years, 3 months ago
On Fri, Jan 29, 2021 at 12:01:53PM +0000, Peter Maydell wrote:
> On Fri, 29 Jan 2021 at 08:15, Markus Armbruster <armbru@redhat.com> wrote:
> > 2. We have some 550 type names containing '.'.  QAPI's naming rules
> >    could be relaxed to accept '.', but keyval_parse()'s can't.
> >
> >    Aside: I wish keyval_parse() would use '/' instead of '.', but it's
> >    designed to be compatible to the block layer's existing use of
> >    dotted keys (shoehorned into QemuOpts).
> 
> > Of the type names containing '.' or '+'[**], 293 are CPUs, 107 are
> > machines, and 150 are something else.  48 of them can be plugged with
> > -device, all s390x or spapr CPUs.
> >
> > Can we get rid of '.'?
> 
> On this one, my vote would be "no". "Versioned machine names
> include the QEMU version number" is pretty well entrenched,
> and requiring users to remember that when they want version 4.2
> they need to remember some other way of writing it than "4.2"
> seems rather unfriendly. And 550 uses of '.' is a lot.

We can't make  keyval_parse() accept "/" instead of ".", but can
we make it accept "/" in addition to ".", and then encourage "/"  ?

People simply wouldnt be able to use "." as keyval separator if
they're using typenames containing "." (or would have to escape
the typename.


Regards,
Daniel
-- 
|: https://berrange.com      -o-    https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org         -o-            https://fstop138.berrange.com :|
|: https://entangle-photo.org    -o-    https://www.instagram.com/dberrange :|


Re: [PATCH RFC 0/1] QOM type names and QAPI
Posted by Paolo Bonzini 3 years, 3 months ago
On 29/01/21 13:17, Daniel P. Berrangé wrote:
>> On this one, my vote would be "no". "Versioned machine names
>> include the QEMU version number" is pretty well entrenched,
>> and requiring users to remember that when they want version 4.2
>> they need to remember some other way of writing it than "4.2"
>> seems rather unfriendly. And 550 uses of '.' is a lot.
> We can't make  keyval_parse() accept "/" instead of ".", but can
> we make it accept "/" in addition to ".", and then encourage "/"  ?
> 
> People simply wouldnt be able to use "." as keyval separator if
> they're using typenames containing "." (or would have to escape
> the typename.

'.' is much more common than '/', and is shared by about all programming 
languages that have JSON-ish data structures natively.  So using '/' 
seems decidedly worse to me.

Paolo


Re: [PATCH RFC 0/1] QOM type names and QAPI
Posted by Eduardo Habkost 3 years, 3 months ago
On Fri, Jan 29, 2021 at 02:25:56PM +0100, Paolo Bonzini wrote:
> On 29/01/21 13:17, Daniel P. Berrangé wrote:
> > > On this one, my vote would be "no". "Versioned machine names
> > > include the QEMU version number" is pretty well entrenched,
> > > and requiring users to remember that when they want version 4.2
> > > they need to remember some other way of writing it than "4.2"
> > > seems rather unfriendly. And 550 uses of '.' is a lot.
> > We can't make  keyval_parse() accept "/" instead of ".", but can
> > we make it accept "/" in addition to ".", and then encourage "/"  ?
> > 
> > People simply wouldnt be able to use "." as keyval separator if
> > they're using typenames containing "." (or would have to escape
> > the typename.
> 
> '.' is much more common than '/', and is shared by about all programming
> languages that have JSON-ish data structures natively.  So using '/' seems
> decidedly worse to me.

Worse than what, exactly?

Accepting "/" when "." is ambiguous seems decidedly better than
the following alternatives:
- renaming machine types to names like "q35-5-0"; or
- having to escape "." in the command line.

-- 
Eduardo


Re: [PATCH RFC 0/1] QOM type names and QAPI
Posted by Markus Armbruster 3 years, 2 months ago
Eduardo Habkost <ehabkost@redhat.com> writes:

> On Fri, Jan 29, 2021 at 02:25:56PM +0100, Paolo Bonzini wrote:
>> On 29/01/21 13:17, Daniel P. Berrangé wrote:
>> > > On this one, my vote would be "no". "Versioned machine names
>> > > include the QEMU version number" is pretty well entrenched,
>> > > and requiring users to remember that when they want version 4.2
>> > > they need to remember some other way of writing it than "4.2"
>> > > seems rather unfriendly. And 550 uses of '.' is a lot.
>> > We can't make  keyval_parse() accept "/" instead of ".", but can
>> > we make it accept "/" in addition to ".", and then encourage "/"  ?
>> > 
>> > People simply wouldnt be able to use "." as keyval separator if
>> > they're using typenames containing "." (or would have to escape
>> > the typename.
>> 
>> '.' is much more common than '/', and is shared by about all programming
>> languages that have JSON-ish data structures natively.  So using '/' seems
>> decidedly worse to me.
>
> Worse than what, exactly?
>
> Accepting "/" when "." is ambiguous seems decidedly better than
> the following alternatives:
> - renaming machine types to names like "q35-5-0"; or
> - having to escape "." in the command line.

Yes.

However, the ambiguity arises only when type names occur as key, as I
noted in my followup Message-ID: <875z3g2c1f.fsf@dusky.pond.sub.org>.

I figure we could relax the QAPI enum naming rules to permit '.', with
drawbacks that feel tolerable.  One of them: if we ever manage to put
QAPI enums in a key position, we're screwed :)