]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: Introduce virQEMUCapsIsCPUModeSupported
authorJiri Denemark <jdenemar@redhat.com>
Wed, 3 Aug 2016 14:22:30 +0000 (16:22 +0200)
committerJiri Denemark <jdenemar@redhat.com>
Thu, 22 Sep 2016 13:40:09 +0000 (15:40 +0200)
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
src/qemu/qemu_capabilities.c
src/qemu/qemu_capabilities.h

index 18927cba97e5dee23cf7e64413a4c3d1e1724d02..985b585d4dd5f4de25dad0eeee6c03388955250d 100644 (file)
@@ -2371,6 +2371,32 @@ virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps)
 }
 
 
+bool
+virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
+                              virCapsPtr caps,
+                              virDomainVirtType type,
+                              virCPUMode mode)
+{
+    switch (mode) {
+    case VIR_CPU_MODE_HOST_PASSTHROUGH:
+        return type == VIR_DOMAIN_VIRT_KVM &&
+               virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch);
+
+    case VIR_CPU_MODE_HOST_MODEL:
+        return !!qemuCaps->hostCPUModel;
+
+    case VIR_CPU_MODE_CUSTOM:
+        return qemuCaps->cpuDefinitions &&
+               qemuCaps->cpuDefinitions->nmodels > 0;
+
+    case VIR_CPU_MODE_LAST:
+        break;
+    }
+
+    return false;
+}
+
+
 int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
                                    size_t *nmachines,
                                    virCapsGuestMachinePtr **machines)
@@ -4358,22 +4384,26 @@ virQEMUCapsFillDomainCPUCaps(virCapsPtr caps,
                              virQEMUCapsPtr qemuCaps,
                              virDomainCapsPtr domCaps)
 {
-    virDomainCapsCPUModelsPtr filtered = NULL;
-    char **models = NULL;
-
-    if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM &&
-        virQEMUCapsGuestIsNative(caps->host.arch, qemuCaps->arch))
+    if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+                                      VIR_CPU_MODE_HOST_PASSTHROUGH))
         domCaps->cpu.hostPassthrough = true;
 
-    domCaps->cpu.hostModel = virCPUDefCopy(qemuCaps->hostCPUModel);
+    if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+                                      VIR_CPU_MODE_HOST_MODEL))
+        domCaps->cpu.hostModel = virCPUDefCopy(qemuCaps->hostCPUModel);
+
+    if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+                                      VIR_CPU_MODE_CUSTOM)) {
+        virDomainCapsCPUModelsPtr filtered = NULL;
+        char **models = NULL;
 
-    if (qemuCaps->cpuDefinitions &&
-        cpuGetModels(domCaps->arch, &models) >= 0) {
-        filtered = virDomainCapsCPUModelsFilter(qemuCaps->cpuDefinitions,
-                                                (const char **) models);
-        virStringFreeList(models);
+        if (cpuGetModels(domCaps->arch, &models) >= 0) {
+            filtered = virDomainCapsCPUModelsFilter(qemuCaps->cpuDefinitions,
+                                                    (const char **) models);
+            virStringFreeList(models);
+        }
+        domCaps->cpu.custom = filtered;
     }
-    domCaps->cpu.custom = filtered;
 
     return 0;
 }
index b1d512efdeec2dc36f55aa337d2d284315afb614..ba0ef4859d42e1f144ef5feb4df24178b6cfe389 100644 (file)
@@ -430,6 +430,10 @@ int virQEMUCapsGetCPUDefinitions(virQEMUCapsPtr qemuCaps,
                                  char ***names,
                                  size_t *count);
 virCPUDefPtr virQEMUCapsGetHostModel(virQEMUCapsPtr qemuCaps);
+bool virQEMUCapsIsCPUModeSupported(virQEMUCapsPtr qemuCaps,
+                                   virCapsPtr caps,
+                                   virDomainVirtType type,
+                                   virCPUMode mode);
 const char *virQEMUCapsGetCanonicalMachine(virQEMUCapsPtr qemuCaps,
                                            const char *name);
 int virQEMUCapsGetMachineMaxCpus(virQEMUCapsPtr qemuCaps,