[libvirt] [PATCH 30/41] qemu: Introduce virQEMUCapsIsCPUModeSupported

Jiri Denemark jdenemar at redhat.com
Fri Aug 12 13:33:24 UTC 2016


Signed-off-by: Jiri Denemark <jdenemar at redhat.com>
---
 src/qemu/qemu_capabilities.c | 55 ++++++++++++++++++++++++++++++++++----------
 src/qemu/qemu_capabilities.h |  4 ++++
 2 files changed, 47 insertions(+), 12 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 670f944..f70a36c 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -2302,6 +2302,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->cpuModel;
+
+    case VIR_CPU_MODE_CUSTOM:
+        return qemuCaps->cpuDefinitions &&
+               qemuCaps->cpuDefinitions->count > 0;
+
+    case VIR_CPU_MODE_LAST:
+        break;
+    }
+
+    return false;
+}
+
+
 int virQEMUCapsGetMachineTypesCaps(virQEMUCapsPtr qemuCaps,
                                    size_t *nmachines,
                                    virCapsGuestMachinePtr **machines)
@@ -4260,22 +4286,27 @@ 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->cpuModel);
+    if (virQEMUCapsIsCPUModeSupported(qemuCaps, caps, domCaps->virttype,
+                                      VIR_CPU_MODE_HOST_MODEL))
+        domCaps->cpu.hostModel = virCPUDefCopy(qemuCaps->cpuModel);
 
-    if (qemuCaps->cpuDefinitions &&
-        cpuGetModels(domCaps->arch, &models) >= 0) {
-        filtered = virDomainCapsCPUModelsFilter(qemuCaps->cpuDefinitions,
-                                                models);
-        virStringFreeList(models);
+    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,
+                                                    models);
+            virStringFreeList(models);
+        }
+        domCaps->cpu.custom = filtered;
     }
-    domCaps->cpu.custom = filtered;
 
     return 0;
 }
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index 1203073..2ea5849 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -425,6 +425,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,
-- 
2.9.2




More information about the libvir-list mailing list