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);
     }
 
     return 0;
-- 
2.47.1

Reply via email to