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 <walling@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
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 <walling@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
© 2016 - 2026 Red Hat, Inc.