On 5/1/25 22:17, Collin Walling wrote:
Currently, virQEMUCapsUpdateCPUDeprecatedFeatures only allows for
disabling deprecated features.  This locks the deprecated_features
attribute to only do something if set to 'off'.

Let's add a virCPUFeaturePolicy to the function's parameters which will
allow the caller to decide what happens to these features.

Additionally, group the relevant code in qemu_process.c.

Signed-off-by: Collin Walling <wall...@linux.ibm.com>
---
  src/qemu/qemu_capabilities.c |  6 +++---
  src/qemu/qemu_capabilities.h |  3 ++-
  src/qemu/qemu_driver.c       |  3 ++-
  src/qemu/qemu_process.c      | 19 ++++++++++++-------
  4 files changed, 19 insertions(+), 12 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index a804335c85..5f94863818 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -3341,7 +3341,8 @@ virQEMUCapsGetCPUFeatures(virQEMUCaps *qemuCaps,
  void
  virQEMUCapsUpdateCPUDeprecatedFeatures(virQEMUCaps *qemuCaps,
                                         virDomainVirtType virtType,
-                                       virCPUDef *cpu)
+                                       virCPUDef *cpu,
+                                       virCPUFeaturePolicy policy)
  {
      qemuMonitorCPUModelInfo *modelInfo;
      size_t i;
@@ -3352,8 +3353,7 @@ virQEMUCapsUpdateCPUDeprecatedFeatures(virQEMUCaps 
*qemuCaps,
          return;
for (i = 0; i < g_strv_length(modelInfo->deprecated_props); i++) {
-        virCPUDefUpdateFeature(cpu, modelInfo->deprecated_props[i],
-                               VIR_CPU_FEATURE_DISABLE);
+        virCPUDefUpdateFeature(cpu, modelInfo->deprecated_props[i], policy);
      }
  }
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index ea7c14daa9..e4d8b0b6b6 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -778,7 +778,8 @@ int virQEMUCapsGetCPUFeatures(virQEMUCaps *qemuCaps,
                                char ***features);
  void virQEMUCapsUpdateCPUDeprecatedFeatures(virQEMUCaps *qemuCaps,
                                              virDomainVirtType virtType,
-                                            virCPUDef *cpu);
+                                            virCPUDef *cpu,
+                                            virCPUFeaturePolicy policy);
virDomainVirtType virQEMUCapsGetVirtType(virQEMUCaps *qemuCaps); diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a34d6f1437..677b4b72a8 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -16722,7 +16722,8 @@ qemuConnectGetDomainCapabilities(virConnectPtr conn,
if (flags & VIR_CONNECT_GET_DOMAIN_CAPABILITIES_DISABLE_DEPRECATED_FEATURES) {
          virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, virttype,
-                                               domCaps->cpu.hostModel);
+                                               domCaps->cpu.hostModel,
+                                               VIR_CPU_FEATURE_DISABLE);
      }
return virDomainCapsFormat(domCaps);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 1af91c5909..5820499710 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -6588,15 +6588,20 @@ qemuProcessUpdateGuestCPU(virDomainDef *def,
                                  &def->os.arch) < 0)
          return -1;
- if (def->cpu->deprecated_feats &&
-        !virQEMUCapsGet(qemuCaps, 
QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS)) {
-        virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+    if (def->cpu->deprecated_feats) {
+        virCPUFeaturePolicy policy = VIR_CPU_FEATURE_REQUIRE;
+
+        if (def->cpu->deprecated_feats == VIR_TRISTATE_SWITCH_OFF)
+            policy = VIR_CPU_FEATURE_DISABLE;
+
+        if (!virQEMUCapsGet(qemuCaps, 
QEMU_CAPS_QUERY_CPU_MODEL_EXPANSION_DEPRECATED_PROPS)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
                         _("toggling deprecated features for CPU model is 
unsupported"));
-        return -1;
-    }
+            return -1;
+        }
- if (def->cpu->deprecated_feats == VIR_TRISTATE_SWITCH_OFF) {
-        virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, def->virtType, 
def->cpu);
+        virQEMUCapsUpdateCPUDeprecatedFeatures(qemuCaps, def->virtType,
+                                               def->cpu, policy);
      }

There are no tests with deprecated_features='on'.
Could you please add some before doing this change.
I would also suggest to separate the code refactoring from code changes introducing an alternative behavior.

return 0;


--
Mit freundlichen Grüßen/Kind regards
   Boris Fiuczynski

IBM Deutschland Research & Development GmbH
Vorsitzender des Aufsichtsrats: Wolfgang Wendt
Geschäftsführung: David Faller
Sitz der Gesellschaft: Böblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294

Reply via email to