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 - 2025 Red Hat, Inc.