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