diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c index 1c95dc0d42..54c5896216 100644 --- a/src/qemu/qemu_capabilities.c +++ b/src/qemu/qemu_capabilities.c @@ -2445,6 +2445,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 cd95103652..8b7eb0b06c 100644 --- a/src/qemu/qemu_capabilities.h +++ b/src/qemu/qemu_capabilities.h @@ -687,6 +687,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 38bdcf08f1..8a1785c2c3 100644 --- a/src/qemu/qemu_domain.c +++ b/src/qemu/qemu_domain.c @@ -6274,6 +6274,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, @@ -6307,10 +6338,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);