On Tue, Feb 09, 2021 at 01:59:01PM +0000, Daniel P. Berrangé wrote:
The "max" model can be treated the same way as
"host" model in general.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
94 files changed, 431 insertions(+), 73 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index ecfb313d0a..58e28c3bd1 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2336,6 +2336,8 @@ virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
return cpus && cpus->ncpus > 0;
case VIR_CPU_MODE_MAXIMUM:
+ return virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_MAX);
+
case VIR_CPU_MODE_LAST:
break;
}
@@ -2985,7 +2987,7 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps,
virQEMUCapsAccelPtr accel,
qemuMonitorPtr mon)
{
- qemuMonitorCPUDefsPtr defs = accel->cpuModels;
+ qemuMonitorCPUDefsPtr defs;
size_t i;
if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_QUERY_CPU_DEFINITIONS))
@@ -2994,6 +2996,7 @@ virQEMUCapsProbeQMPCPUDefinitions(virQEMUCapsPtr qemuCaps,
if (virQEMUCapsFetchCPUDefinitions(mon, qemuCaps->arch, &accel->cpuModels)
< 0)
return -1;
+ defs = accel->cpuModels;
And there is the fix for the crash from previous patch, so please do it
directly there.
for (i = 0; i < defs->ncpus; i++) {
if (STREQ_NULLABLE(defs->cpus[i].name, "max")) {
virQEMUCapsSet(qemuCaps, QEMU_CAPS_CPU_MAX);
@@ -5977,6 +5980,18 @@ virQEMUCapsFillDomainCPUCaps(virQEMUCapsPtr qemuCaps,
VIR_TRISTATE_SWITCH_OFF);
}
+ if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
+ VIR_CPU_MODE_MAXIMUM,
+ domCaps->machine)) {
+ domCaps->cpu.maximum = true;
+
+ domCaps->cpu.maximumMigratable.report = true;
+ VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.maximumMigratable,
+ VIR_TRISTATE_SWITCH_ON);
+ VIR_DOMAIN_CAPS_ENUM_SET(domCaps->cpu.maximumMigratable,
+ VIR_TRISTATE_SWITCH_OFF);
+ }
+
if (virQEMUCapsIsCPUModeSupported(qemuCaps, hostarch, domCaps->virttype,
VIR_CPU_MODE_HOST_MODEL,
domCaps->machine)) {
[...]
diff --git a/src/qemu/qemu_validate.c b/src/qemu/qemu_validate.c
index bf4ac19104..62a915e946 100644
--- a/src/qemu/qemu_validate.c
+++ b/src/qemu/qemu_validate.c
@@ -255,10 +255,11 @@ qemuValidateDomainDefFeatures(const virDomainDef *def,
case VIR_DOMAIN_FEATURE_KVM:
if (def->kvm_features[VIR_DOMAIN_KVM_DEDICATED] == VIR_TRISTATE_SWITCH_ON
&&
- (!def->cpu || def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH))
{
+ (!def->cpu || (def->cpu->mode != VIR_CPU_MODE_HOST_PASSTHROUGH
&&
+ def->cpu->mode != VIR_CPU_MODE_MAXIMUM))) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
_("kvm-hint-dedicated=on is only applicable "
- "for cpu host-passthrough"));
+ "for cpu host-passthrough / maximum"));
return -1;
}
break;
@@ -396,7 +397,15 @@ qemuValidateDomainDefCpu(virQEMUDriverPtr driver,
* CUSTOM.
*/
break;
+
case VIR_CPU_MODE_MAXIMUM:
+ if (!virQEMUCapsGet(qemuCaps, QEMU_CAPS_CPU_MAX)) {
+ virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+ _("maximum CPU is not supported by QEMU binary"));
s/by QEMU/by this QEMU/
+ return -1;
+ }
+ break;
+
case VIR_CPU_MODE_CUSTOM:
case VIR_CPU_MODE_LAST:
break;
Otherwise looks good but it would need some changes if we do not trust
QEMU to behave the same way for kvm and tcg.
Pavel