All the mail mirrored from lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines
@ 2024-05-01 18:27 Daniel P. Berrangé
  2024-05-01 18:27 ` [PATCH 01/14] include/hw: add helpers for defining versioned machine types Daniel P. Berrangé
                   ` (15 more replies)
  0 siblings, 16 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

Thomas proposed a new deprecation and removal policy for versioned
machine types that would see them liable for deletion after 6 years:

  https://lists.nongnu.org/archive/html/qemu-devel/2024-04/msg04683.html

This suggest was met with broad approval, however, I suggested that we
could take it further and actually mark them deprecated sooner, at the
3 year timeframe, and also fully automate the enablement of the runtime
deprecation warning without developer intervention on every release
cycle.

This series implements my suggestions.

The first patch introduces some helper macros and documents a standard
code pattern for defining versioned machine types across targets.

The next 6 patches convert existing targets with versioned machine
types (arm, s390x, ppc, m68k, i386) to use the new helper macros and
code patterns.

A further patch introduces some helper macros for automating the
handling of deprecation and deletion of versioned machine types.

Two more patches then enable the deprecation and deletion logic
across all versioned machines

Finally we do some cleanup and document the new policy.

........a tangent about VERSION file handling.......

One oddity here, is that during the development and release
candidate phases the automatic logic in this series has an off-by-1
error.

This is because when we, for example, add the "9.1" machine type
versions, the VERSION file is still reporting '9.0.50', and then
'9.0.9{1,2,3,4}'.

IOW, during development and in rc candidates, we fail to deprecate
and delete 1 machine type. We should already have deprecated the
6.1 machine types, but the most recently deprecated is 6.0.
This is pretty harmless since the final release does the right
thing.

I wonder, however, whether we would benefit from changing how we
update the VERSION file.

eg instead of re-using the micro digit to indicate a dev or rc
snapshot, represent those explicitly. eg "9.1.0-dev" and
"9.1.0-rc1", "9.1.0-rc2", etc in VERSION.

We don't use the full QEMU_VERSION in the code in all that many
places. It appears in some help messages for command line tools,
and in QMP query-version response, and in a few other misc places.
At a glance it appears all of those places would easily handle a
tagged version.

For release candidates in particular I think it would be saner
to show the user the actual version the release is about to become,
rather than the previous release's version. This would make the
reported version match the rc tarball naming too which would be
nice.

Anyway, this isn't a blocker for this machine type versioning
proposal, just a thought....

Daniel P. Berrangé (14):
  include/hw: add helpers for defining versioned machine types
  hw/arm: convert 'virt' machine definitions to use new macros
  hw/s390x: convert 'ccw' machine definitions to use new macros
  hw/ppc: convert 'spapr' machine definitions to use new macros
  hw/m68k: convert 'virt' machine definitions to use new macros
  hw/i386: convert 'i440fx' machine definitions to use new macros
  hw/i386: convert 'q35' machine definitions to use new macros
  include/hw: add macros for deprecation & removal of versioned machines
  hw: temporarily disable deletion of versioned machine types
  hw: set deprecation info for all versioned machine types
  hw: skip registration of outdated versioned machine types
  hw/ppc: remove obsolete manual deprecation reason string of spapr
    machines
  hw/i386: remove obsolete manual deprecation reason string of i440fx
    machines
  docs: document special exception for machine type deprecation &
    removal

 docs/about/deprecated.rst  |  12 ++
 hw/arm/virt.c              |  30 +++--
 hw/i386/pc_piix.c          | 252 +++++++++++++++-------------------
 hw/i386/pc_q35.c           | 215 +++++++++++++----------------
 hw/m68k/virt.c             |  53 +++++---
 hw/ppc/spapr.c             |  96 +++++++------
 hw/s390x/s390-virtio-ccw.c |  98 ++++++++------
 include/hw/boards.h        | 268 +++++++++++++++++++++++++++++++++++++
 include/hw/i386/pc.h       |  32 +++++
 9 files changed, 666 insertions(+), 390 deletions(-)

-- 
2.43.0



^ permalink raw reply	[flat|nested] 38+ messages in thread

* [PATCH 01/14] include/hw: add helpers for defining versioned machine types
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 10:34   ` Thomas Huth
  2024-05-02 14:57   ` Eric Blake
  2024-05-01 18:27 ` [PATCH 02/14] hw/arm: convert 'virt' machine definitions to use new macros Daniel P. Berrangé
                   ` (14 subsequent siblings)
  15 siblings, 2 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

The various targets which define versioned machine types have
a bunch of obfuscated macro code for defining unique function
and variable names using string concatenation.

This addes a couple of helpers to improve the clarity of such
code macro.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 include/hw/boards.h | 166 ++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 166 insertions(+)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 2fa800f11a..47ca450fca 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -414,6 +414,172 @@ struct MachineState {
     struct NumaState *numa_state;
 };
 
+/*
+ * The macros which follow are intended to facilitate the
+ * definition of versioned machine types, using a somewhat
+ * similar pattern across targets:
+ *
+ *  #define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
+ *      static void MACHINE_VER_SYM(class_init, virt, __VA_ARGS__)( \
+ *          ObjectClass *oc, \
+ *          void *data) \
+ *      { \
+ *          MachineClass *mc = MACHINE_CLASS(oc); \
+ *          MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
+ *          mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " Virtual Machine"; \
+ *          if (latest) { \
+ *              mc->alias = "virt"; \
+ *          } \
+ *      } \
+ *      static const TypeInfo MACHINE_VER_SYM(info, virt, __VA_ARGS__) = { \
+ *          .name = MACHINE_VER_TYPE_NAME("virt", __VA_ARGS__), \
+ *          .parent = TYPE_VIRT_MACHINE, \
+ *          .class_init = MACHINE_VER_SYM(class_init, virt, __VA_ARGS__), \
+ *      }; \
+ *      static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
+ *      { \
+ *          type_register_static(&MACHINE_VER_SYM(info, virt, __VA_ARGS__)); \
+ *      } \
+ *      type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
+ *
+ * Following this, one (or more) helpers can be added for
+ * whichever scenarios need to be catered for with a machine:
+ *
+ *  // Normal 2 digit, marked as latest eg 'virt-9.0'
+ *  #define DEFINE_VIRT_MACHINE_LATEST(major, minor) \
+ *      DEFINE_VIRT_MACHINE_IMPL(true, major, minor)
+ *
+ *  // Normal 2 digit eg 'virt-9.0'
+ *  #define DEFINE_VIRT_MACHINE(major, minor) \
+ *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor)
+ *
+ *  // Bugfix 3 digit  eg 'virt-9.0.1'
+ *  #define DEFINE_VIRT_MACHINE_BUGFIX(major, minor, micro) \
+ *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor, micro)
+ *
+ *  // Tagged 2 digit  eg 'virt-9.0-extra'
+ *  #define DEFINE_VIRT_MACHINE_TAGGED(major, minor, tag) \
+ *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor, _, tag)
+ *
+ *  // Tagged bugffix 2 digit  eg 'virt-9.0.1-extra'
+ *  #define DEFINE_VIRT_MACHINE_TAGGED(major, minor, micro, tag) \
+ *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor, micro, _, tag)
+ */
+
+#define _MACHINE_VER_PICK(x1, x2, x3, x4, x5, x6, ...) x6
+
+/*
+ * Construct a human targetted machine version string.
+ *
+ * Can be invoked with various signatures
+ *
+ *  MACHINE_VER_STR(sym, prefix, major, minor)
+ *  MACHINE_VER_STR(sym, prefix, major, minor, micro)
+ *  MACHINE_VER_STR(sym, prefix, major, minor, _, tag)
+ *  MACHINE_VER_STR(sym, prefix, major, minor, micro, _, tag)
+ *
+ * Respectively emitting symbols with the format
+ *
+ *   "{major}.{minor}"
+ *   "{major}.{minor}-{tag}"
+ *   "{major}.{minor}.{micro}"
+ *   "{major}.{minor}.{micro}-{tag}"
+ */
+#define _MACHINE_VER_STR2(major, minor) \
+    #major "." #minor
+
+#define _MACHINE_VER_STR3(major, minor, micro) \
+    #major "." #minor "." #micro
+
+#define _MACHINE_VER_STR4(major, minor, _unused_, tag) \
+    #major "." #minor "-" #tag
+
+#define _MACHINE_VER_STR5(major, minor, micro, _unused_, tag) \
+    #major "." #minor "." #micro "-" #tag
+
+#define MACHINE_VER_STR(...) \
+    _MACHINE_VER_PICK(__VA_ARGS__, \
+                      _MACHINE_VER_STR5, \
+                      _MACHINE_VER_STR4, \
+                      _MACHINE_VER_STR3, \
+                      _MACHINE_VER_STR2) (__VA_ARGS__)
+
+
+/*
+ * Construct a QAPI type name for a versioned machine
+ * type
+ *
+ * Can be invoked with various signatures
+ *
+ *  MACHINE_VER_TYPE_NAME(prefix, major, minor)
+ *  MACHINE_VER_TYPE_NAME(prefix, major, minor, micro)
+ *  MACHINE_VER_TYPE_NAME(prefix, major, minor, _, tag)
+ *  MACHINE_VER_TYPE_NAME(prefix, major, minor, micro, _, tag)
+ *
+ * Respectively emitting symbols with the format
+ *
+ *   "{prefix}-{major}.{minor}"
+ *   "{prefix}-{major}.{minor}.{micro}"
+ *   "{prefix}-{major}.{minor}-{tag}"
+ *   "{prefix}-{major}.{minor}.{micro}-{tag}"
+ */
+#define _MACHINE_VER_TYPE_NAME2(prefix, major, minor)   \
+    prefix "-" #major "." #minor TYPE_MACHINE_SUFFIX
+
+#define _MACHINE_VER_TYPE_NAME3(prefix, major, minor, micro) \
+    prefix "-" #major "." #minor "." #micro TYPE_MACHINE_SUFFIX
+
+#define _MACHINE_VER_TYPE_NAME4(prefix, major, minor, _unused_, tag) \
+    prefix "-" #major "." #minor "-" #tag TYPE_MACHINE_SUFFIX
+
+#define _MACHINE_VER_TYPE_NAME5(prefix, major, minor, micro, _unused_, tag) \
+    prefix "-" #major "." #minor "." #micro "-" #tag TYPE_MACHINE_SUFFIX
+
+#define MACHINE_VER_TYPE_NAME(prefix, ...) \
+    _MACHINE_VER_PICK(__VA_ARGS__, \
+                      _MACHINE_VER_TYPE_NAME5, \
+                      _MACHINE_VER_TYPE_NAME4, \
+                      _MACHINE_VER_TYPE_NAME3, \
+                      _MACHINE_VER_TYPE_NAME2) (prefix, __VA_ARGS__)
+
+/*
+ * Construct a name for a versioned machine type that is
+ * suitable for use as a C symbol (function/variable/etc).
+ *
+ * Can be invoked with various signatures
+ *
+ *  MACHINE_VER_SYM(sym, prefix, major, minor)
+ *  MACHINE_VER_SYM(sym, prefix, major, minor, micro)
+ *  MACHINE_VER_SYM(sym, prefix, major, minor, _, tag)
+ *  MACHINE_VER_SYM(sym, prefix, major, minor, micro, _, tag)
+ *
+ * Respectively emitting symbols with the format
+ *
+ *   {prefix}_machine_{major}_{minor}_{sym}
+ *   {prefix}_machine_{major}_{minor}_{micro}_{sym}
+ *   {prefix}_machine_{major}_{minor}_{tag}_{sym}
+ *   {prefix}_machine_{major}_{minor}_{micro}_{tag}_{sym}
+ */
+#define _MACHINE_VER_SYM2(sym, prefix, major, minor) \
+    prefix ## _machine_ ## major ## _ ## minor ## _ ## sym
+
+#define _MACHINE_VER_SYM3(sym, prefix, major, minor, micro) \
+    prefix ## _machine_ ## major ## _ ## minor ## _ ## micro ## _ ## sym
+
+#define _MACHINE_VER_SYM4(sym, prefix, major, minor, _unused_, tag) \
+    prefix ## _machine_ ## major ## _ ## minor ## _ ## tag ## _ ## sym
+
+#define _MACHINE_VER_SYM5(sym, prefix, major, minor, micro, _unused_, tag) \
+    prefix ## _machine_ ## major ## _ ## minor ## _ ## micro ## _ ## tag ## _ ## sym
+
+#define MACHINE_VER_SYM(sym, prefix, ...) \
+    _MACHINE_VER_PICK(__VA_ARGS__, \
+                      _MACHINE_VER_SYM5, \
+                      _MACHINE_VER_SYM4, \
+                      _MACHINE_VER_SYM3, \
+                      _MACHINE_VER_SYM2) (sym, prefix, __VA_ARGS__)
+
+
 #define DEFINE_MACHINE(namestr, machine_initfn) \
     static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
     { \
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 02/14] hw/arm: convert 'virt' machine definitions to use new macros
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
  2024-05-01 18:27 ` [PATCH 01/14] include/hw: add helpers for defining versioned machine types Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 12:11   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 03/14] hw/s390x: convert 'ccw' " Daniel P. Berrangé
                   ` (13 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

This changes the DEFINE_VIRT_MACHINE macro to use the common
helpers for constructing versioned symbol names and strings,
bringing greater consistency across targets.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/arm/virt.c | 28 +++++++++++++++-------------
 1 file changed, 15 insertions(+), 13 deletions(-)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 3c93c0c0a6..24b104dfa7 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -101,33 +101,35 @@ static void arm_virt_compat_set(MachineClass *mc)
                      arm_virt_compat_len);
 }
 
-#define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \
-    static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
-                                                    void *data) \
+#define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
+    static void MACHINE_VER_SYM(class_init, virt, __VA_ARGS__)( \
+        ObjectClass *oc, \
+        void *data) \
     { \
         MachineClass *mc = MACHINE_CLASS(oc); \
         arm_virt_compat_set(mc); \
-        virt_machine_##major##_##minor##_options(mc); \
-        mc->desc = "QEMU " # major "." # minor " ARM Virtual Machine"; \
+        MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
+        mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " ARM Virtual Machine"; \
         if (latest) { \
             mc->alias = "virt"; \
         } \
     } \
-    static const TypeInfo machvirt_##major##_##minor##_info = { \
-        .name = MACHINE_TYPE_NAME("virt-" # major "." # minor), \
+    static const TypeInfo MACHINE_VER_SYM(info, virt, __VA_ARGS__) = \
+    { \
+        .name = MACHINE_VER_TYPE_NAME("virt", __VA_ARGS__), \
         .parent = TYPE_VIRT_MACHINE, \
-        .class_init = virt_##major##_##minor##_class_init, \
+        .class_init = MACHINE_VER_SYM(class_init, virt, __VA_ARGS__), \
     }; \
-    static void machvirt_machine_##major##_##minor##_init(void) \
+    static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
     { \
-        type_register_static(&machvirt_##major##_##minor##_info); \
+        type_register_static(&MACHINE_VER_SYM(info, virt, __VA_ARGS__)); \
     } \
-    type_init(machvirt_machine_##major##_##minor##_init);
+    type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
 
 #define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor) \
-    DEFINE_VIRT_MACHINE_LATEST(major, minor, true)
+    DEFINE_VIRT_MACHINE_IMPL(true, major, minor)
 #define DEFINE_VIRT_MACHINE(major, minor) \
-    DEFINE_VIRT_MACHINE_LATEST(major, minor, false)
+    DEFINE_VIRT_MACHINE_IMPL(false, major, minor)
 
 
 /* Number of external interrupt lines to configure the GIC with */
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 03/14] hw/s390x: convert 'ccw' machine definitions to use new macros
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
  2024-05-01 18:27 ` [PATCH 01/14] include/hw: add helpers for defining versioned machine types Daniel P. Berrangé
  2024-05-01 18:27 ` [PATCH 02/14] hw/arm: convert 'virt' machine definitions to use new macros Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 11:12   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 04/14] hw/ppc: convert 'spapr' " Daniel P. Berrangé
                   ` (12 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

This changes the DEFINE_CCW_MACHINE macro to use the common
helpers for constructing versioned symbol names and strings,
bringing greater consistency across targets.

The added benefit is that it avoids the need to repeat the
version number twice in two different formats in the calls
to DEFINE_CCW_MACHINE.

A DEFINE_CCW_MACHINE_AS_LATEST helper is added so that it
is not required to pass 'false' for every single historical
machine type.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/s390x/s390-virtio-ccw.c | 96 +++++++++++++++++++++-----------------
 1 file changed, 53 insertions(+), 43 deletions(-)

diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 4dcc213820..9324fecdca 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -15,6 +15,7 @@
 #include "qapi/error.h"
 #include "exec/ram_addr.h"
 #include "exec/confidential-guest-support.h"
+#include "hw/boards.h"
 #include "hw/s390x/s390-virtio-hcall.h"
 #include "hw/s390x/sclp.h"
 #include "hw/s390x/s390_flic.h"
@@ -832,35 +833,44 @@ bool css_migration_enabled(void)
     return get_machine_class()->css_migration_enabled;
 }
 
-#define DEFINE_CCW_MACHINE(suffix, verstr, latest)                            \
-    static void ccw_machine_##suffix##_class_init(ObjectClass *oc,            \
-                                                  void *data)                 \
+#define DEFINE_CCW_MACHINE_IMPL(latest, ...)                                  \
+    static void MACHINE_VER_SYM(class_init, ccw, __VA_ARGS__)(                \
+        ObjectClass *oc,                                                      \
+        void *data)                                                           \
     {                                                                         \
         MachineClass *mc = MACHINE_CLASS(oc);                                 \
-        ccw_machine_##suffix##_class_options(mc);                             \
-        mc->desc = "Virtual s390x machine (version " verstr ")";              \
+        MACHINE_VER_SYM(class_options, ccw, __VA_ARGS__)(mc);                 \
+        mc->desc = "Virtual s390x machine (version " MACHINE_VER_STR(__VA_ARGS__) ")"; \
         if (latest) {                                                         \
             mc->alias = "s390-ccw-virtio";                                    \
             mc->is_default = true;                                            \
         }                                                                     \
     }                                                                         \
-    static void ccw_machine_##suffix##_instance_init(Object *obj)             \
+    static void MACHINE_VER_SYM(instance_init, ccw, __VA_ARGS__)(Object *obj) \
     {                                                                         \
         MachineState *machine = MACHINE(obj);                                 \
-        current_mc = S390_CCW_MACHINE_CLASS(MACHINE_GET_CLASS(machine));          \
-        ccw_machine_##suffix##_instance_options(machine);                     \
+        current_mc = S390_CCW_MACHINE_CLASS(MACHINE_GET_CLASS(machine));      \
+        MACHINE_VER_SYM(instance_options, ccw, __VA_ARGS__)(machine);         \
     }                                                                         \
-    static const TypeInfo ccw_machine_##suffix##_info = {                     \
-        .name = MACHINE_TYPE_NAME("s390-ccw-virtio-" verstr),                 \
+    static const TypeInfo MACHINE_VER_SYM(info, ccw, __VA_ARGS__) =           \
+    {                                                                         \
+        .name = MACHINE_VER_TYPE_NAME("s390-ccw-virtio", __VA_ARGS__),        \
         .parent = TYPE_S390_CCW_MACHINE,                                      \
-        .class_init = ccw_machine_##suffix##_class_init,                      \
-        .instance_init = ccw_machine_##suffix##_instance_init,                \
+        .class_init = MACHINE_VER_SYM(class_init, ccw, __VA_ARGS__),          \
+        .instance_init = MACHINE_VER_SYM(instance_init, ccw, __VA_ARGS__),    \
     };                                                                        \
-    static void ccw_machine_register_##suffix(void)                           \
+    static void MACHINE_VER_SYM(register, ccw, __VA_ARGS__)(void)             \
     {                                                                         \
-        type_register_static(&ccw_machine_##suffix##_info);                   \
+        type_register_static(&MACHINE_VER_SYM(info, ccw, __VA_ARGS__));       \
     }                                                                         \
-    type_init(ccw_machine_register_##suffix)
+    type_init(MACHINE_VER_SYM(register, ccw, __VA_ARGS__))
+
+#define DEFINE_CCW_MACHINE_AS_LATEST(major, minor) \
+    DEFINE_CCW_MACHINE_IMPL(true, major, minor)
+
+#define DEFINE_CCW_MACHINE(major, minor) \
+    DEFINE_CCW_MACHINE_IMPL(false, major, minor)
+
 
 static void ccw_machine_9_1_instance_options(MachineState *machine)
 {
@@ -869,7 +879,7 @@ static void ccw_machine_9_1_instance_options(MachineState *machine)
 static void ccw_machine_9_1_class_options(MachineClass *mc)
 {
 }
-DEFINE_CCW_MACHINE(9_1, "9.1", true);
+DEFINE_CCW_MACHINE_AS_LATEST(9, 1);
 
 static void ccw_machine_9_0_instance_options(MachineState *machine)
 {
@@ -881,7 +891,7 @@ static void ccw_machine_9_0_class_options(MachineClass *mc)
     ccw_machine_9_1_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_9_0, hw_compat_9_0_len);
 }
-DEFINE_CCW_MACHINE(9_0, "9.0", false);
+DEFINE_CCW_MACHINE(9, 0);
 
 static void ccw_machine_8_2_instance_options(MachineState *machine)
 {
@@ -893,7 +903,7 @@ static void ccw_machine_8_2_class_options(MachineClass *mc)
     ccw_machine_9_0_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_8_2, hw_compat_8_2_len);
 }
-DEFINE_CCW_MACHINE(8_2, "8.2", false);
+DEFINE_CCW_MACHINE(8, 2);
 
 static void ccw_machine_8_1_instance_options(MachineState *machine)
 {
@@ -907,7 +917,7 @@ static void ccw_machine_8_1_class_options(MachineClass *mc)
     mc->smp_props.drawers_supported = false;
     mc->smp_props.books_supported = false;
 }
-DEFINE_CCW_MACHINE(8_1, "8.1", false);
+DEFINE_CCW_MACHINE(8, 1);
 
 static void ccw_machine_8_0_instance_options(MachineState *machine)
 {
@@ -919,7 +929,7 @@ static void ccw_machine_8_0_class_options(MachineClass *mc)
     ccw_machine_8_1_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_8_0, hw_compat_8_0_len);
 }
-DEFINE_CCW_MACHINE(8_0, "8.0", false);
+DEFINE_CCW_MACHINE(8, 0);
 
 static void ccw_machine_7_2_instance_options(MachineState *machine)
 {
@@ -931,7 +941,7 @@ static void ccw_machine_7_2_class_options(MachineClass *mc)
     ccw_machine_8_0_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_7_2, hw_compat_7_2_len);
 }
-DEFINE_CCW_MACHINE(7_2, "7.2", false);
+DEFINE_CCW_MACHINE(7, 2);
 
 static void ccw_machine_7_1_instance_options(MachineState *machine)
 {
@@ -955,7 +965,7 @@ static void ccw_machine_7_1_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
     s390mc->max_threads = S390_MAX_CPUS;
 }
-DEFINE_CCW_MACHINE(7_1, "7.1", false);
+DEFINE_CCW_MACHINE(7, 1);
 
 static void ccw_machine_7_0_instance_options(MachineState *machine)
 {
@@ -970,7 +980,7 @@ static void ccw_machine_7_0_class_options(MachineClass *mc)
     ccw_machine_7_1_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_7_0, hw_compat_7_0_len);
 }
-DEFINE_CCW_MACHINE(7_0, "7.0", false);
+DEFINE_CCW_MACHINE(7, 0);
 
 static void ccw_machine_6_2_instance_options(MachineState *machine)
 {
@@ -985,7 +995,7 @@ static void ccw_machine_6_2_class_options(MachineClass *mc)
     ccw_machine_7_0_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_6_2, hw_compat_6_2_len);
 }
-DEFINE_CCW_MACHINE(6_2, "6.2", false);
+DEFINE_CCW_MACHINE(6, 2);
 
 static void ccw_machine_6_1_instance_options(MachineState *machine)
 {
@@ -1003,7 +1013,7 @@ static void ccw_machine_6_1_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_6_1, hw_compat_6_1_len);
     mc->smp_props.prefer_sockets = true;
 }
-DEFINE_CCW_MACHINE(6_1, "6.1", false);
+DEFINE_CCW_MACHINE(6, 1);
 
 static void ccw_machine_6_0_instance_options(MachineState *machine)
 {
@@ -1018,7 +1028,7 @@ static void ccw_machine_6_0_class_options(MachineClass *mc)
     ccw_machine_6_1_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_6_0, hw_compat_6_0_len);
 }
-DEFINE_CCW_MACHINE(6_0, "6.0", false);
+DEFINE_CCW_MACHINE(6, 0);
 
 static void ccw_machine_5_2_instance_options(MachineState *machine)
 {
@@ -1030,7 +1040,7 @@ static void ccw_machine_5_2_class_options(MachineClass *mc)
     ccw_machine_6_0_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
 }
-DEFINE_CCW_MACHINE(5_2, "5.2", false);
+DEFINE_CCW_MACHINE(5, 2);
 
 static void ccw_machine_5_1_instance_options(MachineState *machine)
 {
@@ -1042,7 +1052,7 @@ static void ccw_machine_5_1_class_options(MachineClass *mc)
     ccw_machine_5_2_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_5_1, hw_compat_5_1_len);
 }
-DEFINE_CCW_MACHINE(5_1, "5.1", false);
+DEFINE_CCW_MACHINE(5, 1);
 
 static void ccw_machine_5_0_instance_options(MachineState *machine)
 {
@@ -1054,7 +1064,7 @@ static void ccw_machine_5_0_class_options(MachineClass *mc)
     ccw_machine_5_1_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_5_0, hw_compat_5_0_len);
 }
-DEFINE_CCW_MACHINE(5_0, "5.0", false);
+DEFINE_CCW_MACHINE(5, 0);
 
 static void ccw_machine_4_2_instance_options(MachineState *machine)
 {
@@ -1067,7 +1077,7 @@ static void ccw_machine_4_2_class_options(MachineClass *mc)
     mc->fixup_ram_size = s390_fixup_ram_size;
     compat_props_add(mc->compat_props, hw_compat_4_2, hw_compat_4_2_len);
 }
-DEFINE_CCW_MACHINE(4_2, "4.2", false);
+DEFINE_CCW_MACHINE(4, 2);
 
 static void ccw_machine_4_1_instance_options(MachineState *machine)
 {
@@ -1081,7 +1091,7 @@ static void ccw_machine_4_1_class_options(MachineClass *mc)
     ccw_machine_4_2_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_4_1, hw_compat_4_1_len);
 }
-DEFINE_CCW_MACHINE(4_1, "4.1", false);
+DEFINE_CCW_MACHINE(4, 1);
 
 static void ccw_machine_4_0_instance_options(MachineState *machine)
 {
@@ -1095,7 +1105,7 @@ static void ccw_machine_4_0_class_options(MachineClass *mc)
     ccw_machine_4_1_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_4_0, hw_compat_4_0_len);
 }
-DEFINE_CCW_MACHINE(4_0, "4.0", false);
+DEFINE_CCW_MACHINE(4, 0);
 
 static void ccw_machine_3_1_instance_options(MachineState *machine)
 {
@@ -1111,7 +1121,7 @@ static void ccw_machine_3_1_class_options(MachineClass *mc)
     ccw_machine_4_0_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_3_1, hw_compat_3_1_len);
 }
-DEFINE_CCW_MACHINE(3_1, "3.1", false);
+DEFINE_CCW_MACHINE(3, 1);
 
 static void ccw_machine_3_0_instance_options(MachineState *machine)
 {
@@ -1126,7 +1136,7 @@ static void ccw_machine_3_0_class_options(MachineClass *mc)
     ccw_machine_3_1_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_3_0, hw_compat_3_0_len);
 }
-DEFINE_CCW_MACHINE(3_0, "3.0", false);
+DEFINE_CCW_MACHINE(3, 0);
 
 static void ccw_machine_2_12_instance_options(MachineState *machine)
 {
@@ -1140,7 +1150,7 @@ static void ccw_machine_2_12_class_options(MachineClass *mc)
     ccw_machine_3_0_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_2_12, hw_compat_2_12_len);
 }
-DEFINE_CCW_MACHINE(2_12, "2.12", false);
+DEFINE_CCW_MACHINE(2, 12);
 
 static void ccw_machine_2_11_instance_options(MachineState *machine)
 {
@@ -1161,7 +1171,7 @@ static void ccw_machine_2_11_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_2_11, hw_compat_2_11_len);
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 }
-DEFINE_CCW_MACHINE(2_11, "2.11", false);
+DEFINE_CCW_MACHINE(2, 11);
 
 static void ccw_machine_2_10_instance_options(MachineState *machine)
 {
@@ -1173,7 +1183,7 @@ static void ccw_machine_2_10_class_options(MachineClass *mc)
     ccw_machine_2_11_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_2_10, hw_compat_2_10_len);
 }
-DEFINE_CCW_MACHINE(2_10, "2.10", false);
+DEFINE_CCW_MACHINE(2, 10);
 
 static void ccw_machine_2_9_instance_options(MachineState *machine)
 {
@@ -1197,7 +1207,7 @@ static void ccw_machine_2_9_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
     s390mc->css_migration_enabled = false;
 }
-DEFINE_CCW_MACHINE(2_9, "2.9", false);
+DEFINE_CCW_MACHINE(2, 9);
 
 static void ccw_machine_2_8_instance_options(MachineState *machine)
 {
@@ -1214,7 +1224,7 @@ static void ccw_machine_2_8_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_2_8, hw_compat_2_8_len);
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 }
-DEFINE_CCW_MACHINE(2_8, "2.8", false);
+DEFINE_CCW_MACHINE(2, 8);
 
 static void ccw_machine_2_7_instance_options(MachineState *machine)
 {
@@ -1229,7 +1239,7 @@ static void ccw_machine_2_7_class_options(MachineClass *mc)
     ccw_machine_2_8_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_2_7, hw_compat_2_7_len);
 }
-DEFINE_CCW_MACHINE(2_7, "2.7", false);
+DEFINE_CCW_MACHINE(2, 7);
 
 static void ccw_machine_2_6_instance_options(MachineState *machine)
 {
@@ -1249,7 +1259,7 @@ static void ccw_machine_2_6_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_2_6, hw_compat_2_6_len);
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 }
-DEFINE_CCW_MACHINE(2_6, "2.6", false);
+DEFINE_CCW_MACHINE(2, 6);
 
 static void ccw_machine_2_5_instance_options(MachineState *machine)
 {
@@ -1261,7 +1271,7 @@ static void ccw_machine_2_5_class_options(MachineClass *mc)
     ccw_machine_2_6_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_2_5, hw_compat_2_5_len);
 }
-DEFINE_CCW_MACHINE(2_5, "2.5", false);
+DEFINE_CCW_MACHINE(2, 5);
 
 static void ccw_machine_2_4_instance_options(MachineState *machine)
 {
@@ -1286,7 +1296,7 @@ static void ccw_machine_2_4_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_2_4, hw_compat_2_4_len);
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 }
-DEFINE_CCW_MACHINE(2_4, "2.4", false);
+DEFINE_CCW_MACHINE(2, 4);
 
 static void ccw_machine_register_types(void)
 {
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 04/14] hw/ppc: convert 'spapr' machine definitions to use new macros
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (2 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 03/14] hw/s390x: convert 'ccw' " Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 11:57   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 05/14] hw/m68k: convert 'virt' " Daniel P. Berrangé
                   ` (11 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

This changes the DEFINE_SPAPR_MACHINE macro to use the common
helpers for constructing versioned symbol names and strings,
bringing greater consistency across targets.

The added benefit is that it avoids the need to repeat the
version number twice in two different formats in the calls
to DEFINE_SPAPR_MACHINE.

A DEFINE_SPAPR_MACHINE_AS_LATEST helper is added so that it
is not required to pass 'false' for every single historical
machine type.

Due to the odd-ball '2.12-sxxm' machine type version, this
commit introduces a DEFINE_SPAPR_MACHINE_TAGGED helper to
allow defining of "tagged" machine types which have a string
suffix.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/ppc/spapr.c | 93 +++++++++++++++++++++++++++-----------------------
 1 file changed, 51 insertions(+), 42 deletions(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index d2d1e310a3..4ab331da57 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4788,26 +4788,35 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
     mc->is_default = true;
 }
 
-#define DEFINE_SPAPR_MACHINE(suffix, verstr, latest)                 \
-    static void spapr_machine_##suffix##_class_init(ObjectClass *oc, \
-                                                    void *data)      \
+#define DEFINE_SPAPR_MACHINE_IMPL(latest, ...)                       \
+    static void MACHINE_VER_SYM(class_init, spapr, __VA_ARGS__)(     \
+        ObjectClass *oc,                                             \
+        void *data)                                                  \
     {                                                                \
         MachineClass *mc = MACHINE_CLASS(oc);                        \
-        spapr_machine_##suffix##_class_options(mc);                  \
+        MACHINE_VER_SYM(class_options, spapr, __VA_ARGS__)(mc);      \
         if (latest) {                                                \
             spapr_machine_latest_class_options(mc);                  \
         }                                                            \
     }                                                                \
-    static const TypeInfo spapr_machine_##suffix##_info = {          \
-        .name = MACHINE_TYPE_NAME("pseries-" verstr),                \
+    static const TypeInfo MACHINE_VER_SYM(info, spapr, __VA_ARGS__) = \
+    {                                                                \
+        .name = MACHINE_VER_TYPE_NAME("pseries", __VA_ARGS__),       \
         .parent = TYPE_SPAPR_MACHINE,                                \
-        .class_init = spapr_machine_##suffix##_class_init,           \
+        .class_init = MACHINE_VER_SYM(class_init, spapr, __VA_ARGS__), \
     };                                                               \
-    static void spapr_machine_register_##suffix(void)                \
+    static void MACHINE_VER_SYM(register, spapr, __VA_ARGS__)(void)  \
     {                                                                \
-        type_register(&spapr_machine_##suffix##_info);               \
+        type_register(&MACHINE_VER_SYM(info, spapr, __VA_ARGS__));   \
     }                                                                \
-    type_init(spapr_machine_register_##suffix)
+    type_init(MACHINE_VER_SYM(register, spapr, __VA_ARGS__))
+
+#define DEFINE_SPAPR_MACHINE_AS_LATEST(major, minor) \
+    DEFINE_SPAPR_MACHINE_IMPL(true, major, minor)
+#define DEFINE_SPAPR_MACHINE(major, minor) \
+    DEFINE_SPAPR_MACHINE_IMPL(false, major, minor)
+#define DEFINE_SPAPR_MACHINE_TAGGED(major, minor, tag) \
+    DEFINE_SPAPR_MACHINE_IMPL(false, major, minor, _, tag)
 
 /*
  * pseries-9.1
@@ -4817,7 +4826,7 @@ static void spapr_machine_9_1_class_options(MachineClass *mc)
     /* Defaults for the latest behaviour inherited from the base class */
 }
 
-DEFINE_SPAPR_MACHINE(9_1, "9.1", true);
+DEFINE_SPAPR_MACHINE_AS_LATEST(9, 1);
 
 /*
  * pseries-9.0
@@ -4828,7 +4837,7 @@ static void spapr_machine_9_0_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_9_0, hw_compat_9_0_len);
 }
 
-DEFINE_SPAPR_MACHINE(9_0, "9.0", false);
+DEFINE_SPAPR_MACHINE(9, 0);
 
 /*
  * pseries-8.2
@@ -4839,7 +4848,7 @@ static void spapr_machine_8_2_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_8_2, hw_compat_8_2_len);
 }
 
-DEFINE_SPAPR_MACHINE(8_2, "8.2", false);
+DEFINE_SPAPR_MACHINE(8, 2);
 
 /*
  * pseries-8.1
@@ -4850,7 +4859,7 @@ static void spapr_machine_8_1_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_8_1, hw_compat_8_1_len);
 }
 
-DEFINE_SPAPR_MACHINE(8_1, "8.1", false);
+DEFINE_SPAPR_MACHINE(8, 1);
 
 /*
  * pseries-8.0
@@ -4861,7 +4870,7 @@ static void spapr_machine_8_0_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_8_0, hw_compat_8_0_len);
 }
 
-DEFINE_SPAPR_MACHINE(8_0, "8.0", false);
+DEFINE_SPAPR_MACHINE(8, 0);
 
 /*
  * pseries-7.2
@@ -4872,7 +4881,7 @@ static void spapr_machine_7_2_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_7_2, hw_compat_7_2_len);
 }
 
-DEFINE_SPAPR_MACHINE(7_2, "7.2", false);
+DEFINE_SPAPR_MACHINE(7, 2);
 
 /*
  * pseries-7.1
@@ -4883,7 +4892,7 @@ static void spapr_machine_7_1_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_7_1, hw_compat_7_1_len);
 }
 
-DEFINE_SPAPR_MACHINE(7_1, "7.1", false);
+DEFINE_SPAPR_MACHINE(7, 1);
 
 /*
  * pseries-7.0
@@ -4894,7 +4903,7 @@ static void spapr_machine_7_0_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_7_0, hw_compat_7_0_len);
 }
 
-DEFINE_SPAPR_MACHINE(7_0, "7.0", false);
+DEFINE_SPAPR_MACHINE(7, 0);
 
 /*
  * pseries-6.2
@@ -4905,7 +4914,7 @@ static void spapr_machine_6_2_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_6_2, hw_compat_6_2_len);
 }
 
-DEFINE_SPAPR_MACHINE(6_2, "6.2", false);
+DEFINE_SPAPR_MACHINE(6, 2);
 
 /*
  * pseries-6.1
@@ -4920,7 +4929,7 @@ static void spapr_machine_6_1_class_options(MachineClass *mc)
     mc->smp_props.prefer_sockets = true;
 }
 
-DEFINE_SPAPR_MACHINE(6_1, "6.1", false);
+DEFINE_SPAPR_MACHINE(6, 1);
 
 /*
  * pseries-6.0
@@ -4931,7 +4940,7 @@ static void spapr_machine_6_0_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_6_0, hw_compat_6_0_len);
 }
 
-DEFINE_SPAPR_MACHINE(6_0, "6.0", false);
+DEFINE_SPAPR_MACHINE(6, 0);
 
 /*
  * pseries-5.2
@@ -4942,7 +4951,7 @@ static void spapr_machine_5_2_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_5_2, hw_compat_5_2_len);
 }
 
-DEFINE_SPAPR_MACHINE(5_2, "5.2", false);
+DEFINE_SPAPR_MACHINE(5, 2);
 
 /*
  * pseries-5.1
@@ -4956,7 +4965,7 @@ static void spapr_machine_5_1_class_options(MachineClass *mc)
     smc->pre_5_2_numa_associativity = true;
 }
 
-DEFINE_SPAPR_MACHINE(5_1, "5.1", false);
+DEFINE_SPAPR_MACHINE(5, 1);
 
 /*
  * pseries-5.0
@@ -4975,7 +4984,7 @@ static void spapr_machine_5_0_class_options(MachineClass *mc)
     smc->pre_5_1_assoc_refpoints = true;
 }
 
-DEFINE_SPAPR_MACHINE(5_0, "5.0", false);
+DEFINE_SPAPR_MACHINE(5, 0);
 
 /*
  * pseries-4.2
@@ -4992,7 +5001,7 @@ static void spapr_machine_4_2_class_options(MachineClass *mc)
     mc->nvdimm_supported = false;
 }
 
-DEFINE_SPAPR_MACHINE(4_2, "4.2", false);
+DEFINE_SPAPR_MACHINE(4, 2);
 
 /*
  * pseries-4.1
@@ -5012,7 +5021,7 @@ static void spapr_machine_4_1_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 }
 
-DEFINE_SPAPR_MACHINE(4_1, "4.1", false);
+DEFINE_SPAPR_MACHINE(4, 1);
 
 /*
  * pseries-4.0
@@ -5039,7 +5048,7 @@ static void spapr_machine_4_0_class_options(MachineClass *mc)
     smc->pre_4_1_migration = true;
 }
 
-DEFINE_SPAPR_MACHINE(4_0, "4.0", false);
+DEFINE_SPAPR_MACHINE(4, 0);
 
 /*
  * pseries-3.1
@@ -5061,7 +5070,7 @@ static void spapr_machine_3_1_class_options(MachineClass *mc)
     smc->default_caps.caps[SPAPR_CAP_LARGE_DECREMENTER] = SPAPR_CAP_OFF;
 }
 
-DEFINE_SPAPR_MACHINE(3_1, "3.1", false);
+DEFINE_SPAPR_MACHINE(3, 1);
 
 /*
  * pseries-3.0
@@ -5079,7 +5088,7 @@ static void spapr_machine_3_0_class_options(MachineClass *mc)
     smc->irq = &spapr_irq_xics_legacy;
 }
 
-DEFINE_SPAPR_MACHINE(3_0, "3.0", false);
+DEFINE_SPAPR_MACHINE(3, 0);
 
 /*
  * pseries-2.12
@@ -5104,7 +5113,7 @@ static void spapr_machine_2_12_class_options(MachineClass *mc)
     smc->default_caps.caps[SPAPR_CAP_HPT_MAXPAGESIZE] = 0;
 }
 
-DEFINE_SPAPR_MACHINE(2_12, "2.12", false);
+DEFINE_SPAPR_MACHINE(2, 12);
 
 static void spapr_machine_2_12_sxxm_class_options(MachineClass *mc)
 {
@@ -5116,7 +5125,7 @@ static void spapr_machine_2_12_sxxm_class_options(MachineClass *mc)
     smc->default_caps.caps[SPAPR_CAP_IBS] = SPAPR_CAP_FIXED_CCD;
 }
 
-DEFINE_SPAPR_MACHINE(2_12_sxxm, "2.12-sxxm", false);
+DEFINE_SPAPR_MACHINE_TAGGED(2, 12, sxxm);
 
 /*
  * pseries-2.11
@@ -5132,7 +5141,7 @@ static void spapr_machine_2_11_class_options(MachineClass *mc)
     mc->deprecation_reason = "old and not maintained - use a 2.12+ version";
 }
 
-DEFINE_SPAPR_MACHINE(2_11, "2.11", false);
+DEFINE_SPAPR_MACHINE(2, 11);
 
 /*
  * pseries-2.10
@@ -5144,7 +5153,7 @@ static void spapr_machine_2_10_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_2_10, hw_compat_2_10_len);
 }
 
-DEFINE_SPAPR_MACHINE(2_10, "2.10", false);
+DEFINE_SPAPR_MACHINE(2, 10);
 
 /*
  * pseries-2.9
@@ -5164,7 +5173,7 @@ static void spapr_machine_2_9_class_options(MachineClass *mc)
     smc->resize_hpt_default = SPAPR_RESIZE_HPT_DISABLED;
 }
 
-DEFINE_SPAPR_MACHINE(2_9, "2.9", false);
+DEFINE_SPAPR_MACHINE(2, 9);
 
 /*
  * pseries-2.8
@@ -5182,7 +5191,7 @@ static void spapr_machine_2_8_class_options(MachineClass *mc)
     mc->numa_mem_align_shift = 23;
 }
 
-DEFINE_SPAPR_MACHINE(2_8, "2.8", false);
+DEFINE_SPAPR_MACHINE(2, 8);
 
 /*
  * pseries-2.7
@@ -5257,7 +5266,7 @@ static void spapr_machine_2_7_class_options(MachineClass *mc)
     smc->phb_placement = phb_placement_2_7;
 }
 
-DEFINE_SPAPR_MACHINE(2_7, "2.7", false);
+DEFINE_SPAPR_MACHINE(2, 7);
 
 /*
  * pseries-2.6
@@ -5275,7 +5284,7 @@ static void spapr_machine_2_6_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 }
 
-DEFINE_SPAPR_MACHINE(2_6, "2.6", false);
+DEFINE_SPAPR_MACHINE(2, 6);
 
 /*
  * pseries-2.5
@@ -5294,7 +5303,7 @@ static void spapr_machine_2_5_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 }
 
-DEFINE_SPAPR_MACHINE(2_5, "2.5", false);
+DEFINE_SPAPR_MACHINE(2, 5);
 
 /*
  * pseries-2.4
@@ -5309,7 +5318,7 @@ static void spapr_machine_2_4_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_2_4, hw_compat_2_4_len);
 }
 
-DEFINE_SPAPR_MACHINE(2_4, "2.4", false);
+DEFINE_SPAPR_MACHINE(2, 4);
 
 /*
  * pseries-2.3
@@ -5324,7 +5333,7 @@ static void spapr_machine_2_3_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, hw_compat_2_3, hw_compat_2_3_len);
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
 }
-DEFINE_SPAPR_MACHINE(2_3, "2.3", false);
+DEFINE_SPAPR_MACHINE(2, 3);
 
 /*
  * pseries-2.2
@@ -5341,7 +5350,7 @@ static void spapr_machine_2_2_class_options(MachineClass *mc)
     compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
     mc->default_machine_opts = "modern-hotplug-events=off,suppress-vmdesc=on";
 }
-DEFINE_SPAPR_MACHINE(2_2, "2.2", false);
+DEFINE_SPAPR_MACHINE(2, 2);
 
 /*
  * pseries-2.1
@@ -5352,7 +5361,7 @@ static void spapr_machine_2_1_class_options(MachineClass *mc)
     spapr_machine_2_2_class_options(mc);
     compat_props_add(mc->compat_props, hw_compat_2_1, hw_compat_2_1_len);
 }
-DEFINE_SPAPR_MACHINE(2_1, "2.1", false);
+DEFINE_SPAPR_MACHINE(2, 1);
 
 static void spapr_machine_register_types(void)
 {
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 05/14] hw/m68k: convert 'virt' machine definitions to use new macros
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (3 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 04/14] hw/ppc: convert 'spapr' " Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 12:00   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 06/14] hw/i386: convert 'i440fx' " Daniel P. Berrangé
                   ` (10 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

This changes the DEFINE_VIRT_MACHINE macro to use the common
helpers for constructing versioned symbol names and strings,
bringing greater consistency across targets.

A DEFINE_VIRT_MACHINE_AS_LATEST helper is added so that it
is not required to pass 'false' for every single historical
machine type.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/m68k/virt.c | 51 ++++++++++++++++++++++++++++----------------------
 1 file changed, 29 insertions(+), 22 deletions(-)

diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index 09bc9bdfef..cd6ee692f7 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -335,99 +335,106 @@ static void virt_machine_register_types(void)
 
 type_init(virt_machine_register_types)
 
-#define DEFINE_VIRT_MACHINE(major, minor, latest) \
-    static void virt_##major##_##minor##_class_init(ObjectClass *oc, \
-                                                    void *data) \
+#define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
+    static void MACHINE_VER_SYM(class_init, virt, __VA_ARGS__)( \
+        ObjectClass *oc, \
+        void *data) \
     { \
         MachineClass *mc = MACHINE_CLASS(oc); \
-        virt_machine_##major##_##minor##_options(mc); \
-        mc->desc = "QEMU " # major "." # minor " M68K Virtual Machine"; \
+        MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
+        mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " M68K Virtual Machine"; \
         if (latest) { \
             mc->alias = "virt"; \
         } \
     } \
-    static const TypeInfo machvirt_##major##_##minor##_info = { \
-        .name = MACHINE_TYPE_NAME("virt-" # major "." # minor), \
+    static const TypeInfo MACHINE_VER_SYM(info, virt, __VA_ARGS__) = \
+    { \
+        .name = MACHINE_VER_TYPE_NAME("virt", __VA_ARGS__), \
         .parent = MACHINE_TYPE_NAME("virt"), \
-        .class_init = virt_##major##_##minor##_class_init, \
+        .class_init = MACHINE_VER_SYM(class_init, virt, __VA_ARGS__), \
     }; \
-    static void machvirt_machine_##major##_##minor##_init(void) \
+    static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
     { \
-        type_register_static(&machvirt_##major##_##minor##_info); \
+        type_register_static(&MACHINE_VER_SYM(info, virt, __VA_ARGS__)); \
     } \
-    type_init(machvirt_machine_##major##_##minor##_init);
+    type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
+
+#define DEFINE_VIRT_MACHINE_AS_LATEST(major, minor) \
+    DEFINE_VIRT_MACHINE_IMPL(true, major, minor)
+#define DEFINE_VIRT_MACHINE(major, minor) \
+    DEFINE_VIRT_MACHINE_IMPL(false, major, minor)
 
 static void virt_machine_9_1_options(MachineClass *mc)
 {
 }
-DEFINE_VIRT_MACHINE(9, 1, true)
+DEFINE_VIRT_MACHINE_AS_LATEST(9, 1)
 
 static void virt_machine_9_0_options(MachineClass *mc)
 {
     virt_machine_9_1_options(mc);
     compat_props_add(mc->compat_props, hw_compat_9_0, hw_compat_9_0_len);
 }
-DEFINE_VIRT_MACHINE(9, 0, false)
+DEFINE_VIRT_MACHINE(9, 0)
 
 static void virt_machine_8_2_options(MachineClass *mc)
 {
     virt_machine_9_0_options(mc);
     compat_props_add(mc->compat_props, hw_compat_8_2, hw_compat_8_2_len);
 }
-DEFINE_VIRT_MACHINE(8, 2, false)
+DEFINE_VIRT_MACHINE(8, 2)
 
 static void virt_machine_8_1_options(MachineClass *mc)
 {
     virt_machine_8_2_options(mc);
     compat_props_add(mc->compat_props, hw_compat_8_1, hw_compat_8_1_len);
 }
-DEFINE_VIRT_MACHINE(8, 1, false)
+DEFINE_VIRT_MACHINE(8, 1)
 
 static void virt_machine_8_0_options(MachineClass *mc)
 {
     virt_machine_8_1_options(mc);
     compat_props_add(mc->compat_props, hw_compat_8_0, hw_compat_8_0_len);
 }
-DEFINE_VIRT_MACHINE(8, 0, false)
+DEFINE_VIRT_MACHINE(8, 0)
 
 static void virt_machine_7_2_options(MachineClass *mc)
 {
     virt_machine_8_0_options(mc);
     compat_props_add(mc->compat_props, hw_compat_7_2, hw_compat_7_2_len);
 }
-DEFINE_VIRT_MACHINE(7, 2, false)
+DEFINE_VIRT_MACHINE(7, 2)
 
 static void virt_machine_7_1_options(MachineClass *mc)
 {
     virt_machine_7_2_options(mc);
     compat_props_add(mc->compat_props, hw_compat_7_1, hw_compat_7_1_len);
 }
-DEFINE_VIRT_MACHINE(7, 1, false)
+DEFINE_VIRT_MACHINE(7, 1)
 
 static void virt_machine_7_0_options(MachineClass *mc)
 {
     virt_machine_7_1_options(mc);
     compat_props_add(mc->compat_props, hw_compat_7_0, hw_compat_7_0_len);
 }
-DEFINE_VIRT_MACHINE(7, 0, false)
+DEFINE_VIRT_MACHINE(7, 0)
 
 static void virt_machine_6_2_options(MachineClass *mc)
 {
     virt_machine_7_0_options(mc);
     compat_props_add(mc->compat_props, hw_compat_6_2, hw_compat_6_2_len);
 }
-DEFINE_VIRT_MACHINE(6, 2, false)
+DEFINE_VIRT_MACHINE(6, 2)
 
 static void virt_machine_6_1_options(MachineClass *mc)
 {
     virt_machine_6_2_options(mc);
     compat_props_add(mc->compat_props, hw_compat_6_1, hw_compat_6_1_len);
 }
-DEFINE_VIRT_MACHINE(6, 1, false)
+DEFINE_VIRT_MACHINE(6, 1)
 
 static void virt_machine_6_0_options(MachineClass *mc)
 {
     virt_machine_6_1_options(mc);
     compat_props_add(mc->compat_props, hw_compat_6_0, hw_compat_6_0_len);
 }
-DEFINE_VIRT_MACHINE(6, 0, false)
+DEFINE_VIRT_MACHINE(6, 0)
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 06/14] hw/i386: convert 'i440fx' machine definitions to use new macros
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (4 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 05/14] hw/m68k: convert 'virt' " Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-01 18:27 ` [PATCH 07/14] hw/i386: convert 'q35' " Daniel P. Berrangé
                   ` (9 subsequent siblings)
  15 siblings, 0 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

This changes the DEFINE_I440FX_MACHINE macro to use the common
helpers for constructing versioned symbol names and strings,
bringing greater consistency across targets.

The added benefit is that it avoids the need to repeat the
version number thrice in three different formats in the calls
to DEFINE_I440FX_MACHINE.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/i386/pc_piix.c    | 251 +++++++++++++++++++------------------------
 include/hw/i386/pc.h |  30 ++++++
 2 files changed, 138 insertions(+), 143 deletions(-)

diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 8850c49c66..9f92504cc4 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -477,16 +477,13 @@ static void pc_xen_hvm_init(MachineState *machine)
 }
 #endif
 
-#define DEFINE_I440FX_MACHINE(suffix, name, compatfn, optionfn) \
-    static void pc_init_##suffix(MachineState *machine) \
-    { \
-        void (*compat)(MachineState *m) = (compatfn); \
-        if (compat) { \
-            compat(machine); \
-        } \
-        pc_init1(machine, TYPE_I440FX_PCI_DEVICE); \
-    } \
-    DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn)
+static void pc_i440fx_init(MachineState *machine)
+{
+    pc_init1(machine, TYPE_I440FX_PCI_DEVICE);
+}
+
+#define DEFINE_I440FX_MACHINE(major, minor, compatfn) \
+    DEFINE_PC_VER_MACHINE(pc_i440fx, "pc-i440fx", pc_i440fx_init, compatfn, major, minor);
 
 static void pc_i440fx_machine_options(MachineClass *m)
 {
@@ -513,19 +510,18 @@ static void pc_i440fx_machine_options(MachineClass *m)
                                      "Use a different south bridge than PIIX3");
 }
 
-static void pc_i440fx_9_1_machine_options(MachineClass *m)
+static void pc_i440fx_machine_9_1_options(MachineClass *m)
 {
     pc_i440fx_machine_options(m);
     m->alias = "pc";
     m->is_default = true;
 }
 
-DEFINE_I440FX_MACHINE(v9_1, "pc-i440fx-9.1", NULL,
-                      pc_i440fx_9_1_machine_options);
+DEFINE_I440FX_MACHINE(9, 1, NULL);
 
-static void pc_i440fx_9_0_machine_options(MachineClass *m)
+static void pc_i440fx_machine_9_0_options(MachineClass *m)
 {
-    pc_i440fx_9_1_machine_options(m);
+    pc_i440fx_machine_9_1_options(m);
     m->alias = NULL;
     m->is_default = false;
 
@@ -533,14 +529,13 @@ static void pc_i440fx_9_0_machine_options(MachineClass *m)
     compat_props_add(m->compat_props, pc_compat_9_0, pc_compat_9_0_len);
 }
 
-DEFINE_I440FX_MACHINE(v9_0, "pc-i440fx-9.0", NULL,
-                      pc_i440fx_9_0_machine_options);
+DEFINE_I440FX_MACHINE(9, 0, NULL);
 
-static void pc_i440fx_8_2_machine_options(MachineClass *m)
+static void pc_i440fx_machine_8_2_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_9_0_machine_options(m);
+    pc_i440fx_machine_9_0_options(m);
 
     compat_props_add(m->compat_props, hw_compat_8_2, hw_compat_8_2_len);
     compat_props_add(m->compat_props, pc_compat_8_2, pc_compat_8_2_len);
@@ -548,28 +543,26 @@ static void pc_i440fx_8_2_machine_options(MachineClass *m)
     pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_64;
 }
 
-DEFINE_I440FX_MACHINE(v8_2, "pc-i440fx-8.2", NULL,
-                      pc_i440fx_8_2_machine_options);
+DEFINE_I440FX_MACHINE(8, 2, NULL);
 
-static void pc_i440fx_8_1_machine_options(MachineClass *m)
+static void pc_i440fx_machine_8_1_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_8_2_machine_options(m);
+    pc_i440fx_machine_8_2_options(m);
     pcmc->broken_32bit_mem_addr_check = true;
 
     compat_props_add(m->compat_props, hw_compat_8_1, hw_compat_8_1_len);
     compat_props_add(m->compat_props, pc_compat_8_1, pc_compat_8_1_len);
 }
 
-DEFINE_I440FX_MACHINE(v8_1, "pc-i440fx-8.1", NULL,
-                      pc_i440fx_8_1_machine_options);
+DEFINE_I440FX_MACHINE(8, 1, NULL);
 
-static void pc_i440fx_8_0_machine_options(MachineClass *m)
+static void pc_i440fx_machine_8_0_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_8_1_machine_options(m);
+    pc_i440fx_machine_8_1_options(m);
     compat_props_add(m->compat_props, hw_compat_8_0, hw_compat_8_0_len);
     compat_props_add(m->compat_props, pc_compat_8_0, pc_compat_8_0_len);
 
@@ -577,285 +570,260 @@ static void pc_i440fx_8_0_machine_options(MachineClass *m)
     pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_32;
 }
 
-DEFINE_I440FX_MACHINE(v8_0, "pc-i440fx-8.0", NULL,
-                      pc_i440fx_8_0_machine_options);
+DEFINE_I440FX_MACHINE(8, 0, NULL);
 
-static void pc_i440fx_7_2_machine_options(MachineClass *m)
+static void pc_i440fx_machine_7_2_options(MachineClass *m)
 {
-    pc_i440fx_8_0_machine_options(m);
+    pc_i440fx_machine_8_0_options(m);
     compat_props_add(m->compat_props, hw_compat_7_2, hw_compat_7_2_len);
     compat_props_add(m->compat_props, pc_compat_7_2, pc_compat_7_2_len);
 }
 
-DEFINE_I440FX_MACHINE(v7_2, "pc-i440fx-7.2", NULL,
-                      pc_i440fx_7_2_machine_options);
+DEFINE_I440FX_MACHINE(7, 2, NULL)
 
-static void pc_i440fx_7_1_machine_options(MachineClass *m)
+static void pc_i440fx_machine_7_1_options(MachineClass *m)
 {
-    pc_i440fx_7_2_machine_options(m);
+    pc_i440fx_machine_7_2_options(m);
     compat_props_add(m->compat_props, hw_compat_7_1, hw_compat_7_1_len);
     compat_props_add(m->compat_props, pc_compat_7_1, pc_compat_7_1_len);
 }
 
-DEFINE_I440FX_MACHINE(v7_1, "pc-i440fx-7.1", NULL,
-                      pc_i440fx_7_1_machine_options);
+DEFINE_I440FX_MACHINE(7, 1, NULL);
 
-static void pc_i440fx_7_0_machine_options(MachineClass *m)
+static void pc_i440fx_machine_7_0_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
-    pc_i440fx_7_1_machine_options(m);
+    pc_i440fx_machine_7_1_options(m);
     pcmc->enforce_amd_1tb_hole = false;
     compat_props_add(m->compat_props, hw_compat_7_0, hw_compat_7_0_len);
     compat_props_add(m->compat_props, pc_compat_7_0, pc_compat_7_0_len);
 }
 
-DEFINE_I440FX_MACHINE(v7_0, "pc-i440fx-7.0", NULL,
-                      pc_i440fx_7_0_machine_options);
+DEFINE_I440FX_MACHINE(7, 0, NULL);
 
-static void pc_i440fx_6_2_machine_options(MachineClass *m)
+static void pc_i440fx_machine_6_2_options(MachineClass *m)
 {
-    pc_i440fx_7_0_machine_options(m);
+    pc_i440fx_machine_7_0_options(m);
     compat_props_add(m->compat_props, hw_compat_6_2, hw_compat_6_2_len);
     compat_props_add(m->compat_props, pc_compat_6_2, pc_compat_6_2_len);
 }
 
-DEFINE_I440FX_MACHINE(v6_2, "pc-i440fx-6.2", NULL,
-                      pc_i440fx_6_2_machine_options);
+DEFINE_I440FX_MACHINE(6, 2, NULL);
 
-static void pc_i440fx_6_1_machine_options(MachineClass *m)
+static void pc_i440fx_machine_6_1_options(MachineClass *m)
 {
-    pc_i440fx_6_2_machine_options(m);
+    pc_i440fx_machine_6_2_options(m);
     compat_props_add(m->compat_props, hw_compat_6_1, hw_compat_6_1_len);
     compat_props_add(m->compat_props, pc_compat_6_1, pc_compat_6_1_len);
     m->smp_props.prefer_sockets = true;
 }
 
-DEFINE_I440FX_MACHINE(v6_1, "pc-i440fx-6.1", NULL,
-                      pc_i440fx_6_1_machine_options);
+DEFINE_I440FX_MACHINE(6, 1, NULL);
 
-static void pc_i440fx_6_0_machine_options(MachineClass *m)
+static void pc_i440fx_machine_6_0_options(MachineClass *m)
 {
-    pc_i440fx_6_1_machine_options(m);
+    pc_i440fx_machine_6_1_options(m);
     compat_props_add(m->compat_props, hw_compat_6_0, hw_compat_6_0_len);
     compat_props_add(m->compat_props, pc_compat_6_0, pc_compat_6_0_len);
 }
 
-DEFINE_I440FX_MACHINE(v6_0, "pc-i440fx-6.0", NULL,
-                      pc_i440fx_6_0_machine_options);
+DEFINE_I440FX_MACHINE(6, 0, NULL);
 
-static void pc_i440fx_5_2_machine_options(MachineClass *m)
+static void pc_i440fx_machine_5_2_options(MachineClass *m)
 {
-    pc_i440fx_6_0_machine_options(m);
+    pc_i440fx_machine_6_0_options(m);
     compat_props_add(m->compat_props, hw_compat_5_2, hw_compat_5_2_len);
     compat_props_add(m->compat_props, pc_compat_5_2, pc_compat_5_2_len);
 }
 
-DEFINE_I440FX_MACHINE(v5_2, "pc-i440fx-5.2", NULL,
-                      pc_i440fx_5_2_machine_options);
+DEFINE_I440FX_MACHINE(5, 2, NULL);
 
-static void pc_i440fx_5_1_machine_options(MachineClass *m)
+static void pc_i440fx_machine_5_1_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_5_2_machine_options(m);
+    pc_i440fx_machine_5_2_options(m);
     compat_props_add(m->compat_props, hw_compat_5_1, hw_compat_5_1_len);
     compat_props_add(m->compat_props, pc_compat_5_1, pc_compat_5_1_len);
     pcmc->kvmclock_create_always = false;
     pcmc->pci_root_uid = 1;
 }
 
-DEFINE_I440FX_MACHINE(v5_1, "pc-i440fx-5.1", NULL,
-                      pc_i440fx_5_1_machine_options);
+DEFINE_I440FX_MACHINE(5, 1, NULL);
 
-static void pc_i440fx_5_0_machine_options(MachineClass *m)
+static void pc_i440fx_machine_5_0_options(MachineClass *m)
 {
-    pc_i440fx_5_1_machine_options(m);
+    pc_i440fx_machine_5_1_options(m);
     m->numa_mem_supported = true;
     compat_props_add(m->compat_props, hw_compat_5_0, hw_compat_5_0_len);
     compat_props_add(m->compat_props, pc_compat_5_0, pc_compat_5_0_len);
     m->auto_enable_numa_with_memdev = false;
 }
 
-DEFINE_I440FX_MACHINE(v5_0, "pc-i440fx-5.0", NULL,
-                      pc_i440fx_5_0_machine_options);
+DEFINE_I440FX_MACHINE(5, 0, NULL);
 
-static void pc_i440fx_4_2_machine_options(MachineClass *m)
+static void pc_i440fx_machine_4_2_options(MachineClass *m)
 {
-    pc_i440fx_5_0_machine_options(m);
+    pc_i440fx_machine_5_0_options(m);
     compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
     compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
 }
 
-DEFINE_I440FX_MACHINE(v4_2, "pc-i440fx-4.2", NULL,
-                      pc_i440fx_4_2_machine_options);
+DEFINE_I440FX_MACHINE(4, 2, NULL);
 
-static void pc_i440fx_4_1_machine_options(MachineClass *m)
+static void pc_i440fx_machine_4_1_options(MachineClass *m)
 {
-    pc_i440fx_4_2_machine_options(m);
+    pc_i440fx_machine_4_2_options(m);
     compat_props_add(m->compat_props, hw_compat_4_1, hw_compat_4_1_len);
     compat_props_add(m->compat_props, pc_compat_4_1, pc_compat_4_1_len);
 }
 
-DEFINE_I440FX_MACHINE(v4_1, "pc-i440fx-4.1", NULL,
-                      pc_i440fx_4_1_machine_options);
+DEFINE_I440FX_MACHINE(4, 1, NULL);
 
-static void pc_i440fx_4_0_machine_options(MachineClass *m)
+static void pc_i440fx_machine_4_0_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
-    pc_i440fx_4_1_machine_options(m);
+    pc_i440fx_machine_4_1_options(m);
     pcmc->default_cpu_version = CPU_VERSION_LEGACY;
     compat_props_add(m->compat_props, hw_compat_4_0, hw_compat_4_0_len);
     compat_props_add(m->compat_props, pc_compat_4_0, pc_compat_4_0_len);
 }
 
-DEFINE_I440FX_MACHINE(v4_0, "pc-i440fx-4.0", NULL,
-                      pc_i440fx_4_0_machine_options);
+DEFINE_I440FX_MACHINE(4, 0, NULL);
 
-static void pc_i440fx_3_1_machine_options(MachineClass *m)
+static void pc_i440fx_machine_3_1_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_4_0_machine_options(m);
+    pc_i440fx_machine_4_0_options(m);
     m->smbus_no_migration_support = true;
     pcmc->pvh_enabled = false;
     compat_props_add(m->compat_props, hw_compat_3_1, hw_compat_3_1_len);
     compat_props_add(m->compat_props, pc_compat_3_1, pc_compat_3_1_len);
 }
 
-DEFINE_I440FX_MACHINE(v3_1, "pc-i440fx-3.1", NULL,
-                      pc_i440fx_3_1_machine_options);
+DEFINE_I440FX_MACHINE(3, 1, NULL);
 
-static void pc_i440fx_3_0_machine_options(MachineClass *m)
+static void pc_i440fx_machine_3_0_options(MachineClass *m)
 {
-    pc_i440fx_3_1_machine_options(m);
+    pc_i440fx_machine_3_1_options(m);
     compat_props_add(m->compat_props, hw_compat_3_0, hw_compat_3_0_len);
     compat_props_add(m->compat_props, pc_compat_3_0, pc_compat_3_0_len);
 }
 
-DEFINE_I440FX_MACHINE(v3_0, "pc-i440fx-3.0", NULL,
-                      pc_i440fx_3_0_machine_options);
+DEFINE_I440FX_MACHINE(3, 0, NULL);
 
-static void pc_i440fx_2_12_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_12_options(MachineClass *m)
 {
-    pc_i440fx_3_0_machine_options(m);
+    pc_i440fx_machine_3_0_options(m);
     compat_props_add(m->compat_props, hw_compat_2_12, hw_compat_2_12_len);
     compat_props_add(m->compat_props, pc_compat_2_12, pc_compat_2_12_len);
 }
 
-DEFINE_I440FX_MACHINE(v2_12, "pc-i440fx-2.12", NULL,
-                      pc_i440fx_2_12_machine_options);
+DEFINE_I440FX_MACHINE(2, 12, NULL);
 
-static void pc_i440fx_2_11_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_11_options(MachineClass *m)
 {
-    pc_i440fx_2_12_machine_options(m);
+    pc_i440fx_machine_2_12_options(m);
     compat_props_add(m->compat_props, hw_compat_2_11, hw_compat_2_11_len);
     compat_props_add(m->compat_props, pc_compat_2_11, pc_compat_2_11_len);
 }
 
-DEFINE_I440FX_MACHINE(v2_11, "pc-i440fx-2.11", NULL,
-                      pc_i440fx_2_11_machine_options);
+DEFINE_I440FX_MACHINE(2, 11, NULL);
 
-static void pc_i440fx_2_10_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_10_options(MachineClass *m)
 {
-    pc_i440fx_2_11_machine_options(m);
+    pc_i440fx_machine_2_11_options(m);
     compat_props_add(m->compat_props, hw_compat_2_10, hw_compat_2_10_len);
     compat_props_add(m->compat_props, pc_compat_2_10, pc_compat_2_10_len);
     m->auto_enable_numa_with_memhp = false;
 }
 
-DEFINE_I440FX_MACHINE(v2_10, "pc-i440fx-2.10", NULL,
-                      pc_i440fx_2_10_machine_options);
+DEFINE_I440FX_MACHINE(2, 10, NULL);
 
-static void pc_i440fx_2_9_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_9_options(MachineClass *m)
 {
-    pc_i440fx_2_10_machine_options(m);
+    pc_i440fx_machine_2_10_options(m);
     compat_props_add(m->compat_props, hw_compat_2_9, hw_compat_2_9_len);
     compat_props_add(m->compat_props, pc_compat_2_9, pc_compat_2_9_len);
 }
 
-DEFINE_I440FX_MACHINE(v2_9, "pc-i440fx-2.9", NULL,
-                      pc_i440fx_2_9_machine_options);
+DEFINE_I440FX_MACHINE(2, 9, NULL);
 
-static void pc_i440fx_2_8_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_8_options(MachineClass *m)
 {
-    pc_i440fx_2_9_machine_options(m);
+    pc_i440fx_machine_2_9_options(m);
     compat_props_add(m->compat_props, hw_compat_2_8, hw_compat_2_8_len);
     compat_props_add(m->compat_props, pc_compat_2_8, pc_compat_2_8_len);
 }
 
-DEFINE_I440FX_MACHINE(v2_8, "pc-i440fx-2.8", NULL,
-                      pc_i440fx_2_8_machine_options);
+DEFINE_I440FX_MACHINE(2, 8, NULL);
 
-static void pc_i440fx_2_7_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_7_options(MachineClass *m)
 {
-    pc_i440fx_2_8_machine_options(m);
+    pc_i440fx_machine_2_8_options(m);
     compat_props_add(m->compat_props, hw_compat_2_7, hw_compat_2_7_len);
     compat_props_add(m->compat_props, pc_compat_2_7, pc_compat_2_7_len);
 }
 
-DEFINE_I440FX_MACHINE(v2_7, "pc-i440fx-2.7", NULL,
-                      pc_i440fx_2_7_machine_options);
+DEFINE_I440FX_MACHINE(2, 7, NULL);
 
-static void pc_i440fx_2_6_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_6_options(MachineClass *m)
 {
     X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_2_7_machine_options(m);
+    pc_i440fx_machine_2_7_options(m);
     pcmc->legacy_cpu_hotplug = true;
     x86mc->fwcfg_dma_enabled = false;
     compat_props_add(m->compat_props, hw_compat_2_6, hw_compat_2_6_len);
     compat_props_add(m->compat_props, pc_compat_2_6, pc_compat_2_6_len);
 }
 
-DEFINE_I440FX_MACHINE(v2_6, "pc-i440fx-2.6", NULL,
-                      pc_i440fx_2_6_machine_options);
+DEFINE_I440FX_MACHINE(2, 6, NULL);
 
-static void pc_i440fx_2_5_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_5_options(MachineClass *m)
 {
     X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
 
-    pc_i440fx_2_6_machine_options(m);
+    pc_i440fx_machine_2_6_options(m);
     x86mc->save_tsc_khz = false;
     m->legacy_fw_cfg_order = 1;
     compat_props_add(m->compat_props, hw_compat_2_5, hw_compat_2_5_len);
     compat_props_add(m->compat_props, pc_compat_2_5, pc_compat_2_5_len);
 }
 
-DEFINE_I440FX_MACHINE(v2_5, "pc-i440fx-2.5", NULL,
-                      pc_i440fx_2_5_machine_options);
+DEFINE_I440FX_MACHINE(2, 5, NULL);
 
-static void pc_i440fx_2_4_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_4_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_2_5_machine_options(m);
+    pc_i440fx_machine_2_5_options(m);
     m->hw_version = "2.4.0";
     pcmc->broken_reserved_end = true;
     compat_props_add(m->compat_props, hw_compat_2_4, hw_compat_2_4_len);
     compat_props_add(m->compat_props, pc_compat_2_4, pc_compat_2_4_len);
 }
 
-DEFINE_I440FX_MACHINE(v2_4, "pc-i440fx-2.4", NULL,
-                      pc_i440fx_2_4_machine_options)
+DEFINE_I440FX_MACHINE(2, 4, NULL);
 
-static void pc_i440fx_2_3_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_3_options(MachineClass *m)
 {
-    pc_i440fx_2_4_machine_options(m);
+    pc_i440fx_machine_2_4_options(m);
     m->hw_version = "2.3.0";
     m->deprecation_reason = "old and unattended - use a newer version instead";
     compat_props_add(m->compat_props, hw_compat_2_3, hw_compat_2_3_len);
     compat_props_add(m->compat_props, pc_compat_2_3, pc_compat_2_3_len);
 }
 
-DEFINE_I440FX_MACHINE(v2_3, "pc-i440fx-2.3", pc_compat_2_3_fn,
-                      pc_i440fx_2_3_machine_options);
+DEFINE_I440FX_MACHINE(2, 3, pc_compat_2_3_fn);
 
-static void pc_i440fx_2_2_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_2_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_2_3_machine_options(m);
+    pc_i440fx_machine_2_3_options(m);
     m->hw_version = "2.2.0";
     m->default_machine_opts = "firmware=bios-256k.bin,suppress-vmdesc=on";
     compat_props_add(m->compat_props, hw_compat_2_2, hw_compat_2_2_len);
@@ -864,14 +832,13 @@ static void pc_i440fx_2_2_machine_options(MachineClass *m)
     pcmc->resizable_acpi_blob = false;
 }
 
-DEFINE_I440FX_MACHINE(v2_2, "pc-i440fx-2.2", pc_compat_2_2_fn,
-                      pc_i440fx_2_2_machine_options);
+DEFINE_I440FX_MACHINE(2, 2, pc_compat_2_2_fn);
 
-static void pc_i440fx_2_1_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_1_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_2_2_machine_options(m);
+    pc_i440fx_machine_2_2_options(m);
     m->hw_version = "2.1.0";
     m->default_display = NULL;
     compat_props_add(m->compat_props, hw_compat_2_1, hw_compat_2_1_len);
@@ -880,14 +847,13 @@ static void pc_i440fx_2_1_machine_options(MachineClass *m)
     pcmc->enforce_aligned_dimm = false;
 }
 
-DEFINE_I440FX_MACHINE(v2_1, "pc-i440fx-2.1", pc_compat_2_1_fn,
-                      pc_i440fx_2_1_machine_options);
+DEFINE_I440FX_MACHINE(2, 1, pc_compat_2_1_fn);
 
-static void pc_i440fx_2_0_machine_options(MachineClass *m)
+static void pc_i440fx_machine_2_0_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_i440fx_2_1_machine_options(m);
+    pc_i440fx_machine_2_1_options(m);
     m->hw_version = "2.0.0";
     compat_props_add(m->compat_props, pc_compat_2_0, pc_compat_2_0_len);
     pcmc->smbios_legacy_mode = true;
@@ -912,8 +878,7 @@ static void pc_i440fx_2_0_machine_options(MachineClass *m)
     pcmc->acpi_data_size = 0x10000;
 }
 
-DEFINE_I440FX_MACHINE(v2_0, "pc-i440fx-2.0", pc_compat_2_0_fn,
-                      pc_i440fx_2_0_machine_options);
+DEFINE_I440FX_MACHINE(2, 0, pc_compat_2_0_fn);
 
 #ifdef CONFIG_ISAPC
 static void isapc_machine_options(MachineClass *m)
@@ -939,20 +904,20 @@ DEFINE_PC_MACHINE(isapc, "isapc", pc_init_isa,
 #endif
 
 #ifdef CONFIG_XEN
-static void xenfv_4_2_machine_options(MachineClass *m)
+static void xenfv_machine_4_2_options(MachineClass *m)
 {
-    pc_i440fx_4_2_machine_options(m);
+    pc_i440fx_machine_4_2_options(m);
     m->desc = "Xen Fully-virtualized PC";
     m->max_cpus = HVM_MAX_VCPUS;
     m->default_machine_opts = "accel=xen,suppress-vmdesc=on";
 }
 
 DEFINE_PC_MACHINE(xenfv_4_2, "xenfv-4.2", pc_xen_hvm_init,
-                  xenfv_4_2_machine_options);
+                  xenfv_machine_4_2_options);
 
-static void xenfv_3_1_machine_options(MachineClass *m)
+static void xenfv_machine_3_1_options(MachineClass *m)
 {
-    pc_i440fx_3_1_machine_options(m);
+    pc_i440fx_machine_3_1_options(m);
     m->desc = "Xen Fully-virtualized PC";
     m->alias = "xenfv";
     m->max_cpus = HVM_MAX_VCPUS;
@@ -960,5 +925,5 @@ static void xenfv_3_1_machine_options(MachineClass *m)
 }
 
 DEFINE_PC_MACHINE(xenfv, "xenfv-3.1", pc_xen_hvm_init,
-                  xenfv_3_1_machine_options);
+                  xenfv_machine_3_1_options);
 #endif
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index e52290916c..669263dfca 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -310,4 +310,34 @@ extern const size_t pc_compat_2_0_len;
     } \
     type_init(pc_machine_init_##suffix)
 
+#define DEFINE_PC_VER_MACHINE(namesym, namestr, initfn, compatfn, ...) \
+    static void MACHINE_VER_SYM(init, namesym, __VA_ARGS__)( \
+        MachineState *machine) \
+    { \
+        void (*compat)(MachineState *m) = (compatfn); \
+        if (compat) { \
+            compat(machine); \
+        } \
+        initfn(machine); \
+    } \
+    static void MACHINE_VER_SYM(class_init, namesym, __VA_ARGS__)( \
+        ObjectClass *oc, \
+        void *data) \
+    { \
+        MachineClass *mc = MACHINE_CLASS(oc); \
+        MACHINE_VER_SYM(options, namesym, __VA_ARGS__)(mc); \
+        mc->init = MACHINE_VER_SYM(init, namesym, __VA_ARGS__); \
+    } \
+    static const TypeInfo MACHINE_VER_SYM(info, namesym, __VA_ARGS__) = \
+    { \
+        .name       = MACHINE_VER_TYPE_NAME(namestr, __VA_ARGS__), \
+        .parent     = TYPE_PC_MACHINE, \
+        .class_init = MACHINE_VER_SYM(class_init, namesym, __VA_ARGS__), \
+    }; \
+    static void MACHINE_VER_SYM(register, namesym, __VA_ARGS__)(void) \
+    { \
+        type_register(&MACHINE_VER_SYM(info, namesym, __VA_ARGS__)); \
+    } \
+    type_init(MACHINE_VER_SYM(register, namesym, __VA_ARGS__));
+
 #endif
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 07/14] hw/i386: convert 'q35' machine definitions to use new macros
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (5 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 06/14] hw/i386: convert 'i440fx' " Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-01 18:27 ` [PATCH 08/14] include/hw: add macros for deprecation & removal of versioned machines Daniel P. Berrangé
                   ` (8 subsequent siblings)
  15 siblings, 0 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

This changes the DEFINE_Q35_MACHINE macro to use the common
helpers for constructing versioned symbol names and strings,
bringing greater consistency across targets.

The added benefit is that it avoids the need to repeat the
version number thrice in three different formats in the calls
to DEFINE_Q35_MACHINE.

Due to the odd-ball '4.0.1' machine type version, this
commit introduces a DEFINE_Q35_BUGFIX helper, to allow
defining of "bugfix" machine types which have a three
digit version.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/i386/pc_q35.c | 215 ++++++++++++++++++++---------------------------
 1 file changed, 90 insertions(+), 125 deletions(-)

diff --git a/hw/i386/pc_q35.c b/hw/i386/pc_q35.c
index bb53a51ac1..b76cdca151 100644
--- a/hw/i386/pc_q35.c
+++ b/hw/i386/pc_q35.c
@@ -331,17 +331,11 @@ static void pc_q35_init(MachineState *machine)
     }
 }
 
-#define DEFINE_Q35_MACHINE(suffix, name, compatfn, optionfn) \
-    static void pc_init_##suffix(MachineState *machine) \
-    { \
-        void (*compat)(MachineState *m) = (compatfn); \
-        if (compat) { \
-            compat(machine); \
-        } \
-        pc_q35_init(machine); \
-    } \
-    DEFINE_PC_MACHINE(suffix, name, pc_init_##suffix, optionfn)
+#define DEFINE_Q35_MACHINE(major, minor) \
+    DEFINE_PC_VER_MACHINE(pc_q35, "pc-q35", pc_q35_init, NULL, major, minor);
 
+#define DEFINE_Q35_MACHINE_BUGFIX(major, minor, micro) \
+    DEFINE_PC_VER_MACHINE(pc_q35, "pc-q35", pc_q35_init, NULL, major, minor, micro);
 
 static void pc_q35_machine_options(MachineClass *m)
 {
@@ -367,30 +361,28 @@ static void pc_q35_machine_options(MachineClass *m)
                      pc_q35_compat_defaults, pc_q35_compat_defaults_len);
 }
 
-static void pc_q35_9_1_machine_options(MachineClass *m)
+static void pc_q35_machine_9_1_options(MachineClass *m)
 {
     pc_q35_machine_options(m);
     m->alias = "q35";
 }
 
-DEFINE_Q35_MACHINE(v9_1, "pc-q35-9.1", NULL,
-                   pc_q35_9_1_machine_options);
+DEFINE_Q35_MACHINE(9, 1);
 
-static void pc_q35_9_0_machine_options(MachineClass *m)
+static void pc_q35_machine_9_0_options(MachineClass *m)
 {
-    pc_q35_9_1_machine_options(m);
+    pc_q35_machine_9_1_options(m);
     m->alias = NULL;
     compat_props_add(m->compat_props, hw_compat_9_0, hw_compat_9_0_len);
     compat_props_add(m->compat_props, pc_compat_9_0, pc_compat_9_0_len);
 }
 
-DEFINE_Q35_MACHINE(v9_0, "pc-q35-9.0", NULL,
-                   pc_q35_9_0_machine_options);
+DEFINE_Q35_MACHINE(9, 0);
 
-static void pc_q35_8_2_machine_options(MachineClass *m)
+static void pc_q35_machine_8_2_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
-    pc_q35_9_0_machine_options(m);
+    pc_q35_machine_9_0_options(m);
     m->max_cpus = 1024;
     compat_props_add(m->compat_props, hw_compat_8_2, hw_compat_8_2_len);
     compat_props_add(m->compat_props, pc_compat_8_2, pc_compat_8_2_len);
@@ -398,26 +390,24 @@ static void pc_q35_8_2_machine_options(MachineClass *m)
     pcmc->default_smbios_ep_type = SMBIOS_ENTRY_POINT_TYPE_64;
 }
 
-DEFINE_Q35_MACHINE(v8_2, "pc-q35-8.2", NULL,
-                   pc_q35_8_2_machine_options);
+DEFINE_Q35_MACHINE(8, 2);
 
-static void pc_q35_8_1_machine_options(MachineClass *m)
+static void pc_q35_machine_8_1_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
-    pc_q35_8_2_machine_options(m);
+    pc_q35_machine_8_2_options(m);
     pcmc->broken_32bit_mem_addr_check = true;
     compat_props_add(m->compat_props, hw_compat_8_1, hw_compat_8_1_len);
     compat_props_add(m->compat_props, pc_compat_8_1, pc_compat_8_1_len);
 }
 
-DEFINE_Q35_MACHINE(v8_1, "pc-q35-8.1", NULL,
-                   pc_q35_8_1_machine_options);
+DEFINE_Q35_MACHINE(8, 1);
 
-static void pc_q35_8_0_machine_options(MachineClass *m)
+static void pc_q35_machine_8_0_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_q35_8_1_machine_options(m);
+    pc_q35_machine_8_1_options(m);
     compat_props_add(m->compat_props, hw_compat_8_0, hw_compat_8_0_len);
     compat_props_add(m->compat_props, pc_compat_8_0, pc_compat_8_0_len);
 
@@ -426,132 +416,120 @@ static void pc_q35_8_0_machine_options(MachineClass *m)
     m->max_cpus = 288;
 }
 
-DEFINE_Q35_MACHINE(v8_0, "pc-q35-8.0", NULL,
-                   pc_q35_8_0_machine_options);
+DEFINE_Q35_MACHINE(8, 0);
 
-static void pc_q35_7_2_machine_options(MachineClass *m)
+static void pc_q35_machine_7_2_options(MachineClass *m)
 {
-    pc_q35_8_0_machine_options(m);
+    pc_q35_machine_8_0_options(m);
     compat_props_add(m->compat_props, hw_compat_7_2, hw_compat_7_2_len);
     compat_props_add(m->compat_props, pc_compat_7_2, pc_compat_7_2_len);
 }
 
-DEFINE_Q35_MACHINE(v7_2, "pc-q35-7.2", NULL,
-                   pc_q35_7_2_machine_options);
+DEFINE_Q35_MACHINE(7, 2);
 
-static void pc_q35_7_1_machine_options(MachineClass *m)
+static void pc_q35_machine_7_1_options(MachineClass *m)
 {
-    pc_q35_7_2_machine_options(m);
+    pc_q35_machine_7_2_options(m);
     compat_props_add(m->compat_props, hw_compat_7_1, hw_compat_7_1_len);
     compat_props_add(m->compat_props, pc_compat_7_1, pc_compat_7_1_len);
 }
 
-DEFINE_Q35_MACHINE(v7_1, "pc-q35-7.1", NULL,
-                   pc_q35_7_1_machine_options);
+DEFINE_Q35_MACHINE(7, 1);
 
-static void pc_q35_7_0_machine_options(MachineClass *m)
+static void pc_q35_machine_7_0_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
-    pc_q35_7_1_machine_options(m);
+    pc_q35_machine_7_1_options(m);
     pcmc->enforce_amd_1tb_hole = false;
     compat_props_add(m->compat_props, hw_compat_7_0, hw_compat_7_0_len);
     compat_props_add(m->compat_props, pc_compat_7_0, pc_compat_7_0_len);
 }
 
-DEFINE_Q35_MACHINE(v7_0, "pc-q35-7.0", NULL,
-                   pc_q35_7_0_machine_options);
+DEFINE_Q35_MACHINE(7, 0);
 
-static void pc_q35_6_2_machine_options(MachineClass *m)
+static void pc_q35_machine_6_2_options(MachineClass *m)
 {
-    pc_q35_7_0_machine_options(m);
+    pc_q35_machine_7_0_options(m);
     compat_props_add(m->compat_props, hw_compat_6_2, hw_compat_6_2_len);
     compat_props_add(m->compat_props, pc_compat_6_2, pc_compat_6_2_len);
 }
 
-DEFINE_Q35_MACHINE(v6_2, "pc-q35-6.2", NULL,
-                   pc_q35_6_2_machine_options);
+DEFINE_Q35_MACHINE(6, 2);
 
-static void pc_q35_6_1_machine_options(MachineClass *m)
+static void pc_q35_machine_6_1_options(MachineClass *m)
 {
-    pc_q35_6_2_machine_options(m);
+    pc_q35_machine_6_2_options(m);
     compat_props_add(m->compat_props, hw_compat_6_1, hw_compat_6_1_len);
     compat_props_add(m->compat_props, pc_compat_6_1, pc_compat_6_1_len);
     m->smp_props.prefer_sockets = true;
 }
 
-DEFINE_Q35_MACHINE(v6_1, "pc-q35-6.1", NULL,
-                   pc_q35_6_1_machine_options);
+DEFINE_Q35_MACHINE(6, 1);
 
-static void pc_q35_6_0_machine_options(MachineClass *m)
+static void pc_q35_machine_6_0_options(MachineClass *m)
 {
-    pc_q35_6_1_machine_options(m);
+    pc_q35_machine_6_1_options(m);
     compat_props_add(m->compat_props, hw_compat_6_0, hw_compat_6_0_len);
     compat_props_add(m->compat_props, pc_compat_6_0, pc_compat_6_0_len);
 }
 
-DEFINE_Q35_MACHINE(v6_0, "pc-q35-6.0", NULL,
-                   pc_q35_6_0_machine_options);
+DEFINE_Q35_MACHINE(6, 0);
 
-static void pc_q35_5_2_machine_options(MachineClass *m)
+static void pc_q35_machine_5_2_options(MachineClass *m)
 {
-    pc_q35_6_0_machine_options(m);
+    pc_q35_machine_6_0_options(m);
     compat_props_add(m->compat_props, hw_compat_5_2, hw_compat_5_2_len);
     compat_props_add(m->compat_props, pc_compat_5_2, pc_compat_5_2_len);
 }
 
-DEFINE_Q35_MACHINE(v5_2, "pc-q35-5.2", NULL,
-                   pc_q35_5_2_machine_options);
+DEFINE_Q35_MACHINE(5, 2);
 
-static void pc_q35_5_1_machine_options(MachineClass *m)
+static void pc_q35_machine_5_1_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_q35_5_2_machine_options(m);
+    pc_q35_machine_5_2_options(m);
     compat_props_add(m->compat_props, hw_compat_5_1, hw_compat_5_1_len);
     compat_props_add(m->compat_props, pc_compat_5_1, pc_compat_5_1_len);
     pcmc->kvmclock_create_always = false;
     pcmc->pci_root_uid = 1;
 }
 
-DEFINE_Q35_MACHINE(v5_1, "pc-q35-5.1", NULL,
-                   pc_q35_5_1_machine_options);
+DEFINE_Q35_MACHINE(5, 1);
 
-static void pc_q35_5_0_machine_options(MachineClass *m)
+static void pc_q35_machine_5_0_options(MachineClass *m)
 {
-    pc_q35_5_1_machine_options(m);
+    pc_q35_machine_5_1_options(m);
     m->numa_mem_supported = true;
     compat_props_add(m->compat_props, hw_compat_5_0, hw_compat_5_0_len);
     compat_props_add(m->compat_props, pc_compat_5_0, pc_compat_5_0_len);
     m->auto_enable_numa_with_memdev = false;
 }
 
-DEFINE_Q35_MACHINE(v5_0, "pc-q35-5.0", NULL,
-                   pc_q35_5_0_machine_options);
+DEFINE_Q35_MACHINE(5, 0);
 
-static void pc_q35_4_2_machine_options(MachineClass *m)
+static void pc_q35_machine_4_2_options(MachineClass *m)
 {
-    pc_q35_5_0_machine_options(m);
+    pc_q35_machine_5_0_options(m);
     compat_props_add(m->compat_props, hw_compat_4_2, hw_compat_4_2_len);
     compat_props_add(m->compat_props, pc_compat_4_2, pc_compat_4_2_len);
 }
 
-DEFINE_Q35_MACHINE(v4_2, "pc-q35-4.2", NULL,
-                   pc_q35_4_2_machine_options);
+DEFINE_Q35_MACHINE(4, 2);
 
-static void pc_q35_4_1_machine_options(MachineClass *m)
+static void pc_q35_machine_4_1_options(MachineClass *m)
 {
-    pc_q35_4_2_machine_options(m);
+    pc_q35_machine_4_2_options(m);
     compat_props_add(m->compat_props, hw_compat_4_1, hw_compat_4_1_len);
     compat_props_add(m->compat_props, pc_compat_4_1, pc_compat_4_1_len);
 }
 
-DEFINE_Q35_MACHINE(v4_1, "pc-q35-4.1", NULL,
-                   pc_q35_4_1_machine_options);
+DEFINE_Q35_MACHINE(4, 1);
 
-static void pc_q35_4_0_1_machine_options(MachineClass *m)
+static void pc_q35_machine_4_0_1_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
-    pc_q35_4_1_machine_options(m);
+    pc_q35_machine_4_1_options(m);
     pcmc->default_cpu_version = CPU_VERSION_LEGACY;
     /*
      * This is the default machine for the 4.0-stable branch. It is basically
@@ -562,24 +540,22 @@ static void pc_q35_4_0_1_machine_options(MachineClass *m)
     compat_props_add(m->compat_props, pc_compat_4_0, pc_compat_4_0_len);
 }
 
-DEFINE_Q35_MACHINE(v4_0_1, "pc-q35-4.0.1", NULL,
-                   pc_q35_4_0_1_machine_options);
+DEFINE_Q35_MACHINE_BUGFIX(4, 0, 1);
 
-static void pc_q35_4_0_machine_options(MachineClass *m)
+static void pc_q35_machine_4_0_options(MachineClass *m)
 {
-    pc_q35_4_0_1_machine_options(m);
+    pc_q35_machine_4_0_1_options(m);
     m->default_kernel_irqchip_split = true;
     /* Compat props are applied by the 4.0.1 machine */
 }
 
-DEFINE_Q35_MACHINE(v4_0, "pc-q35-4.0", NULL,
-                   pc_q35_4_0_machine_options);
+DEFINE_Q35_MACHINE(4, 0);
 
-static void pc_q35_3_1_machine_options(MachineClass *m)
+static void pc_q35_machine_3_1_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_q35_4_0_machine_options(m);
+    pc_q35_machine_4_0_options(m);
     m->default_kernel_irqchip_split = false;
     m->smbus_no_migration_support = true;
     pcmc->pvh_enabled = false;
@@ -587,121 +563,110 @@ static void pc_q35_3_1_machine_options(MachineClass *m)
     compat_props_add(m->compat_props, pc_compat_3_1, pc_compat_3_1_len);
 }
 
-DEFINE_Q35_MACHINE(v3_1, "pc-q35-3.1", NULL,
-                   pc_q35_3_1_machine_options);
+DEFINE_Q35_MACHINE(3, 1);
 
-static void pc_q35_3_0_machine_options(MachineClass *m)
+static void pc_q35_machine_3_0_options(MachineClass *m)
 {
-    pc_q35_3_1_machine_options(m);
+    pc_q35_machine_3_1_options(m);
     compat_props_add(m->compat_props, hw_compat_3_0, hw_compat_3_0_len);
     compat_props_add(m->compat_props, pc_compat_3_0, pc_compat_3_0_len);
 }
 
-DEFINE_Q35_MACHINE(v3_0, "pc-q35-3.0", NULL,
-                    pc_q35_3_0_machine_options);
+DEFINE_Q35_MACHINE(3, 0);
 
-static void pc_q35_2_12_machine_options(MachineClass *m)
+static void pc_q35_machine_2_12_options(MachineClass *m)
 {
-    pc_q35_3_0_machine_options(m);
+    pc_q35_machine_3_0_options(m);
     compat_props_add(m->compat_props, hw_compat_2_12, hw_compat_2_12_len);
     compat_props_add(m->compat_props, pc_compat_2_12, pc_compat_2_12_len);
 }
 
-DEFINE_Q35_MACHINE(v2_12, "pc-q35-2.12", NULL,
-                   pc_q35_2_12_machine_options);
+DEFINE_Q35_MACHINE(2, 12);
 
-static void pc_q35_2_11_machine_options(MachineClass *m)
+static void pc_q35_machine_2_11_options(MachineClass *m)
 {
-    pc_q35_2_12_machine_options(m);
+    pc_q35_machine_2_12_options(m);
     m->default_nic = "e1000";
     compat_props_add(m->compat_props, hw_compat_2_11, hw_compat_2_11_len);
     compat_props_add(m->compat_props, pc_compat_2_11, pc_compat_2_11_len);
 }
 
-DEFINE_Q35_MACHINE(v2_11, "pc-q35-2.11", NULL,
-                   pc_q35_2_11_machine_options);
+DEFINE_Q35_MACHINE(2, 11);
 
-static void pc_q35_2_10_machine_options(MachineClass *m)
+static void pc_q35_machine_2_10_options(MachineClass *m)
 {
-    pc_q35_2_11_machine_options(m);
+    pc_q35_machine_2_11_options(m);
     compat_props_add(m->compat_props, hw_compat_2_10, hw_compat_2_10_len);
     compat_props_add(m->compat_props, pc_compat_2_10, pc_compat_2_10_len);
     m->auto_enable_numa_with_memhp = false;
 }
 
-DEFINE_Q35_MACHINE(v2_10, "pc-q35-2.10", NULL,
-                   pc_q35_2_10_machine_options);
+DEFINE_Q35_MACHINE(2, 10);
 
-static void pc_q35_2_9_machine_options(MachineClass *m)
+static void pc_q35_machine_2_9_options(MachineClass *m)
 {
-    pc_q35_2_10_machine_options(m);
+    pc_q35_machine_2_10_options(m);
     compat_props_add(m->compat_props, hw_compat_2_9, hw_compat_2_9_len);
     compat_props_add(m->compat_props, pc_compat_2_9, pc_compat_2_9_len);
 }
 
-DEFINE_Q35_MACHINE(v2_9, "pc-q35-2.9", NULL,
-                   pc_q35_2_9_machine_options);
+DEFINE_Q35_MACHINE(2, 9);
 
-static void pc_q35_2_8_machine_options(MachineClass *m)
+static void pc_q35_machine_2_8_options(MachineClass *m)
 {
-    pc_q35_2_9_machine_options(m);
+    pc_q35_machine_2_9_options(m);
     compat_props_add(m->compat_props, hw_compat_2_8, hw_compat_2_8_len);
     compat_props_add(m->compat_props, pc_compat_2_8, pc_compat_2_8_len);
 }
 
-DEFINE_Q35_MACHINE(v2_8, "pc-q35-2.8", NULL,
-                   pc_q35_2_8_machine_options);
+DEFINE_Q35_MACHINE(2, 8);
 
-static void pc_q35_2_7_machine_options(MachineClass *m)
+static void pc_q35_machine_2_7_options(MachineClass *m)
 {
-    pc_q35_2_8_machine_options(m);
+    pc_q35_machine_2_8_options(m);
     m->max_cpus = 255;
     compat_props_add(m->compat_props, hw_compat_2_7, hw_compat_2_7_len);
     compat_props_add(m->compat_props, pc_compat_2_7, pc_compat_2_7_len);
 }
 
-DEFINE_Q35_MACHINE(v2_7, "pc-q35-2.7", NULL,
-                   pc_q35_2_7_machine_options);
+DEFINE_Q35_MACHINE(2, 7);
 
-static void pc_q35_2_6_machine_options(MachineClass *m)
+static void pc_q35_machine_2_6_options(MachineClass *m)
 {
     X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_q35_2_7_machine_options(m);
+    pc_q35_machine_2_7_options(m);
     pcmc->legacy_cpu_hotplug = true;
     x86mc->fwcfg_dma_enabled = false;
     compat_props_add(m->compat_props, hw_compat_2_6, hw_compat_2_6_len);
     compat_props_add(m->compat_props, pc_compat_2_6, pc_compat_2_6_len);
 }
 
-DEFINE_Q35_MACHINE(v2_6, "pc-q35-2.6", NULL,
-                   pc_q35_2_6_machine_options);
+DEFINE_Q35_MACHINE(2, 6);
 
-static void pc_q35_2_5_machine_options(MachineClass *m)
+static void pc_q35_machine_2_5_options(MachineClass *m)
 {
     X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
 
-    pc_q35_2_6_machine_options(m);
+    pc_q35_machine_2_6_options(m);
     x86mc->save_tsc_khz = false;
     m->legacy_fw_cfg_order = 1;
     compat_props_add(m->compat_props, hw_compat_2_5, hw_compat_2_5_len);
     compat_props_add(m->compat_props, pc_compat_2_5, pc_compat_2_5_len);
 }
 
-DEFINE_Q35_MACHINE(v2_5, "pc-q35-2.5", NULL,
-                   pc_q35_2_5_machine_options);
+DEFINE_Q35_MACHINE(2, 5);
 
-static void pc_q35_2_4_machine_options(MachineClass *m)
+static void pc_q35_machine_2_4_options(MachineClass *m)
 {
     PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
 
-    pc_q35_2_5_machine_options(m);
+    pc_q35_machine_2_5_options(m);
     m->hw_version = "2.4.0";
     pcmc->broken_reserved_end = true;
     compat_props_add(m->compat_props, hw_compat_2_4, hw_compat_2_4_len);
     compat_props_add(m->compat_props, pc_compat_2_4, pc_compat_2_4_len);
 }
 
-DEFINE_Q35_MACHINE(v2_4, "pc-q35-2.4", NULL,
-                   pc_q35_2_4_machine_options);
+DEFINE_Q35_MACHINE(2, 4);
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 08/14] include/hw: add macros for deprecation & removal of versioned machines
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (6 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 07/14] hw/i386: convert 'q35' " Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 10:59   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 09/14] hw: temporarily disable deletion of versioned machine types Daniel P. Berrangé
                   ` (7 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

Versioned machines live for a long time to provide back compat for
incoming migration and restore of saved images. To guide users away from
usage of old machines, however, we want to deprecate any older than 3
years (equiv of 9 releases), and delete any older than 6 years (equiva
of 18 releases).

To get a standardized deprecation message and avoid having to remember
to manually add it after three years, this introduces two macros to be
used by targets when defining versioned machines.

* MACHINE_VER_DEPRECATION(major, minor)

  Automates the task of setting the 'deprecation_reason' field on the
  machine, if-and-only-if the major/minor version is older than 3 years.

* MACHINE_VER_DEPRECATION(major, minor)

  Simulates the deletion of by skipping registration of the QOM type
  for a versioned machine, if-and-only-if the major/minor version is
  older than 6 years.

By using these two macros there is no longer any manual work required
per-release to deprecate old machines. By preventing the use of machines
that have reached their deletion date, it is also no neccessary to
manually delete machines per-release. Deletion can be batched up once a
year or whenever makes most sense.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 include/hw/boards.h | 84 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 84 insertions(+)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 47ca450fca..48b6c98c77 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -427,6 +427,7 @@ struct MachineState {
  *          MachineClass *mc = MACHINE_CLASS(oc); \
  *          MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
  *          mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " Virtual Machine"; \
+ *          MACHINE_VER_DEPRECATION(__VA_ARGS__); \
  *          if (latest) { \
  *              mc->alias = "virt"; \
  *          } \
@@ -438,6 +439,7 @@ struct MachineState {
  *      }; \
  *      static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
  *      { \
+ *          MACHINE_VER_DELETION(__VA_ARGS__); \
  *          type_register_static(&MACHINE_VER_SYM(info, virt, __VA_ARGS__)); \
  *      } \
  *      type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
@@ -580,6 +582,88 @@ struct MachineState {
                       _MACHINE_VER_SYM2) (sym, prefix, __VA_ARGS__)
 
 
+/*
+ * How many years/major releases for each phase
+ * of the life cycle. Assumes use of versioning
+ * scheme where major is bumped each year
+ */
+#define MACHINE_VER_DELETION_MAJOR 6
+#define MACHINE_VER_DEPRECATION_MAJOR 3
+
+/*
+ * Expands to a static string containing a deprecation
+ * message for a versioned machine type
+ */
+#define MACHINE_VER_DEPRECATION_MSG \
+    "machines more than " stringify(MACHINE_VER_DEPRECATION_MAJOR) \
+    " years old are subject to deletion after " \
+    stringify(MACHINE_VER_DELETION_MAJOR) " years"
+
+#define _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor) \
+    (((QEMU_VERSION_MAJOR - major) > cutoff) || \
+     (((QEMU_VERSION_MAJOR - major) == cutoff) && \
+      (QEMU_VERSION_MINOR - minor) >= 0))
+
+#define _MACHINE_VER_IS_EXPIRED2(cutoff, major, minor) \
+    _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
+#define _MACHINE_VER_IS_EXPIRED3(cutoff, major, minor, micro) \
+    _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
+#define _MACHINE_VER_IS_EXPIRED4(cutoff, major, minor, _unused, tag) \
+    _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
+#define _MACHINE_VER_IS_EXPIRED5(cutoff, major, minor, micro, _unused, tag)   \
+    _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor)
+
+#define _MACHINE_IS_EXPIRED(cutoff, ...) \
+    _MACHINE_VER_PICK(__VA_ARGS__, \
+                      _MACHINE_VER_IS_EXPIRED5, \
+                      _MACHINE_VER_IS_EXPIRED4, \
+                      _MACHINE_VER_IS_EXPIRED3, \
+                      _MACHINE_VER_IS_EXPIRED2) (cutoff, __VA_ARGS__)
+
+/*
+ * Evaluates true when a machine type with (major, minor)
+ * or (major, minor, micro) version should be considered
+ * deprecated based on the current versioned machine type
+ * lifecycle rules
+ */
+#define MACHINE_VER_IS_DEPRECATED(...) \
+    _MACHINE_IS_EXPIRED(MACHINE_VER_DEPRECATION_MAJOR, __VA_ARGS__)
+
+/*
+ * Evaluates true when a machine type with (major, minor)
+ * or (major, minor, micro) version should be considered
+ * for deletion based on the current versioned machine type
+ * lifecycle rules
+ */
+#define MACHINE_VER_SHOULD_DELETE(...) \
+    _MACHINE_IS_EXPIRED(MACHINE_VER_DELETION_MAJOR, __VA_ARGS__)
+
+/*
+ * Sets the deprecation reason for a versioned machine based
+ * on its lifecycle
+ *
+ * This must be unconditionally used in the _class_init
+ * function for all machine types which support versioning.
+ *
+ * Initially it will be an effective no-op, but after a
+ * suitable period of time has passed, it will set the
+ * 'deprecation_reason' field on the machine, to warn users
+ * about forthcoming removal.
+ */
+#define MACHINE_VER_DEPRECATION(...) \
+    do { \
+        if (MACHINE_VER_IS_DEPRECATED(__VA_ARGS__)) { \
+            mc->deprecation_reason = MACHINE_VER_DEPRECATION_MSG; \
+        } \
+    } while (0)
+
+#define MACHINE_VER_DELETION(...) \
+    do { \
+        if (MACHINE_VER_SHOULD_DELETE(__VA_ARGS__)) { \
+            return; \
+        } \
+    } while (0)
+
 #define DEFINE_MACHINE(namestr, machine_initfn) \
     static void machine_initfn##_class_init(ObjectClass *oc, void *data) \
     { \
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 09/14] hw: temporarily disable deletion of versioned machine types
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (7 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 08/14] include/hw: add macros for deprecation & removal of versioned machines Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 11:05   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 10/14] hw: set deprecation info for all " Daniel P. Berrangé
                   ` (6 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

The new deprecation and deletion policy for versioned machine types is
being introduced in QEMU 9.1.0.

Under the new policy a number of old machine types (any prior to 2.12)
would be liable for immediate deletion which would be a violation of our
historical deprecation and removal policy

Thus automatic deletions (by skipping QOM registration) are temporarily
gated on existance of the env variable "QEMU_DELETE_MACHINES" / QEMU
version number >= 10.1.0. This allows opt-in testing of the automatic
deletion logic, while activating it fully in QEMU >= 10.1.0.

This whole commit should be reverted in the 10.1.0 dev cycle or shortly
thereafter.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 include/hw/boards.h | 20 +++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/include/hw/boards.h b/include/hw/boards.h
index 48b6c98c77..d6214007ce 100644
--- a/include/hw/boards.h
+++ b/include/hw/boards.h
@@ -657,10 +657,28 @@ struct MachineState {
         } \
     } while (0)
 
+/*
+ * The new deprecation and deletion policy for versioned
+ * machine types was introduced in QEMU 9.1.0.
+ *
+ * Under the new policy a number of old machine types (any
+ * prior to 2.12) would be liable for immediate deletion
+ * which would be a violation of our historical deprecation
+ * and removal policy
+ *
+ * Thus deletions are temporarily gated on existance of
+ * the env variable "QEMU_DELETE_MACHINES" / QEMU version
+ * number >= 10.1.0. This gate can be deleted in the 10.1.0
+ * dev cycle
+ */
 #define MACHINE_VER_DELETION(...) \
     do { \
         if (MACHINE_VER_SHOULD_DELETE(__VA_ARGS__)) { \
-            return; \
+            if (getenv("QEMU_DELETE_MACHINES") || \
+                QEMU_VERSION_MAJOR > 10 || (QEMU_VERSION_MAJOR == 10 && \
+                                            QEMU_VERSION_MINOR >= 1)) { \
+                return; \
+            } \
         } \
     } while (0)
 
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 10/14] hw: set deprecation info for all versioned machine types
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (8 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 09/14] hw: temporarily disable deletion of versioned machine types Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 11:06   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 11/14] hw: skip registration of outdated " Daniel P. Berrangé
                   ` (5 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

This calls the MACHINE_VER_DEPRECATION() macro in the definition of
all machine type classes which support versioning. This ensures
that they will automatically get deprecation info set when they
reach the appropriate point in their lifecycle.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/arm/virt.c              | 1 +
 hw/m68k/virt.c             | 1 +
 hw/ppc/spapr.c             | 1 +
 hw/s390x/s390-virtio-ccw.c | 1 +
 include/hw/i386/pc.h       | 1 +
 5 files changed, 5 insertions(+)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 24b104dfa7..e2e10523a3 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -110,6 +110,7 @@ static void arm_virt_compat_set(MachineClass *mc)
         arm_virt_compat_set(mc); \
         MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
         mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " ARM Virtual Machine"; \
+        MACHINE_VER_DEPRECATION(__VA_ARGS__); \
         if (latest) { \
             mc->alias = "virt"; \
         } \
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index cd6ee692f7..37bb36b385 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -343,6 +343,7 @@ type_init(virt_machine_register_types)
         MachineClass *mc = MACHINE_CLASS(oc); \
         MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
         mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " M68K Virtual Machine"; \
+        MACHINE_VER_DEPRECATION(__VA_ARGS__); \
         if (latest) { \
             mc->alias = "virt"; \
         } \
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 4ab331da57..7f5412f2ed 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4795,6 +4795,7 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
     {                                                                \
         MachineClass *mc = MACHINE_CLASS(oc);                        \
         MACHINE_VER_SYM(class_options, spapr, __VA_ARGS__)(mc);      \
+        MACHINE_VER_DEPRECATION(__VA_ARGS__);                        \
         if (latest) {                                                \
             spapr_machine_latest_class_options(mc);                  \
         }                                                            \
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 9324fecdca..289a687434 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -841,6 +841,7 @@ bool css_migration_enabled(void)
         MachineClass *mc = MACHINE_CLASS(oc);                                 \
         MACHINE_VER_SYM(class_options, ccw, __VA_ARGS__)(mc);                 \
         mc->desc = "Virtual s390x machine (version " MACHINE_VER_STR(__VA_ARGS__) ")"; \
+        MACHINE_VER_DEPRECATION(__VA_ARGS__);                                 \
         if (latest) {                                                         \
             mc->alias = "s390-ccw-virtio";                                    \
             mc->is_default = true;                                            \
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 669263dfca..acc17c7dac 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -327,6 +327,7 @@ extern const size_t pc_compat_2_0_len;
         MachineClass *mc = MACHINE_CLASS(oc); \
         MACHINE_VER_SYM(options, namesym, __VA_ARGS__)(mc); \
         mc->init = MACHINE_VER_SYM(init, namesym, __VA_ARGS__); \
+        MACHINE_VER_DEPRECATION(__VA_ARGS__); \
     } \
     static const TypeInfo MACHINE_VER_SYM(info, namesym, __VA_ARGS__) = \
     { \
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 11/14] hw: skip registration of outdated versioned machine types
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (9 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 10/14] hw: set deprecation info for all " Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 12:02   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 12/14] hw/ppc: remove obsolete manual deprecation reason string of spapr machines Daniel P. Berrangé
                   ` (4 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

This calls the MACHINE_VER_DELETION() macro in the machine type
registration method, so that when a versioned machine type reaches
the end of its life, it is no longer registered with QOM and thus
cannot be used.

The actual definition of the machine type should be deleted at
this point, but experience shows that can easily be forgotten.
By skipping registration the manual code deletion task can be
done at any later date.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/arm/virt.c              | 1 +
 hw/m68k/virt.c             | 1 +
 hw/ppc/spapr.c             | 1 +
 hw/s390x/s390-virtio-ccw.c | 1 +
 include/hw/i386/pc.h       | 1 +
 5 files changed, 5 insertions(+)

diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index e2e10523a3..0786f82da6 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -123,6 +123,7 @@ static void arm_virt_compat_set(MachineClass *mc)
     }; \
     static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
     { \
+        MACHINE_VER_DELETION(__VA_ARGS__); \
         type_register_static(&MACHINE_VER_SYM(info, virt, __VA_ARGS__)); \
     } \
     type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
diff --git a/hw/m68k/virt.c b/hw/m68k/virt.c
index 37bb36b385..cda199af8f 100644
--- a/hw/m68k/virt.c
+++ b/hw/m68k/virt.c
@@ -356,6 +356,7 @@ type_init(virt_machine_register_types)
     }; \
     static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
     { \
+        MACHINE_VER_DELETION(__VA_ARGS__); \
         type_register_static(&MACHINE_VER_SYM(info, virt, __VA_ARGS__)); \
     } \
     type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 7f5412f2ed..2aad99a2f2 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -4808,6 +4808,7 @@ static void spapr_machine_latest_class_options(MachineClass *mc)
     };                                                               \
     static void MACHINE_VER_SYM(register, spapr, __VA_ARGS__)(void)  \
     {                                                                \
+        MACHINE_VER_DELETION(__VA_ARGS__);                           \
         type_register(&MACHINE_VER_SYM(info, spapr, __VA_ARGS__));   \
     }                                                                \
     type_init(MACHINE_VER_SYM(register, spapr, __VA_ARGS__))
diff --git a/hw/s390x/s390-virtio-ccw.c b/hw/s390x/s390-virtio-ccw.c
index 289a687434..723021f644 100644
--- a/hw/s390x/s390-virtio-ccw.c
+++ b/hw/s390x/s390-virtio-ccw.c
@@ -862,6 +862,7 @@ bool css_migration_enabled(void)
     };                                                                        \
     static void MACHINE_VER_SYM(register, ccw, __VA_ARGS__)(void)             \
     {                                                                         \
+        MACHINE_VER_DELETION(__VA_ARGS__);                                    \
         type_register_static(&MACHINE_VER_SYM(info, ccw, __VA_ARGS__));       \
     }                                                                         \
     type_init(MACHINE_VER_SYM(register, ccw, __VA_ARGS__))
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index acc17c7dac..a605f223d5 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -337,6 +337,7 @@ extern const size_t pc_compat_2_0_len;
     }; \
     static void MACHINE_VER_SYM(register, namesym, __VA_ARGS__)(void) \
     { \
+        MACHINE_VER_DELETION(__VA_ARGS__); \
         type_register(&MACHINE_VER_SYM(info, namesym, __VA_ARGS__)); \
     } \
     type_init(MACHINE_VER_SYM(register, namesym, __VA_ARGS__));
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 12/14] hw/ppc: remove obsolete manual deprecation reason string of spapr machines
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (10 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 11/14] hw: skip registration of outdated " Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 12:04   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 13/14] hw/i386: remove obsolete manual deprecation reason string of i440fx machines Daniel P. Berrangé
                   ` (3 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

The automatic deprecation mechanism introduced in the preceeding patches
will mark every spapr machine upto and including 2.12 as deprecated. As
such we can revert the manually added deprecation which was a subset:

  commit 1392617d35765d5d912625fbb5cab1ffbed8e140
  Author: Cédric Le Goater <clg@kaod.org>
  Date:   Tue Jan 23 16:37:02 2024 +1000

    spapr: Tag pseries-2.1 - 2.11 machines as deprecated

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/ppc/spapr.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/hw/ppc/spapr.c b/hw/ppc/spapr.c
index 2aad99a2f2..1b8fa71eb8 100644
--- a/hw/ppc/spapr.c
+++ b/hw/ppc/spapr.c
@@ -5140,7 +5140,6 @@ static void spapr_machine_2_11_class_options(MachineClass *mc)
     spapr_machine_2_12_class_options(mc);
     smc->default_caps.caps[SPAPR_CAP_HTM] = SPAPR_CAP_ON;
     compat_props_add(mc->compat_props, hw_compat_2_11, hw_compat_2_11_len);
-    mc->deprecation_reason = "old and not maintained - use a 2.12+ version";
 }
 
 DEFINE_SPAPR_MACHINE(2, 11);
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 13/14] hw/i386: remove obsolete manual deprecation reason string of i440fx machines
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (11 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 12/14] hw/ppc: remove obsolete manual deprecation reason string of spapr machines Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02 12:08   ` Thomas Huth
  2024-05-01 18:27 ` [PATCH 14/14] docs: document special exception for machine type deprecation & removal Daniel P. Berrangé
                   ` (2 subsequent siblings)
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

The automatic deprecation mechanism introduced in the preceeding patches
will mark every i440fx machine upto and including 2.12 as deprecated. As
such we can revert the manually added deprecation which was a subset:

  commit c7437f0ddb8ee45bf96d949ddfcbb7697ae3d415
  Author: Thomas Huth <thuth@redhat.com>
  Date:   Fri Oct 6 09:52:47 2023 +0200

    docs/about: Mark the old pc-i440fx-2.0 - 2.3 machine types as deprecated

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 hw/i386/pc_piix.c | 1 -
 1 file changed, 1 deletion(-)

diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
index 9f92504cc4..4137e03f6f 100644
--- a/hw/i386/pc_piix.c
+++ b/hw/i386/pc_piix.c
@@ -812,7 +812,6 @@ static void pc_i440fx_machine_2_3_options(MachineClass *m)
 {
     pc_i440fx_machine_2_4_options(m);
     m->hw_version = "2.3.0";
-    m->deprecation_reason = "old and unattended - use a newer version instead";
     compat_props_add(m->compat_props, hw_compat_2_3, hw_compat_2_3_len);
     compat_props_add(m->compat_props, pc_compat_2_3, pc_compat_2_3_len);
 }
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* [PATCH 14/14] docs: document special exception for machine type deprecation & removal
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (12 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 13/14] hw/i386: remove obsolete manual deprecation reason string of i440fx machines Daniel P. Berrangé
@ 2024-05-01 18:27 ` Daniel P. Berrangé
  2024-05-02  9:47   ` Thomas Huth
  2024-05-03 11:46 ` [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Cédric Le Goater
  2024-05-03 12:14 ` Peter Maydell
  15 siblings, 1 reply; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-01 18:27 UTC (permalink / raw
  To: qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x,
	Daniel P. Berrangé

This extends the deprecation policy to indicate that versioned machine
types will be marked deprecated after 3 years, and then subject to
removal after a further 3 years has passed.

Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
---
 docs/about/deprecated.rst | 12 ++++++++++++
 1 file changed, 12 insertions(+)

diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
index 7b8aafa15b..55120e774c 100644
--- a/docs/about/deprecated.rst
+++ b/docs/about/deprecated.rst
@@ -11,6 +11,18 @@ releases, the feature is liable to be removed. Deprecated features may also
 generate warnings on the console when QEMU starts up, or if activated via a
 monitor command, however, this is not a mandatory requirement.
 
+As a special exception to this general timeframe, rather than have an
+indefinite lifetime, versioned machine types are only intended to be
+supported for a period of 6 years, equivalent to 18 QEMU releases. All
+versioned machine types will be automatically marked deprecated after an
+initial 3 years (9 QEMU releases) has passed, and will then be deleted after
+a further 3 year period has passed. It is recommended that a deprecated
+machine type is only used for incoming migrations and restore of saved state,
+for pre-existing VM deployments. Newly deployed VMs should exclusively use a
+non-deprecated machine type, with use of the most recent version highly
+recommended. Non-versioned machine types follow the general feature
+deprecation policy.
+
 Prior to the 2.10.0 release there was no official policy on how
 long features would be deprecated prior to their removal, nor
 any documented list of which features were deprecated. Thus
-- 
2.43.0



^ permalink raw reply related	[flat|nested] 38+ messages in thread

* Re: [PATCH 14/14] docs: document special exception for machine type deprecation & removal
  2024-05-01 18:27 ` [PATCH 14/14] docs: document special exception for machine type deprecation & removal Daniel P. Berrangé
@ 2024-05-02  9:47   ` Thomas Huth
  2024-05-02  9:53     ` Daniel P. Berrangé
  0 siblings, 1 reply; 38+ messages in thread
From: Thomas Huth @ 2024-05-02  9:47 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> This extends the deprecation policy to indicate that versioned machine
> types will be marked deprecated after 3 years, and then subject to
> removal after a further 3 years has passed.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   docs/about/deprecated.rst | 12 ++++++++++++
>   1 file changed, 12 insertions(+)
> 
> diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
> index 7b8aafa15b..55120e774c 100644
> --- a/docs/about/deprecated.rst
> +++ b/docs/about/deprecated.rst
> @@ -11,6 +11,18 @@ releases, the feature is liable to be removed. Deprecated features may also
>   generate warnings on the console when QEMU starts up, or if activated via a
>   monitor command, however, this is not a mandatory requirement.
>   
> +As a special exception to this general timeframe, rather than have an
> +indefinite lifetime, versioned machine types are only intended to be
> +supported for a period of 6 years, equivalent to 18 QEMU releases. All
> +versioned machine types will be automatically marked deprecated after an
> +initial 3 years (9 QEMU releases) has passed, and will then be deleted after

Should there be the word "period" after "3 years" ? Otherwise it sounds a 
little bit weird to me - but I'm also not a native speaker, so I might be wrong.

> +a further 3 year period has passed. It is recommended that a deprecated
> +machine type is only used for incoming migrations and restore of saved state,
> +for pre-existing VM deployments.

Should we maybe add a sentence that they should ideally be updated to a 
newer machine type during a service window with downtime? (well, it might be 
also obvious, so maybe not worth to mention it)

>  Newly deployed VMs should exclusively use a
> +non-deprecated machine type, with use of the most recent version highly
> +recommended. Non-versioned machine types follow the general feature
> +deprecation policy.

Anyway:
Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 14/14] docs: document special exception for machine type deprecation & removal
  2024-05-02  9:47   ` Thomas Huth
@ 2024-05-02  9:53     ` Daniel P. Berrangé
  0 siblings, 0 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-02  9:53 UTC (permalink / raw
  To: Thomas Huth
  Cc: qemu-devel, Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On Thu, May 02, 2024 at 11:47:40AM +0200, Thomas Huth wrote:
> On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> > This extends the deprecation policy to indicate that versioned machine
> > types will be marked deprecated after 3 years, and then subject to
> > removal after a further 3 years has passed.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> >   docs/about/deprecated.rst | 12 ++++++++++++
> >   1 file changed, 12 insertions(+)
> > 
> > diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst
> > index 7b8aafa15b..55120e774c 100644
> > --- a/docs/about/deprecated.rst
> > +++ b/docs/about/deprecated.rst
> > @@ -11,6 +11,18 @@ releases, the feature is liable to be removed. Deprecated features may also
> >   generate warnings on the console when QEMU starts up, or if activated via a
> >   monitor command, however, this is not a mandatory requirement.
> > +As a special exception to this general timeframe, rather than have an
> > +indefinite lifetime, versioned machine types are only intended to be
> > +supported for a period of 6 years, equivalent to 18 QEMU releases. All
> > +versioned machine types will be automatically marked deprecated after an
> > +initial 3 years (9 QEMU releases) has passed, and will then be deleted after
> 
> Should there be the word "period" after "3 years" ? Otherwise it sounds a
> little bit weird to me - but I'm also not a native speaker, so I might be
> wrong.

It would be valid to say either  "3 year period" or "3 years", but
not "3 years period".
 
> > +a further 3 year period has passed. It is recommended that a deprecated
> > +machine type is only used for incoming migrations and restore of saved state,
> > +for pre-existing VM deployments.
> 
> Should we maybe add a sentence that they should ideally be updated to a
> newer machine type during a service window with downtime? (well, it might be
> also obvious, so maybe not worth to mention it)

Sure, I'm fine adding something about that, as it helps to steer people
in the sane direction.

> >  Newly deployed VMs should exclusively use a
> > +non-deprecated machine type, with use of the most recent version highly
> > +recommended. Non-versioned machine types follow the general feature
> > +deprecation policy.
> 
> Anyway:
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> 

With 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 :|



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 01/14] include/hw: add helpers for defining versioned machine types
  2024-05-01 18:27 ` [PATCH 01/14] include/hw: add helpers for defining versioned machine types Daniel P. Berrangé
@ 2024-05-02 10:34   ` Thomas Huth
  2024-05-09 14:39     ` Daniel P. Berrangé
  2024-05-02 14:57   ` Eric Blake
  1 sibling, 1 reply; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 10:34 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> The various targets which define versioned machine types have
> a bunch of obfuscated macro code for defining unique function
> and variable names using string concatenation.
> 
> This addes a couple of helpers to improve the clarity of such
> code macro.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   include/hw/boards.h | 166 ++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 166 insertions(+)
> 
> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index 2fa800f11a..47ca450fca 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -414,6 +414,172 @@ struct MachineState {
>       struct NumaState *numa_state;
>   };
>   
> +/*
> + * The macros which follow are intended to facilitate the
> + * definition of versioned machine types, using a somewhat
> + * similar pattern across targets:

I'd suggest to add a sentence at the end saying something like this: "For 
example, to create the macro for setting up a versioned "virt" machine could 
look like this:" (otherwise it's not immediately clear whether the example 
is about only the "macros which follow" or whether it's about how to set up 
a machine type)

> + *  #define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
> + *      static void MACHINE_VER_SYM(class_init, virt, __VA_ARGS__)( \
> + *          ObjectClass *oc, \
> + *          void *data) \
> + *      { \
> + *          MachineClass *mc = MACHINE_CLASS(oc); \
> + *          MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
> + *          mc->desc = "QEMU " MACHINE_VER_STR(__VA_ARGS__) " Virtual Machine"; \
> + *          if (latest) { \
> + *              mc->alias = "virt"; \
> + *          } \
> + *      } \
> + *      static const TypeInfo MACHINE_VER_SYM(info, virt, __VA_ARGS__) = { \
> + *          .name = MACHINE_VER_TYPE_NAME("virt", __VA_ARGS__), \
> + *          .parent = TYPE_VIRT_MACHINE, \
> + *          .class_init = MACHINE_VER_SYM(class_init, virt, __VA_ARGS__), \
> + *      }; \
> + *      static void MACHINE_VER_SYM(register, virt, __VA_ARGS__)(void) \
> + *      { \
> + *          type_register_static(&MACHINE_VER_SYM(info, virt, __VA_ARGS__)); \
> + *      } \
> + *      type_init(MACHINE_VER_SYM(register, virt, __VA_ARGS__));
> + *
> + * Following this, one (or more) helpers can be added for
> + * whichever scenarios need to be catered for with a machine:
> + *
> + *  // Normal 2 digit, marked as latest eg 'virt-9.0'
> + *  #define DEFINE_VIRT_MACHINE_LATEST(major, minor) \
> + *      DEFINE_VIRT_MACHINE_IMPL(true, major, minor)
> + *
> + *  // Normal 2 digit eg 'virt-9.0'
> + *  #define DEFINE_VIRT_MACHINE(major, minor) \
> + *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor)
> + *
> + *  // Bugfix 3 digit  eg 'virt-9.0.1'
> + *  #define DEFINE_VIRT_MACHINE_BUGFIX(major, minor, micro) \
> + *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor, micro)
> + *
> + *  // Tagged 2 digit  eg 'virt-9.0-extra'
> + *  #define DEFINE_VIRT_MACHINE_TAGGED(major, minor, tag) \
> + *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor, _, tag)
> + *
> + *  // Tagged bugffix 2 digit  eg 'virt-9.0.1-extra'

s/bugffix/bugfix/

> + *  #define DEFINE_VIRT_MACHINE_TAGGED(major, minor, micro, tag) \
> + *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor, micro, _, tag)
> + */

I'd suggest to add a separate comment for the macro below, explaining that 
it is supposed to be used with __VA_ARGS__ to pick a certain other macro 
depending on the amount of entries in __VA_ARGS__.

> +#define _MACHINE_VER_PICK(x1, x2, x3, x4, x5, x6, ...) x6
> +
> +/*
> + * Construct a human targetted machine version string.

s/targetted/targeted/ according to my spell checker ?

Apart from the nits:
Reviewed-by: Thomas Huth <thuth@redhat.com>

  Thomas



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 08/14] include/hw: add macros for deprecation & removal of versioned machines
  2024-05-01 18:27 ` [PATCH 08/14] include/hw: add macros for deprecation & removal of versioned machines Daniel P. Berrangé
@ 2024-05-02 10:59   ` Thomas Huth
  2024-05-09 14:42     ` Daniel P. Berrangé
  0 siblings, 1 reply; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 10:59 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> Versioned machines live for a long time to provide back compat for
> incoming migration and restore of saved images. To guide users away from
> usage of old machines, however, we want to deprecate any older than 3
> years (equiv of 9 releases), and delete any older than 6 years (equiva
> of 18 releases).
> 
> To get a standardized deprecation message and avoid having to remember
> to manually add it after three years, this introduces two macros to be
> used by targets when defining versioned machines.
> 
> * MACHINE_VER_DEPRECATION(major, minor)
> 
>    Automates the task of setting the 'deprecation_reason' field on the
>    machine, if-and-only-if the major/minor version is older than 3 years.
> 
> * MACHINE_VER_DEPRECATION(major, minor)

That should be MACHINE_VER_DELETION instead.

>    Simulates the deletion of by skipping registration of the QOM type
>    for a versioned machine, if-and-only-if the major/minor version is
>    older than 6 years.
> 
> By using these two macros there is no longer any manual work required
> per-release to deprecate old machines. By preventing the use of machines
> that have reached their deletion date, it is also no neccessary to

s/neccessary/necessary/

> manually delete machines per-release. Deletion can be batched up once a
> year or whenever makes most sense.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   include/hw/boards.h | 84 +++++++++++++++++++++++++++++++++++++++++++++
>   1 file changed, 84 insertions(+)

With the typos fixed:
Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 09/14] hw: temporarily disable deletion of versioned machine types
  2024-05-01 18:27 ` [PATCH 09/14] hw: temporarily disable deletion of versioned machine types Daniel P. Berrangé
@ 2024-05-02 11:05   ` Thomas Huth
  2024-05-02 11:13     ` Daniel P. Berrangé
  0 siblings, 1 reply; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 11:05 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> The new deprecation and deletion policy for versioned machine types is
> being introduced in QEMU 9.1.0.
> 
> Under the new policy a number of old machine types (any prior to 2.12)
> would be liable for immediate deletion which would be a violation of our
> historical deprecation and removal policy
> 
> Thus automatic deletions (by skipping QOM registration) are temporarily
> gated on existance of the env variable "QEMU_DELETE_MACHINES" / QEMU
> version number >= 10.1.0. This allows opt-in testing of the automatic
> deletion logic, while activating it fully in QEMU >= 10.1.0.

If we include your patches now, the old machine types will be marked as 
deprecated in QEMU 9.1 and 9.2, so it should be OK to remove them in 10.0 
already, shouldn't it?

  Thomas



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 10/14] hw: set deprecation info for all versioned machine types
  2024-05-01 18:27 ` [PATCH 10/14] hw: set deprecation info for all " Daniel P. Berrangé
@ 2024-05-02 11:06   ` Thomas Huth
  0 siblings, 0 replies; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 11:06 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> This calls the MACHINE_VER_DEPRECATION() macro in the definition of
> all machine type classes which support versioning. This ensures
> that they will automatically get deprecation info set when they
> reach the appropriate point in their lifecycle.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   hw/arm/virt.c              | 1 +
>   hw/m68k/virt.c             | 1 +
>   hw/ppc/spapr.c             | 1 +
>   hw/s390x/s390-virtio-ccw.c | 1 +
>   include/hw/i386/pc.h       | 1 +
>   5 files changed, 5 insertions(+)

Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 03/14] hw/s390x: convert 'ccw' machine definitions to use new macros
  2024-05-01 18:27 ` [PATCH 03/14] hw/s390x: convert 'ccw' " Daniel P. Berrangé
@ 2024-05-02 11:12   ` Thomas Huth
  0 siblings, 0 replies; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 11:12 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> This changes the DEFINE_CCW_MACHINE macro to use the common
> helpers for constructing versioned symbol names and strings,
> bringing greater consistency across targets.
> 
> The added benefit is that it avoids the need to repeat the
> version number twice in two different formats in the calls
> to DEFINE_CCW_MACHINE.
> 
> A DEFINE_CCW_MACHINE_AS_LATEST helper is added so that it
> is not required to pass 'false' for every single historical
> machine type.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   hw/s390x/s390-virtio-ccw.c | 96 +++++++++++++++++++++-----------------
>   1 file changed, 53 insertions(+), 43 deletions(-)

Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 09/14] hw: temporarily disable deletion of versioned machine types
  2024-05-02 11:05   ` Thomas Huth
@ 2024-05-02 11:13     ` Daniel P. Berrangé
  0 siblings, 0 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-02 11:13 UTC (permalink / raw
  To: Thomas Huth
  Cc: qemu-devel, Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On Thu, May 02, 2024 at 01:05:20PM +0200, Thomas Huth wrote:
> On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> > The new deprecation and deletion policy for versioned machine types is
> > being introduced in QEMU 9.1.0.
> > 
> > Under the new policy a number of old machine types (any prior to 2.12)
> > would be liable for immediate deletion which would be a violation of our
> > historical deprecation and removal policy
> > 
> > Thus automatic deletions (by skipping QOM registration) are temporarily
> > gated on existance of the env variable "QEMU_DELETE_MACHINES" / QEMU
> > version number >= 10.1.0. This allows opt-in testing of the automatic
> > deletion logic, while activating it fully in QEMU >= 10.1.0.
> 
> If we include your patches now, the old machine types will be marked as
> deprecated in QEMU 9.1 and 9.2, so it should be OK to remove them in 10.0
> already, shouldn't it?

Yes, the deprecation marking still happens on the correct documented
schedule. We're merely postponing the removal to be nice.

IOW, when 10.0 arrives, we'll be able to delete everything upto and
including version 4.0, so at that point 4.1 will be the oldest
machine present.

Without this patch, we would be removing everything upto and including
3.1 straight away with no prior warning. With this patch everything
is still present, under the old deprecation 2 release policy.

With 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 :|



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 04/14] hw/ppc: convert 'spapr' machine definitions to use new macros
  2024-05-01 18:27 ` [PATCH 04/14] hw/ppc: convert 'spapr' " Daniel P. Berrangé
@ 2024-05-02 11:57   ` Thomas Huth
  0 siblings, 0 replies; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 11:57 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> This changes the DEFINE_SPAPR_MACHINE macro to use the common
> helpers for constructing versioned symbol names and strings,
> bringing greater consistency across targets.
> 
> The added benefit is that it avoids the need to repeat the
> version number twice in two different formats in the calls
> to DEFINE_SPAPR_MACHINE.
> 
> A DEFINE_SPAPR_MACHINE_AS_LATEST helper is added so that it
> is not required to pass 'false' for every single historical
> machine type.
> 
> Due to the odd-ball '2.12-sxxm' machine type version, this
> commit introduces a DEFINE_SPAPR_MACHINE_TAGGED helper to
> allow defining of "tagged" machine types which have a string
> suffix.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   hw/ppc/spapr.c | 93 +++++++++++++++++++++++++++-----------------------
>   1 file changed, 51 insertions(+), 42 deletions(-)

Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 05/14] hw/m68k: convert 'virt' machine definitions to use new macros
  2024-05-01 18:27 ` [PATCH 05/14] hw/m68k: convert 'virt' " Daniel P. Berrangé
@ 2024-05-02 12:00   ` Thomas Huth
  0 siblings, 0 replies; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 12:00 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> This changes the DEFINE_VIRT_MACHINE macro to use the common
> helpers for constructing versioned symbol names and strings,
> bringing greater consistency across targets.
> 
> A DEFINE_VIRT_MACHINE_AS_LATEST helper is added so that it
> is not required to pass 'false' for every single historical
> machine type.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   hw/m68k/virt.c | 51 ++++++++++++++++++++++++++++----------------------
>   1 file changed, 29 insertions(+), 22 deletions(-)

Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 11/14] hw: skip registration of outdated versioned machine types
  2024-05-01 18:27 ` [PATCH 11/14] hw: skip registration of outdated " Daniel P. Berrangé
@ 2024-05-02 12:02   ` Thomas Huth
  0 siblings, 0 replies; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 12:02 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> This calls the MACHINE_VER_DELETION() macro in the machine type
> registration method, so that when a versioned machine type reaches
> the end of its life, it is no longer registered with QOM and thus
> cannot be used.
> 
> The actual definition of the machine type should be deleted at
> this point, but experience shows that can easily be forgotten.
> By skipping registration the manual code deletion task can be
> done at any later date.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   hw/arm/virt.c              | 1 +
>   hw/m68k/virt.c             | 1 +
>   hw/ppc/spapr.c             | 1 +
>   hw/s390x/s390-virtio-ccw.c | 1 +
>   include/hw/i386/pc.h       | 1 +
>   5 files changed, 5 insertions(+)

Reviewed-by: Thomas Huth <thuth@redhat.com>




^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 12/14] hw/ppc: remove obsolete manual deprecation reason string of spapr machines
  2024-05-01 18:27 ` [PATCH 12/14] hw/ppc: remove obsolete manual deprecation reason string of spapr machines Daniel P. Berrangé
@ 2024-05-02 12:04   ` Thomas Huth
  0 siblings, 0 replies; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 12:04 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> The automatic deprecation mechanism introduced in the preceeding patches
> will mark every spapr machine upto and including 2.12 as deprecated. As
> such we can revert the manually added deprecation which was a subset:
> 
>    commit 1392617d35765d5d912625fbb5cab1ffbed8e140
>    Author: Cédric Le Goater <clg@kaod.org>
>    Date:   Tue Jan 23 16:37:02 2024 +1000
> 
>      spapr: Tag pseries-2.1 - 2.11 machines as deprecated
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   hw/ppc/spapr.c | 1 -
>   1 file changed, 1 deletion(-)

Reviewed-by: Thomas Huth <thuth@redhat.com>




^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 13/14] hw/i386: remove obsolete manual deprecation reason string of i440fx machines
  2024-05-01 18:27 ` [PATCH 13/14] hw/i386: remove obsolete manual deprecation reason string of i440fx machines Daniel P. Berrangé
@ 2024-05-02 12:08   ` Thomas Huth
  2024-05-02 12:15     ` Daniel P. Berrangé
  0 siblings, 1 reply; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 12:08 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel, Philippe Mathieu-Daudé
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Cédric Le Goater, Halil Pasic,
	Laurent Vivier, qemu-arm, Daniel Henrique Barboza,
	Eduardo Habkost, qemu-ppc, David Gibson, Ilya Leoshkevich,
	Eric Farman, Christian Borntraeger, Michael S. Tsirkin,
	Paolo Bonzini, Marcel Apfelbaum, David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> The automatic deprecation mechanism introduced in the preceeding patches
> will mark every i440fx machine upto and including 2.12 as deprecated. As
> such we can revert the manually added deprecation which was a subset:
> 
>    commit c7437f0ddb8ee45bf96d949ddfcbb7697ae3d415
>    Author: Thomas Huth <thuth@redhat.com>
>    Date:   Fri Oct 6 09:52:47 2023 +0200
> 
>      docs/about: Mark the old pc-i440fx-2.0 - 2.3 machine types as deprecated
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   hw/i386/pc_piix.c | 1 -
>   1 file changed, 1 deletion(-)
> 
> diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> index 9f92504cc4..4137e03f6f 100644
> --- a/hw/i386/pc_piix.c
> +++ b/hw/i386/pc_piix.c
> @@ -812,7 +812,6 @@ static void pc_i440fx_machine_2_3_options(MachineClass *m)
>   {
>       pc_i440fx_machine_2_4_options(m);
>       m->hw_version = "2.3.0";
> -    m->deprecation_reason = "old and unattended - use a newer version instead";
>       compat_props_add(m->compat_props, hw_compat_2_3, hw_compat_2_3_len);
>       compat_props_add(m->compat_props, pc_compat_2_3, pc_compat_2_3_len);
>   }

This will conflict with Philippe's "hw/i386: Remove deprecated pc-i440fx-2.0 
-> 2.3 machines" patch series (which should easy to resolve, though).

Anyway:
Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 02/14] hw/arm: convert 'virt' machine definitions to use new macros
  2024-05-01 18:27 ` [PATCH 02/14] hw/arm: convert 'virt' machine definitions to use new macros Daniel P. Berrangé
@ 2024-05-02 12:11   ` Thomas Huth
  0 siblings, 0 replies; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 12:11 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> This changes the DEFINE_VIRT_MACHINE macro to use the common
> helpers for constructing versioned symbol names and strings,
> bringing greater consistency across targets.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>   hw/arm/virt.c | 28 +++++++++++++++-------------
>   1 file changed, 15 insertions(+), 13 deletions(-)

Reviewed-by: Thomas Huth <thuth@redhat.com>



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 13/14] hw/i386: remove obsolete manual deprecation reason string of i440fx machines
  2024-05-02 12:08   ` Thomas Huth
@ 2024-05-02 12:15     ` Daniel P. Berrangé
  0 siblings, 0 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-02 12:15 UTC (permalink / raw
  To: Thomas Huth
  Cc: qemu-devel, Philippe Mathieu-Daudé, Harsh Prateek Bora,
	Peter Maydell, Nicholas Piggin, Richard Henderson, Yanan Wang,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On Thu, May 02, 2024 at 02:08:58PM +0200, Thomas Huth wrote:
> On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> > The automatic deprecation mechanism introduced in the preceeding patches
> > will mark every i440fx machine upto and including 2.12 as deprecated. As
> > such we can revert the manually added deprecation which was a subset:
> > 
> >    commit c7437f0ddb8ee45bf96d949ddfcbb7697ae3d415
> >    Author: Thomas Huth <thuth@redhat.com>
> >    Date:   Fri Oct 6 09:52:47 2023 +0200
> > 
> >      docs/about: Mark the old pc-i440fx-2.0 - 2.3 machine types as deprecated
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> >   hw/i386/pc_piix.c | 1 -
> >   1 file changed, 1 deletion(-)
> > 
> > diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c
> > index 9f92504cc4..4137e03f6f 100644
> > --- a/hw/i386/pc_piix.c
> > +++ b/hw/i386/pc_piix.c
> > @@ -812,7 +812,6 @@ static void pc_i440fx_machine_2_3_options(MachineClass *m)
> >   {
> >       pc_i440fx_machine_2_4_options(m);
> >       m->hw_version = "2.3.0";
> > -    m->deprecation_reason = "old and unattended - use a newer version instead";
> >       compat_props_add(m->compat_props, hw_compat_2_3, hw_compat_2_3_len);
> >       compat_props_add(m->compat_props, pc_compat_2_3, pc_compat_2_3_len);
> >   }
> 
> This will conflict with Philippe's "hw/i386: Remove deprecated pc-i440fx-2.0
> -> 2.3 machines" patch series (which should easy to resolve, though).

Yep, there are a few places in my series which will conflict with
that.

I've just looked at Philippe's code and everything has at least
one R-b. I had a minor comment but I could address that in this
series.

IOW, ideally we could merge Philippe's series now, to reduce
code in flight touching the same areas.

> Anyway:
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> 

With 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 :|



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 01/14] include/hw: add helpers for defining versioned machine types
  2024-05-01 18:27 ` [PATCH 01/14] include/hw: add helpers for defining versioned machine types Daniel P. Berrangé
  2024-05-02 10:34   ` Thomas Huth
@ 2024-05-02 14:57   ` Eric Blake
  2024-05-02 16:54     ` Thomas Huth
  2024-05-09 14:39     ` Daniel P. Berrangé
  1 sibling, 2 replies; 38+ messages in thread
From: Eric Blake @ 2024-05-02 14:57 UTC (permalink / raw
  To: Daniel P. Berrangé
  Cc: qemu-devel, Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x

On Wed, May 01, 2024 at 07:27:46PM +0100, Daniel P. Berrangé wrote:
> The various targets which define versioned machine types have
> a bunch of obfuscated macro code for defining unique function
> and variable names using string concatenation.
> 
> This addes a couple of helpers to improve the clarity of such
> code macro.
> 
> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> ---
>  include/hw/boards.h | 166 ++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 166 insertions(+)
> 
> diff --git a/include/hw/boards.h b/include/hw/boards.h
> index 2fa800f11a..47ca450fca 100644
> --- a/include/hw/boards.h
> +++ b/include/hw/boards.h
> @@ -414,6 +414,172 @@ struct MachineState {
>      struct NumaState *numa_state;
>  };
>  
> +/*
> + * The macros which follow are intended to facilitate the
> + * definition of versioned machine types, using a somewhat
> + * similar pattern across targets:
> + *
> + *  #define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
> + *      static void MACHINE_VER_SYM(class_init, virt, __VA_ARGS__)( \
> + *          ObjectClass *oc, \
> + *          void *data) \
> + *      { \
> + *          MachineClass *mc = MACHINE_CLASS(oc); \
> + *          MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \

Nice to include example usage of the macros.  __VA_ARGS__ is getting
expanded quite a few times here, but I don't see that as being too
much of a problem.

> + *  // Normal 2 digit eg 'virt-9.0'
> + *  #define DEFINE_VIRT_MACHINE(major, minor) \
> + *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor)
> + *
> + *  // Bugfix 3 digit  eg 'virt-9.0.1'

Inconsistent on whether you are using one or two spaces before 'eg'.

> +
> +#define _MACHINE_VER_PICK(x1, x2, x3, x4, x5, x6, ...) x6

This helper macro is powerful; it may be worth a short comment, maybe
along the lines of:

/* Helper macro used to pick the right macro name based on the number
 * of extra arguments passed to the containing macro; usage:
 *
 *  _MACHINE_VER_PICK(__VA_ARGS__, \
 *                    MACRO_FOR_5_ARGS, \
 *                    MACRO_FOR_4_ARGS, \
 *                    MACRO_FOR_3_ARGS, \
 *                    MACRO_FOR_2_ARGS)(optional prefix args, __VA_ARGS__)
 */

But once understood, I see it comes in handy in several places below.

Reviewed-by: Eric Blake <eblake@redhat.com>

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.
Virtualization:  qemu.org | libguestfs.org



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 01/14] include/hw: add helpers for defining versioned machine types
  2024-05-02 14:57   ` Eric Blake
@ 2024-05-02 16:54     ` Thomas Huth
  2024-05-09 14:39     ` Daniel P. Berrangé
  1 sibling, 0 replies; 38+ messages in thread
From: Thomas Huth @ 2024-05-02 16:54 UTC (permalink / raw
  To: Eric Blake, Daniel P. Berrangé
  Cc: qemu-devel, Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 02/05/2024 16.57, Eric Blake wrote:
> On Wed, May 01, 2024 at 07:27:46PM +0100, Daniel P. Berrangé wrote:
>> The various targets which define versioned machine types have
>> a bunch of obfuscated macro code for defining unique function
>> and variable names using string concatenation.
>>
>> This addes a couple of helpers to improve the clarity of such
>> code macro.
>>
>> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
>> ---
...
>> + *  // Normal 2 digit eg 'virt-9.0'
>> + *  #define DEFINE_VIRT_MACHINE(major, minor) \
>> + *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor)
>> + *
>> + *  // Bugfix 3 digit  eg 'virt-9.0.1'
> 
> Inconsistent on whether you are using one or two spaces before 'eg'.

While you're at it, maybe also better spell it with dots: e.g.

  Thomas




^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (13 preceding siblings ...)
  2024-05-01 18:27 ` [PATCH 14/14] docs: document special exception for machine type deprecation & removal Daniel P. Berrangé
@ 2024-05-03 11:46 ` Cédric Le Goater
  2024-05-03 12:14 ` Peter Maydell
  15 siblings, 0 replies; 38+ messages in thread
From: Cédric Le Goater @ 2024-05-03 11:46 UTC (permalink / raw
  To: Daniel P. Berrangé, qemu-devel
  Cc: Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On 5/1/24 20:27, Daniel P. Berrangé wrote:
> Thomas proposed a new deprecation and removal policy for versioned
> machine types that would see them liable for deletion after 6 years:
> 
>    https://lists.nongnu.org/archive/html/qemu-devel/2024-04/msg04683.html
> 
> This suggest was met with broad approval, however, I suggested that we
> could take it further and actually mark them deprecated sooner, at the
> 3 year timeframe, and also fully automate the enablement of the runtime
> deprecation warning without developer intervention on every release
> cycle.
> 
> This series implements my suggestions.
> 
> The first patch introduces some helper macros and documents a standard
> code pattern for defining versioned machine types across targets.
> 
> The next 6 patches convert existing targets with versioned machine
> types (arm, s390x, ppc, m68k, i386) to use the new helper macros and
> code patterns.
> 
> A further patch introduces some helper macros for automating the
> handling of deprecation and deletion of versioned machine types.
> 
> Two more patches then enable the deprecation and deletion logic
> across all versioned machines
> 
> Finally we do some cleanup and document the new policy.
> 
> ........a tangent about VERSION file handling.......
> 
> One oddity here, is that during the development and release
> candidate phases the automatic logic in this series has an off-by-1
> error.
> 
> This is because when we, for example, add the "9.1" machine type
> versions, the VERSION file is still reporting '9.0.50', and then
> '9.0.9{1,2,3,4}'.
> 
> IOW, during development and in rc candidates, we fail to deprecate
> and delete 1 machine type. We should already have deprecated the
> 6.1 machine types, but the most recently deprecated is 6.0.
> This is pretty harmless since the final release does the right
> thing.
> 
> I wonder, however, whether we would benefit from changing how we
> update the VERSION file.
> 
> eg instead of re-using the micro digit to indicate a dev or rc
> snapshot, represent those explicitly. eg "9.1.0-dev" and
> "9.1.0-rc1", "9.1.0-rc2", etc in VERSION.
> 
> We don't use the full QEMU_VERSION in the code in all that many
> places. It appears in some help messages for command line tools,
> and in QMP query-version response, and in a few other misc places.
> At a glance it appears all of those places would easily handle a
> tagged version.
> 
> For release candidates in particular I think it would be saner
> to show the user the actual version the release is about to become,
> rather than the previous release's version. This would make the
> reported version match the rc tarball naming too which would be
> nice.
> 
> Anyway, this isn't a blocker for this machine type versioning
> proposal, just a thought....

I would agree with such a change. The version numbers always confused
me. AFAICT, only QEMU_VERSION_MICRO would need some massaging. It
shouldn't be too complex.

For the series,

Tested-by: Cédric Le Goater <clg@redhat.com>

Thanks,

C.



> 
> Daniel P. Berrangé (14):
>    include/hw: add helpers for defining versioned machine types
>    hw/arm: convert 'virt' machine definitions to use new macros
>    hw/s390x: convert 'ccw' machine definitions to use new macros
>    hw/ppc: convert 'spapr' machine definitions to use new macros
>    hw/m68k: convert 'virt' machine definitions to use new macros
>    hw/i386: convert 'i440fx' machine definitions to use new macros
>    hw/i386: convert 'q35' machine definitions to use new macros
>    include/hw: add macros for deprecation & removal of versioned machines
>    hw: temporarily disable deletion of versioned machine types
>    hw: set deprecation info for all versioned machine types
>    hw: skip registration of outdated versioned machine types
>    hw/ppc: remove obsolete manual deprecation reason string of spapr
>      machines
>    hw/i386: remove obsolete manual deprecation reason string of i440fx
>      machines
>    docs: document special exception for machine type deprecation &
>      removal
> 
>   docs/about/deprecated.rst  |  12 ++
>   hw/arm/virt.c              |  30 +++--
>   hw/i386/pc_piix.c          | 252 +++++++++++++++-------------------
>   hw/i386/pc_q35.c           | 215 +++++++++++++----------------
>   hw/m68k/virt.c             |  53 +++++---
>   hw/ppc/spapr.c             |  96 +++++++------
>   hw/s390x/s390-virtio-ccw.c |  98 ++++++++------
>   include/hw/boards.h        | 268 +++++++++++++++++++++++++++++++++++++
>   include/hw/i386/pc.h       |  32 +++++
>   9 files changed, 666 insertions(+), 390 deletions(-)
> 



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines
  2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
                   ` (14 preceding siblings ...)
  2024-05-03 11:46 ` [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Cédric Le Goater
@ 2024-05-03 12:14 ` Peter Maydell
  2024-05-03 12:34   ` Daniel P. Berrangé
  15 siblings, 1 reply; 38+ messages in thread
From: Peter Maydell @ 2024-05-03 12:14 UTC (permalink / raw
  To: Daniel P. Berrangé
  Cc: qemu-devel, Harsh Prateek Bora, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x

On Wed, 1 May 2024 at 19:28, Daniel P. Berrangé <berrange@redhat.com> wrote:
> I wonder, however, whether we would benefit from changing how we
> update the VERSION file.
>
> eg instead of re-using the micro digit to indicate a dev or rc
> snapshot, represent those explicitly. eg "9.1.0-dev" and
> "9.1.0-rc1", "9.1.0-rc2", etc in VERSION.
>
> We don't use the full QEMU_VERSION in the code in all that many
> places. It appears in some help messages for command line tools,
> and in QMP query-version response, and in a few other misc places.
> At a glance it appears all of those places would easily handle a
> tagged version.
>
> For release candidates in particular I think it would be saner
> to show the user the actual version the release is about to become,
> rather than the previous release's version. This would make the
> reported version match the rc tarball naming too which would be
> nice.

I think the theory behind the VERSION file is that we want
to be able to express the version:
 * purely numerically
 * in a strictly ascending order

We expose the assumption of numeric versions in places like
QMP's query-version command, which reports it as a set of ints.

I think there's probably scope for making the "human friendly"
version string be surfaced instead of the strictly-numeric
one in more places, but I worry that breaking the "always
numeric and ascending" rule might have subtle breakage for
us or for downstream uses...

thanks
-- PMM


^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines
  2024-05-03 12:14 ` Peter Maydell
@ 2024-05-03 12:34   ` Daniel P. Berrangé
  0 siblings, 0 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-03 12:34 UTC (permalink / raw
  To: Peter Maydell
  Cc: qemu-devel, Harsh Prateek Bora, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x

On Fri, May 03, 2024 at 01:14:27PM +0100, Peter Maydell wrote:
> On Wed, 1 May 2024 at 19:28, Daniel P. Berrangé <berrange@redhat.com> wrote:
> > I wonder, however, whether we would benefit from changing how we
> > update the VERSION file.
> >
> > eg instead of re-using the micro digit to indicate a dev or rc
> > snapshot, represent those explicitly. eg "9.1.0-dev" and
> > "9.1.0-rc1", "9.1.0-rc2", etc in VERSION.
> >
> > We don't use the full QEMU_VERSION in the code in all that many
> > places. It appears in some help messages for command line tools,
> > and in QMP query-version response, and in a few other misc places.
> > At a glance it appears all of those places would easily handle a
> > tagged version.
> >
> > For release candidates in particular I think it would be saner
> > to show the user the actual version the release is about to become,
> > rather than the previous release's version. This would make the
> > reported version match the rc tarball naming too which would be
> > nice.
> 
> I think the theory behind the VERSION file is that we want
> to be able to express the version:
>  * purely numerically
>  * in a strictly ascending order
> 
> We expose the assumption of numeric versions in places like
> QMP's query-version command, which reports it as a set of ints.

Right, we have:

#     -> { "execute": "query-version" }
#     <- {
#           "return":{
#              "qemu":{
#                 "major":0,
#                 "minor":11,
#                 "micro":5
#              },
#              "package":""
#           }
#        }


We could add an extra field to it thus:


#     -> { "execute": "query-version" }
#     <- {
#           "return":{
#              "qemu":{
#                 "major":0,
#                 "minor":11,
#                 "micro":5,
#                 "tag": "rc2"
#              },
#              "package":""
#           }
#        }

arguably we are still in strictly ascending order for the
numeric part, we merely didn't bump the numeric part of
the value at rc releases.

> I think there's probably scope for making the "human friendly"
> version string be surfaced instead of the strictly-numeric
> one in more places, but I worry that breaking the "always
> numeric and ascending" rule might have subtle breakage for
> us or for downstream uses...

Downstream I see no issues. There are already many projects which
use a '-dev' or '-rcNN' suffix for tarballs of unreleased versions,
and distros have guidelines on how they deal with this.

In fact downstream already deals with it for QEMU, because they will
typically set packaging versioning based on the version as seen in
the tarball name, not the different version seen in the VERSION file
(and thus QMP).

With 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 :|



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 01/14] include/hw: add helpers for defining versioned machine types
  2024-05-02 10:34   ` Thomas Huth
@ 2024-05-09 14:39     ` Daniel P. Berrangé
  0 siblings, 0 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-09 14:39 UTC (permalink / raw
  To: Thomas Huth
  Cc: qemu-devel, Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On Thu, May 02, 2024 at 12:34:49PM +0200, Thomas Huth wrote:
> On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> > The various targets which define versioned machine types have
> > a bunch of obfuscated macro code for defining unique function
> > and variable names using string concatenation.
> > 
> > This addes a couple of helpers to improve the clarity of such
> > code macro.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> >   include/hw/boards.h | 166 ++++++++++++++++++++++++++++++++++++++++++++
> >   1 file changed, 166 insertions(+)
> > 
> > diff --git a/include/hw/boards.h b/include/hw/boards.h
> > index 2fa800f11a..47ca450fca 100644
> > --- a/include/hw/boards.h
> > +++ b/include/hw/boards.h
> > @@ -414,6 +414,172 @@ struct MachineState {
> >       struct NumaState *numa_state;
> >   };
> > +/*
> > + * The macros which follow are intended to facilitate the
> > + * definition of versioned machine types, using a somewhat
> > + * similar pattern across targets:
> 
> I'd suggest to add a sentence at the end saying something like this: "For
> example, to create the macro for setting up a versioned "virt" machine could
> look like this:" (otherwise it's not immediately clear whether the example
> is about only the "macros which follow" or whether it's about how to set up
> a machine type)

Yes, will do

> 
> > + *  #define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
> > + *      static void MACHINE_VER_SYM(class_init, virt, __VA_ARGS__)( \
> > + *          ObjectClass *oc, \
> > + *          void *data) \

> > + *  #define DEFINE_VIRT_MACHINE_TAGGED(major, minor, micro, tag) \
> > + *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor, micro, _, tag)
> > + */
> 
> I'd suggest to add a separate comment for the macro below, explaining that
> it is supposed to be used with __VA_ARGS__ to pick a certain other macro
> depending on the amount of entries in __VA_ARGS__.

Yep, Eric had the same suggestion

> 
> > +#define _MACHINE_VER_PICK(x1, x2, x3, x4, x5, x6, ...) x6
> > +
> > +/*
> > + * Construct a human targetted machine version string.
> 
> s/targetted/targeted/ according to my spell checker ?
> 
> Apart from the nits:
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> 
>  Thomas
> 

With 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 :|



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 01/14] include/hw: add helpers for defining versioned machine types
  2024-05-02 14:57   ` Eric Blake
  2024-05-02 16:54     ` Thomas Huth
@ 2024-05-09 14:39     ` Daniel P. Berrangé
  1 sibling, 0 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-09 14:39 UTC (permalink / raw
  To: Eric Blake
  Cc: qemu-devel, Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Thomas Huth, Cédric Le Goater, Halil Pasic, Laurent Vivier,
	qemu-arm, Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc,
	David Gibson, Ilya Leoshkevich, Eric Farman,
	Christian Borntraeger, Michael S. Tsirkin, Paolo Bonzini,
	Marcel Apfelbaum, David Hildenbrand, qemu-s390x

On Thu, May 02, 2024 at 09:57:21AM -0500, Eric Blake wrote:
> On Wed, May 01, 2024 at 07:27:46PM +0100, Daniel P. Berrangé wrote:
> > The various targets which define versioned machine types have
> > a bunch of obfuscated macro code for defining unique function
> > and variable names using string concatenation.
> > 
> > This addes a couple of helpers to improve the clarity of such
> > code macro.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> >  include/hw/boards.h | 166 ++++++++++++++++++++++++++++++++++++++++++++
> >  1 file changed, 166 insertions(+)
> > 
> > diff --git a/include/hw/boards.h b/include/hw/boards.h
> > index 2fa800f11a..47ca450fca 100644
> > --- a/include/hw/boards.h
> > +++ b/include/hw/boards.h
> > @@ -414,6 +414,172 @@ struct MachineState {
> >      struct NumaState *numa_state;
> >  };
> >  
> > +/*
> > + * The macros which follow are intended to facilitate the
> > + * definition of versioned machine types, using a somewhat
> > + * similar pattern across targets:
> > + *
> > + *  #define DEFINE_VIRT_MACHINE_IMPL(latest, ...) \
> > + *      static void MACHINE_VER_SYM(class_init, virt, __VA_ARGS__)( \
> > + *          ObjectClass *oc, \
> > + *          void *data) \
> > + *      { \
> > + *          MachineClass *mc = MACHINE_CLASS(oc); \
> > + *          MACHINE_VER_SYM(options, virt, __VA_ARGS__)(mc); \
> 
> Nice to include example usage of the macros.  __VA_ARGS__ is getting
> expanded quite a few times here, but I don't see that as being too
> much of a problem.
> 
> > + *  // Normal 2 digit eg 'virt-9.0'
> > + *  #define DEFINE_VIRT_MACHINE(major, minor) \
> > + *      DEFINE_VIRT_MACHINE_IMPL(false, major, minor)
> > + *
> > + *  // Bugfix 3 digit  eg 'virt-9.0.1'
> 
> Inconsistent on whether you are using one or two spaces before 'eg'.

Will fix

> 
> > +
> > +#define _MACHINE_VER_PICK(x1, x2, x3, x4, x5, x6, ...) x6
> 
> This helper macro is powerful; it may be worth a short comment, maybe
> along the lines of:
> 
> /* Helper macro used to pick the right macro name based on the number
>  * of extra arguments passed to the containing macro; usage:
>  *
>  *  _MACHINE_VER_PICK(__VA_ARGS__, \
>  *                    MACRO_FOR_5_ARGS, \
>  *                    MACRO_FOR_4_ARGS, \
>  *                    MACRO_FOR_3_ARGS, \
>  *                    MACRO_FOR_2_ARGS)(optional prefix args, __VA_ARGS__)
>  */

Yes, will add something like this

> 
> But once understood, I see it comes in handy in several places below.
> 
> Reviewed-by: Eric Blake <eblake@redhat.com>
> 
> -- 
> Eric Blake, Principal Software Engineer
> Red Hat, Inc.
> Virtualization:  qemu.org | libguestfs.org
> 

With 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 :|



^ permalink raw reply	[flat|nested] 38+ messages in thread

* Re: [PATCH 08/14] include/hw: add macros for deprecation & removal of versioned machines
  2024-05-02 10:59   ` Thomas Huth
@ 2024-05-09 14:42     ` Daniel P. Berrangé
  0 siblings, 0 replies; 38+ messages in thread
From: Daniel P. Berrangé @ 2024-05-09 14:42 UTC (permalink / raw
  To: Thomas Huth
  Cc: qemu-devel, Harsh Prateek Bora, Peter Maydell, Nicholas Piggin,
	Richard Henderson, Yanan Wang, Philippe Mathieu-Daudé,
	Cédric Le Goater, Halil Pasic, Laurent Vivier, qemu-arm,
	Daniel Henrique Barboza, Eduardo Habkost, qemu-ppc, David Gibson,
	Ilya Leoshkevich, Eric Farman, Christian Borntraeger,
	Michael S. Tsirkin, Paolo Bonzini, Marcel Apfelbaum,
	David Hildenbrand, qemu-s390x

On Thu, May 02, 2024 at 12:59:05PM +0200, Thomas Huth wrote:
> On 01/05/2024 20.27, Daniel P. Berrangé wrote:
> > Versioned machines live for a long time to provide back compat for
> > incoming migration and restore of saved images. To guide users away from
> > usage of old machines, however, we want to deprecate any older than 3
> > years (equiv of 9 releases), and delete any older than 6 years (equiva
> > of 18 releases).
> > 
> > To get a standardized deprecation message and avoid having to remember
> > to manually add it after three years, this introduces two macros to be
> > used by targets when defining versioned machines.
> > 
> > * MACHINE_VER_DEPRECATION(major, minor)
> > 
> >    Automates the task of setting the 'deprecation_reason' field on the
> >    machine, if-and-only-if the major/minor version is older than 3 years.
> > 
> > * MACHINE_VER_DEPRECATION(major, minor)
> 
> That should be MACHINE_VER_DELETION instead.

Opps, yes.

> 
> >    Simulates the deletion of by skipping registration of the QOM type
> >    for a versioned machine, if-and-only-if the major/minor version is
> >    older than 6 years.
> > 
> > By using these two macros there is no longer any manual work required
> > per-release to deprecate old machines. By preventing the use of machines
> > that have reached their deletion date, it is also no neccessary to
> 
> s/neccessary/necessary/
> 
> > manually delete machines per-release. Deletion can be batched up once a
> > year or whenever makes most sense.
> > 
> > Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
> > ---
> >   include/hw/boards.h | 84 +++++++++++++++++++++++++++++++++++++++++++++
> >   1 file changed, 84 insertions(+)
> 
> With the typos fixed:
> Reviewed-by: Thomas Huth <thuth@redhat.com>
> 

With 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 :|



^ permalink raw reply	[flat|nested] 38+ messages in thread

end of thread, other threads:[~2024-05-09 14:43 UTC | newest]

Thread overview: 38+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-01 18:27 [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Daniel P. Berrangé
2024-05-01 18:27 ` [PATCH 01/14] include/hw: add helpers for defining versioned machine types Daniel P. Berrangé
2024-05-02 10:34   ` Thomas Huth
2024-05-09 14:39     ` Daniel P. Berrangé
2024-05-02 14:57   ` Eric Blake
2024-05-02 16:54     ` Thomas Huth
2024-05-09 14:39     ` Daniel P. Berrangé
2024-05-01 18:27 ` [PATCH 02/14] hw/arm: convert 'virt' machine definitions to use new macros Daniel P. Berrangé
2024-05-02 12:11   ` Thomas Huth
2024-05-01 18:27 ` [PATCH 03/14] hw/s390x: convert 'ccw' " Daniel P. Berrangé
2024-05-02 11:12   ` Thomas Huth
2024-05-01 18:27 ` [PATCH 04/14] hw/ppc: convert 'spapr' " Daniel P. Berrangé
2024-05-02 11:57   ` Thomas Huth
2024-05-01 18:27 ` [PATCH 05/14] hw/m68k: convert 'virt' " Daniel P. Berrangé
2024-05-02 12:00   ` Thomas Huth
2024-05-01 18:27 ` [PATCH 06/14] hw/i386: convert 'i440fx' " Daniel P. Berrangé
2024-05-01 18:27 ` [PATCH 07/14] hw/i386: convert 'q35' " Daniel P. Berrangé
2024-05-01 18:27 ` [PATCH 08/14] include/hw: add macros for deprecation & removal of versioned machines Daniel P. Berrangé
2024-05-02 10:59   ` Thomas Huth
2024-05-09 14:42     ` Daniel P. Berrangé
2024-05-01 18:27 ` [PATCH 09/14] hw: temporarily disable deletion of versioned machine types Daniel P. Berrangé
2024-05-02 11:05   ` Thomas Huth
2024-05-02 11:13     ` Daniel P. Berrangé
2024-05-01 18:27 ` [PATCH 10/14] hw: set deprecation info for all " Daniel P. Berrangé
2024-05-02 11:06   ` Thomas Huth
2024-05-01 18:27 ` [PATCH 11/14] hw: skip registration of outdated " Daniel P. Berrangé
2024-05-02 12:02   ` Thomas Huth
2024-05-01 18:27 ` [PATCH 12/14] hw/ppc: remove obsolete manual deprecation reason string of spapr machines Daniel P. Berrangé
2024-05-02 12:04   ` Thomas Huth
2024-05-01 18:27 ` [PATCH 13/14] hw/i386: remove obsolete manual deprecation reason string of i440fx machines Daniel P. Berrangé
2024-05-02 12:08   ` Thomas Huth
2024-05-02 12:15     ` Daniel P. Berrangé
2024-05-01 18:27 ` [PATCH 14/14] docs: document special exception for machine type deprecation & removal Daniel P. Berrangé
2024-05-02  9:47   ` Thomas Huth
2024-05-02  9:53     ` Daniel P. Berrangé
2024-05-03 11:46 ` [PATCH 00/14] hw: define and enforce a standard lifecycle for versioned machines Cédric Le Goater
2024-05-03 12:14 ` Peter Maydell
2024-05-03 12:34   ` Daniel P. Berrangé

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.