]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: taint the VM if it is using a deprecated CPU model
authorDaniel P. Berrangé <berrange@redhat.com>
Fri, 22 Jan 2021 11:48:23 +0000 (11:48 +0000)
committerDaniel P. Berrangé <berrange@redhat.com>
Wed, 3 Feb 2021 17:31:57 +0000 (17:31 +0000)
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h
src/qemu/qemu_domain.c

index 1c95dc0d42e64c3cbe12a268ad4eee3196dcf773..54c58962164870d22d643112fbc3d7abe1502f58 100644 (file)
@@ -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,
index cd951036526b7a51e9c1616aa9ad0b3990d5e3c9..8b7eb0b06c14d8cc26a59102ea28e18cc4399f8b 100644 (file)
@@ -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);
index 38bdcf08f1065667856ff60e68a78d340926a348..8a1785c2c39fa1a372b88a9a2489756520f1ed54 100644 (file)
@@ -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);