[libvirt] [PATCH v2 1/5] qemu: Add virQEMUCapsSupportsGICVersion()

Andrea Bolognani abologna at redhat.com
Mon May 16 22:00:03 UTC 2016


This utility function extracts some of the logic from
virQEMUCapsFillDomainFeatureGICCaps() so that it can be used
in a different context.
---
 src/qemu/qemu_capabilities.c | 62 ++++++++++++++++++++++++++++++++++++--------
 src/qemu/qemu_capabilities.h |  4 +++
 2 files changed, 55 insertions(+), 11 deletions(-)

diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index fcfd1cd..9055bf9 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -4258,6 +4258,49 @@ virQEMUCapsFillDomainDeviceHostdevCaps(virQEMUCapsPtr qemuCaps,
 
 
 /**
+ * virQEMUCapsSupportsGICVersion:
+ * @qemuCaps: QEMU capabilities
+ * @virtType: domain type
+ * @version: GIC version
+ *
+ * Checks the QEMU binary with capabilities @qemuCaps supports a specific
+ * GIC version for a domain of type @virtType.
+ *
+ * Returns: true if the binary supports the requested GIC version, false
+ *          otherwise
+ */
+bool
+virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps,
+                              virDomainVirtType virtType,
+                              virGICVersion version)
+{
+    size_t i;
+    bool ret = false;
+
+    for (i = 0; i < qemuCaps->ngicCapabilities; i++) {
+        virGICCapabilityPtr cap = &(qemuCaps->gicCapabilities[i]);
+
+        if (cap->version != version)
+            continue;
+
+        if (virtType == VIR_DOMAIN_VIRT_KVM &&
+            cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL) {
+            ret = true;
+            break;
+        }
+
+        if (virtType == VIR_DOMAIN_VIRT_QEMU &&
+            cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED) {
+            ret = true;
+            break;
+        }
+    }
+
+    return ret;
+}
+
+
+/**
  * virQEMUCapsFillDomainFeatureGICCaps:
  * @qemuCaps: QEMU capabilities
  * @domCaps: domain capabilities
@@ -4281,7 +4324,7 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps,
                                     virDomainCapsPtr domCaps)
 {
     virDomainCapsFeatureGICPtr gic = &domCaps->gic;
-    size_t i;
+    virGICVersion version;
 
     if (domCaps->arch != VIR_ARCH_ARMV7L &&
         domCaps->arch != VIR_ARCH_AARCH64)
@@ -4291,20 +4334,17 @@ virQEMUCapsFillDomainFeatureGICCaps(virQEMUCapsPtr qemuCaps,
         !STRPREFIX(domCaps->machine, "virt-"))
         return 0;
 
-    for (i = 0; i < qemuCaps->ngicCapabilities; i++) {
-        virGICCapabilityPtr cap = &qemuCaps->gicCapabilities[i];
-
-        if (domCaps->virttype == VIR_DOMAIN_VIRT_KVM &&
-            !(cap->implementation & VIR_GIC_IMPLEMENTATION_KERNEL))
-            continue;
-
-        if (domCaps->virttype == VIR_DOMAIN_VIRT_QEMU &&
-            !(cap->implementation & VIR_GIC_IMPLEMENTATION_EMULATED))
+    for (version = VIR_GIC_VERSION_LAST - 1;
+         version > VIR_GIC_VERSION_NONE;
+         version--) {
+        if (!virQEMUCapsSupportsGICVersion(qemuCaps,
+                                           domCaps->virttype,
+                                           version))
             continue;
 
         gic->supported = true;
         VIR_DOMAIN_CAPS_ENUM_SET(gic->version,
-                                 cap->version);
+                                 version);
     }
 
     return 0;
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index e7d0a60..fef78b7 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -462,6 +462,10 @@ bool virQEMUCapsSupportsChardev(const virDomainDef *def,
                                 virQEMUCapsPtr qemuCaps,
                                 virDomainChrDefPtr chr);
 
+bool virQEMUCapsSupportsGICVersion(virQEMUCapsPtr qemuCaps,
+                                   virDomainVirtType virtType,
+                                   virGICVersion version);
+
 bool virQEMUCapsIsMachineSupported(virQEMUCapsPtr qemuCaps,
                                    const char *canonical_machine);
 
-- 
2.5.5




More information about the libvir-list mailing list