Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
src/qemu/qemu_capabilities.c | 17 +++++++++++++++++
src/qemu/qemu_capabilities.h | 3 +++
src/qemu/qemu_domain.c | 37 ++++++++++++++++++++++++++++++++----
3 files changed, 53 insertions(+), 4 deletions(-)
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index e3d1de0779..f6d7a222c4 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2437,6 +2437,23 @@ virQEMUCapsGetMachineDefaultCPU(virQEMUCapsPtr qemuCaps,
}
+bool
+virQEMUCapsIsCPUDeprecated(virQEMUCapsPtr qemuCaps,
+ virDomainVirtType type,
+ const char *model)
+{
+ virQEMUCapsAccelPtr accel = virQEMUCapsGetAccel(qemuCaps, type);
+ qemuMonitorCPUDefsPtr defs = accel->cpuModels;
+ size_t i;
+
+ for (i = 0; i < defs->ncpus; i++) {
+ if (STREQ_NULLABLE(defs->cpus[i].name, model))
+ return defs->cpus[i].deprecated;
+ }
+ return false;
+}
+
+
bool
virQEMUCapsGetMachineNumaMemSupported(virQEMUCapsPtr qemuCaps,
virDomainVirtType virtType,
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index a14a78f959..a6270edb0e 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -686,6 +686,9 @@ bool virQEMUCapsGetMachineHotplugCpus(virQEMUCapsPtr qemuCaps,
const char *virQEMUCapsGetMachineDefaultCPU(virQEMUCapsPtr qemuCaps,
const char *name,
virDomainVirtType type);
+bool virQEMUCapsIsCPUDeprecated(virQEMUCapsPtr qemuCaps,
+ virDomainVirtType type,
+ const char *model);
bool virQEMUCapsGetMachineNumaMemSupported(virQEMUCapsPtr qemuCaps,
virDomainVirtType virtType,
const char *name);
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index e63bea8b32..ed5fd6aa0d 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -6243,6 +6243,37 @@ void qemuDomainObjTaintMsg(virQEMUDriverPtr driver,
virErrorRestore(&orig_err);
}
+static void
+qemuDomainObjCheckCPUTaint(virQEMUDriverPtr driver,
+ virDomainObjPtr obj,
+ qemuDomainLogContextPtr logCtxt,
+ bool incomingMigration)
+{
+ qemuDomainObjPrivatePtr priv = obj->privateData;
+ virQEMUCapsPtr qemuCaps = priv->qemuCaps;
+
+ switch (obj->def->cpu->mode) {
+ case VIR_CPU_MODE_HOST_PASSTHROUGH:
+ if (incomingMigration)
+ qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HOST_CPU, logCtxt);
+ break;
+ case VIR_CPU_MODE_CUSTOM:
+ if (obj->def->cpu->model &&
+ virQEMUCapsIsCPUDeprecated(qemuCaps,
+ obj->def->virtType,
+ obj->def->cpu->model)) {
+ qemuDomainObjTaintMsg(driver, obj, VIR_DOMAIN_TAINT_DEPRECATED_CONFIG,
logCtxt,
+ _("CPU model '%s'"),
+ obj->def->cpu->model);
+ }
+ break;
+ case VIR_CPU_MODE_HOST_MODEL:
+ case VIR_CPU_MODE_LAST:
+ default:
+ break;
+ }
+}
+
void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
virDomainObjPtr obj,
@@ -6276,10 +6307,8 @@ void qemuDomainObjCheckTaint(virQEMUDriverPtr driver,
VIR_DOMAIN_TAINT_CUSTOM_HYPERVISOR_FEATURE, logCtxt);
}
- if (obj->def->cpu &&
- obj->def->cpu->mode == VIR_CPU_MODE_HOST_PASSTHROUGH &&
- incomingMigration)
- qemuDomainObjTaint(driver, obj, VIR_DOMAIN_TAINT_HOST_CPU, logCtxt);
+ if (obj->def->cpu)
+ qemuDomainObjCheckCPUTaint(driver, obj, logCtxt, incomingMigration);
for (i = 0; i < obj->def->ndisks; i++)
qemuDomainObjCheckDiskTaint(driver, obj, obj->def->disks[i], logCtxt);
--
2.29.2