[PULL 0/6] Versioned machine type deprecation policy patches

The following changes since commit 57b6f8d07f1478375f85a4593a207e936c63ff59: Merge tag 'pull-target-arm-20250506' of https://git.linaro.org/people/pmaydell/qemu-arm into staging (2025-05-07 14:28:20 -0400) are available in the Git repository at: https://gitlab.com/berrange/qemu tags/docs-dep-pull-request for you to fetch changes up to 3fbb0a1397a9acea523f3c8062df8c6f8032788d: include/hw/boards: add warning about changing deprecation logic (2025-05-08 17:11:16 +0100) ---------------------------------------------------------------- * Remove test relying on 4.1 machine type that is about to be disabled * Fix off-by-1 in deprecation/removal logic for versioned machine types to cope with dev/rc versions * Enable logic for disabling registration of versioned machine types which have exceeded the deprecation lifetime policy. * Add automated version information to documentation about which versioned machine types are deprecated and removed ---------------------------------------------------------------- Daniel P. Berrangé (5): Revert "include/hw: temporarily disable deletion of versioned machine types" include/hw/boards: cope with dev/rc versions in deprecation checks docs/about/deprecated: auto-generate a note for versioned machine types docs/about/removed-features: auto-generate a note for versioned machine types include/hw/boards: add warning about changing deprecation logic Thomas Huth (1): tests/qtest/q35-test: Remove the obsolete test_without_smram_base test docs/about/deprecated.rst | 7 ++++ docs/about/removed-features.rst | 10 +++--- docs/conf.py | 39 +++++++++++++++++++++- include/hw/boards.h | 58 +++++++++++++++++++++------------ tests/qtest/q35-test.c | 37 +-------------------- 5 files changed, 90 insertions(+), 61 deletions(-) -- 2.49.0

From: Thomas Huth <thuth@redhat.com> With the release of QEMU 10.1, the pc-q35-4.1 machine will be older than 6 years and thus will get disabled automatically by the MACHINE_VER_DELETION() macro. Remove the related test to avoid that the q35-test is failing when the machine is not available anymore. Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Daniel P. Berrangé <berrange@redhat.com> Signed-off-by: Thomas Huth <thuth@redhat.com> --- tests/qtest/q35-test.c | 37 +------------------------------------ 1 file changed, 1 insertion(+), 36 deletions(-) diff --git a/tests/qtest/q35-test.c b/tests/qtest/q35-test.c index 75d4078b79..62fff49fc8 100644 --- a/tests/qtest/q35-test.c +++ b/tests/qtest/q35-test.c @@ -246,41 +246,6 @@ static void test_smram_smbase_lock(void) qtest_quit(qts); } -static void test_without_smram_base(void) -{ - QPCIBus *pcibus; - QPCIDevice *pcidev; - QTestState *qts; - int i; - - qts = qtest_init("-M pc-q35-4.1"); - - pcibus = qpci_new_pc(qts, NULL); - g_assert(pcibus != NULL); - - pcidev = qpci_device_find(pcibus, 0); - g_assert(pcidev != NULL); - - /* check that RAM is accessible */ - qtest_writeb(qts, SMBASE, SMRAM_TEST_PATTERN); - g_assert_cmpint(qtest_readb(qts, SMBASE), ==, SMRAM_TEST_PATTERN); - - /* check that writing to 0x9c succeeds */ - for (i = 0; i <= 0xff; i++) { - qpci_config_writeb(pcidev, MCH_HOST_BRIDGE_F_SMBASE, i); - g_assert(qpci_config_readb(pcidev, MCH_HOST_BRIDGE_F_SMBASE) == i); - } - - /* check that RAM is still accessible */ - qtest_writeb(qts, SMBASE, SMRAM_TEST_PATTERN + 1); - g_assert_cmpint(qtest_readb(qts, SMBASE), ==, (SMRAM_TEST_PATTERN + 1)); - - g_free(pcidev); - qpci_free_pc(pcibus); - - qtest_quit(qts); -} - int main(int argc, char **argv) { g_test_init(&argc, &argv, NULL); @@ -293,6 +258,6 @@ int main(int argc, char **argv) qtest_add_data_func("/q35/tseg-size/ext/16mb", &tseg_ext_16mb, test_tseg_size); qtest_add_func("/q35/smram/smbase_lock", test_smram_smbase_lock); - qtest_add_func("/q35/smram/legacy_smbase", test_without_smram_base); + return g_test_run(); } -- 2.49.0

This reverts commit c9fd2d9a48ee3c195cf83cc611b87b09f02f0013. When we introduced the specialized machine type deprecation policy, we allow automatic deprecation to take effect immediately, but blocked the automatic deletion of machine types for 2 releases. This ensured we complied with the historical deprecation policy during the transition window. Startnig with the 10.1.0 dev cycle, the old machine types would be candidates for removal under both the old and new deprecation policies. Thus we can now enable automatic deletion of old machine types, which takes effect by skipping the QOM type registration. This prevents the machine types being listed with '-machine help', and blocks their creation. The actual code can be purged at a convenient time of the maintainer's choosing. In the case of the x86_64 target, this change results in the blocking of the following machine types: pc-i440fx-4.0 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-3.1 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-3.0 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-2.9 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-2.8 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-2.7 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-2.6 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-2.5 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-2.4 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-2.12 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-2.11 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-i440fx-2.10 Standard PC (i440FX + PIIX, 1996) (deprecated) pc-q35-4.0.1 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-4.0 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-3.1 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-3.0 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-2.9 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-2.8 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-2.7 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-2.6 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-2.5 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-2.4 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-2.12 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-2.11 Standard PC (Q35 + ICH9, 2009) (deprecated) pc-q35-2.10 Standard PC (Q35 + ICH9, 2009) (deprecated) Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- include/hw/boards.h | 19 +------------------ 1 file changed, 1 insertion(+), 18 deletions(-) diff --git a/include/hw/boards.h b/include/hw/boards.h index 765dc8dd35..74a8e96b2e 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -719,28 +719,11 @@ struct MachineState { * suitable period of time has passed, it will cause * execution of the method to return, avoiding registration * of the machine - * - * 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__)) { \ - if (getenv("QEMU_DELETE_MACHINES") || \ - QEMU_VERSION_MAJOR > 10 || (QEMU_VERSION_MAJOR == 10 && \ - QEMU_VERSION_MINOR >= 1)) { \ - return; \ - } \ + return; \ } \ } while (0) -- 2.49.0

When VERSION is set to a development snapshot (micro >= 50), or a release candidate (micro >= 90) we have an off-by-1 in determining deprecation and deletion thresholds for versioned machine types. In such cases we need to use the next major/minor version in threshold checks. This adapts the deprecation macros to do "next version" prediction when seeing a dev/rc version number. This ensures users of release candidates get an accurate view of machines that will be deprecated/deleted in the final release. This requires hardcoding our current release policy of 3 releases per year, with a major bump at the start of each year, and that dev/rc versions have micro >= 50. Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- include/hw/boards.h | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/include/hw/boards.h b/include/hw/boards.h index 74a8e96b2e..a6784fe984 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -650,11 +650,42 @@ struct MachineState { " years old are subject to deletion after " \ stringify(MACHINE_VER_DELETION_MAJOR) " years" -#define _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor) \ +#define _MACHINE_VER_IS_CURRENT_EXPIRED(cutoff, major, minor) \ (((QEMU_VERSION_MAJOR - major) > cutoff) || \ (((QEMU_VERSION_MAJOR - major) == cutoff) && \ (QEMU_VERSION_MINOR - minor) >= 0)) +#define _MACHINE_VER_IS_NEXT_MINOR_EXPIRED(cutoff, major, minor) \ + (((QEMU_VERSION_MAJOR - major) > cutoff) || \ + (((QEMU_VERSION_MAJOR - major) == cutoff) && \ + ((QEMU_VERSION_MINOR + 1) - minor) >= 0)) + +#define _MACHINE_VER_IS_NEXT_MAJOR_EXPIRED(cutoff, major, minor) \ + ((((QEMU_VERSION_MAJOR + 1) - major) > cutoff) || \ + ((((QEMU_VERSION_MAJOR + 1) - major) == cutoff) && \ + (0 - minor) >= 0)) + +/* + * - The first check applies to formal releases + * - The second check applies to dev snapshots / release candidates + * where the next major version is the same. + * e.g. 9.0.50, 9.1.50, 9.0.90, 9.1.90 + * - The third check applies to dev snapshots / release candidates + * where the next major version will change. + * e.g. 9.2.50, 9.2.90 + * + * NB: this assumes we do 3 minor releases per year, before bumping major, + * and dev snapshots / release candidates are numbered with micro >= 50 + * If this ever changes the logic below will need modifying.... + */ +#define _MACHINE_VER_IS_EXPIRED_IMPL(cutoff, major, minor) \ + ((QEMU_VERSION_MICRO < 50 && \ + _MACHINE_VER_IS_CURRENT_EXPIRED(cutoff, major, minor)) || \ + (QEMU_VERSION_MICRO >= 50 && QEMU_VERSION_MINOR < 2 && \ + _MACHINE_VER_IS_NEXT_MINOR_EXPIRED(cutoff, major, minor)) || \ + (QEMU_VERSION_MICRO >= 50 && QEMU_VERSION_MINOR == 2 && \ + _MACHINE_VER_IS_NEXT_MAJOR_EXPIRED(cutoff, major, minor))) + #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) \ -- 2.49.0

We deprecate versioned machine types on a fixed schedule. This allows us to auto-generate a paragraph in the deprecated.rst document that always has accurate version info. Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- docs/about/deprecated.rst | 7 +++++++ docs/conf.py | 33 ++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/about/deprecated.rst b/docs/about/deprecated.rst index 05381441a9..1a1b423030 100644 --- a/docs/about/deprecated.rst +++ b/docs/about/deprecated.rst @@ -278,6 +278,13 @@ CPU implementation for a while before removing all support. System emulator machines ------------------------ +Versioned machine types (aarch64, arm, i386, m68k, ppc64, s390x, x86_64) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +In accordance with our versioned machine type deprecation policy, all machine +types with version |VER_MACHINE_DEPRECATION_VERSION|, or older, have been +deprecated. + Arm ``virt`` machine ``dtb-kaslr-seed`` property (since 7.1) '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' diff --git a/docs/conf.py b/docs/conf.py index 7b5712e122..60dcf2a541 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -117,6 +117,27 @@ else: version = release = "unknown version" +bits = version.split(".") + +major = int(bits[0]) +minor = int(bits[1]) +micro = int(bits[2]) + +# Check for a dev snapshot, so we can adjust to next +# predicted release version. +# +# This assumes we do 3 releases per year, so must bump +# major if minor == 2 +if micro >= 50: + micro = 0 + if minor == 2: + major += 1 + minor = 0 + else: + minor += 1 + +ver_machine_deprecation_version = "%d.%d.0" % (major - 3, minor) + # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. # @@ -145,7 +166,17 @@ # environment variable is not set is for the benefit of readthedocs # style document building; our Makefile always sets the variable. confdir = os.getenv('CONFDIR', "/etc/qemu") -rst_epilog = ".. |CONFDIR| replace:: ``" + confdir + "``\n" + +vars = { + "CONFDIR": confdir, + "VER_MACHINE_DEPRECATION_VERSION": ver_machine_deprecation_version, +} + +rst_epilog = "".join([ + ".. |" + key + "| replace:: ``" + vars[key] + "``\n" + for key in vars.keys() +]) + # We slurp in the defs.rst.inc and literally include it into rst_epilog, # because Sphinx's include:: directive doesn't work with absolute paths # and there isn't any one single relative path that will work for all -- 2.49.0

We remove versioned machine types on a fixed schedule. This allows us to auto-generate a paragraph in the removed-features.rst document that always has accurate version info. Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- docs/about/removed-features.rst | 10 ++++++---- docs/conf.py | 2 ++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/about/removed-features.rst b/docs/about/removed-features.rst index 790a5e481c..063284d4f8 100644 --- a/docs/about/removed-features.rst +++ b/docs/about/removed-features.rst @@ -981,10 +981,12 @@ from Linux in 2021, and is not supported anymore by QEMU either. System emulator machines ------------------------ -Note: Versioned machine types that have been introduced in a QEMU version -that has initially been released more than 6 years before are considered -obsolete and will be removed without further notice in this document. -Please use newer machine types instead. +Versioned machine types (aarch64, arm, i386, m68k, ppc64, s390x, x86_64) +'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' + +In accordance with our versioned machine type deprecation policy, all machine +types with version |VER_MACHINE_DELETION_VERSION|, or older, have been +removed. ``s390-virtio`` (removed in 2.6) '''''''''''''''''''''''''''''''' diff --git a/docs/conf.py b/docs/conf.py index 60dcf2a541..248ff8cf5d 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -137,6 +137,7 @@ minor += 1 ver_machine_deprecation_version = "%d.%d.0" % (major - 3, minor) +ver_machine_deletion_version = "%d.%d.0" % (major - 6, minor) # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -170,6 +171,7 @@ vars = { "CONFDIR": confdir, "VER_MACHINE_DEPRECATION_VERSION": ver_machine_deprecation_version, + "VER_MACHINE_DELETION_VERSION": ver_machine_deletion_version, } rst_epilog = "".join([ -- 2.49.0

If we change the deprecation logic in include/hw/boards.h, we must make a corresponding change to docs/conf.py and docs/about/deprecated.rst. Add comments to these files as a warning to future maintainers to keep these files in sync. Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org> Reviewed-by: Thomas Huth <thuth@redhat.com> Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- docs/conf.py | 4 ++++ include/hw/boards.h | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index 248ff8cf5d..f892a6e1da 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -136,6 +136,10 @@ else: minor += 1 +# These thresholds must match the constants +# MACHINE_VER_DELETION_MAJOR & MACHINE_VER_DEPRECATION_MAJOR +# defined in include/hw/boards.h and the introductory text in +# docs/about/deprecated.rst ver_machine_deprecation_version = "%d.%d.0" % (major - 3, minor) ver_machine_deletion_version = "%d.%d.0" % (major - 6, minor) diff --git a/include/hw/boards.h b/include/hw/boards.h index a6784fe984..a7b1fcffae 100644 --- a/include/hw/boards.h +++ b/include/hw/boards.h @@ -636,7 +636,11 @@ struct MachineState { /* * How many years/major releases for each phase * of the life cycle. Assumes use of versioning - * scheme where major is bumped each year + * scheme where major is bumped each year. + * + * These values must match the ver_machine_deprecation_version + * and ver_machine_deletion_version logic in docs/conf.py and + * the text in docs/about/deprecated.rst */ #define MACHINE_VER_DELETION_MAJOR 6 #define MACHINE_VER_DEPRECATION_MAJOR 3 -- 2.49.0

Applied, thanks. Please update the changelog at https://wiki.qemu.org/ChangeLog/10.1 for any user-visible changes.
participants (2)
-
Daniel P. Berrangé
-
Stefan Hajnoczi