[libvirt] [PATCH 02/13] make pci address handling functions qemu-agnostic

Tomasz Flendrich t.flendrich at gmail.com
Wed Jul 20 00:07:16 UTC 2016


Change functions in qemu_domain_address.c to accept boolean parameters
instead of qemuCaps. Thanks to this, they can be moved to domain_addr.c
and have the potential to be reused for more hypervisors in the future.
---
 src/qemu/qemu_domain_address.c | 80 ++++++++++++++++++++++++------------------
 src/qemu/qemu_domain_address.h |  6 ++--
 src/qemu/qemu_hotplug.c        | 27 ++++++++++----
 3 files changed, 71 insertions(+), 42 deletions(-)

diff --git a/src/qemu/qemu_domain_address.c b/src/qemu/qemu_domain_address.c
index c0a96ba..b6a0b83 100644
--- a/src/qemu/qemu_domain_address.c
+++ b/src/qemu/qemu_domain_address.c
@@ -560,13 +560,12 @@ qemuDomainPCIAddressSetCreate(virDomainDefPtr def,
 
 static int
 qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def,
-                                      virQEMUCapsPtr qemuCaps,
-                                      virDomainPCIAddressSetPtr addrs)
+                                      virDomainPCIAddressSetPtr addrs,
+                                      bool videoPrimaryEnabled)
 {
     int ret = -1;
     size_t i;
     virPCIDeviceAddress tmp_addr;
-    bool qemuDeviceVideoUsable = virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
     char *addrStr = NULL;
     virDomainPCIConnectFlags flags = (VIR_PCI_CONNECT_HOTPLUGGABLE
                                       | VIR_PCI_CONNECT_TYPE_PCI_DEVICE);
@@ -644,7 +643,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def,
                 goto cleanup;
 
             if (virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) {
-                if (qemuDeviceVideoUsable) {
+                if (videoPrimaryEnabled) {
                     if (virDomainPCIAddressReserveNextSlot(addrs,
                                                            &primaryVideo->info,
                                                            flags) < 0)
@@ -661,7 +660,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def,
                 primaryVideo->info.addr.pci = tmp_addr;
                 primaryVideo->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
             }
-        } else if (!qemuDeviceVideoUsable) {
+        } else if (!videoPrimaryEnabled) {
             if (primaryVideo->info.addr.pci.domain != 0 ||
                 primaryVideo->info.addr.pci.bus != 0 ||
                 primaryVideo->info.addr.pci.slot != 2 ||
@@ -673,7 +672,7 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def,
             /* If TYPE == PCI, then qemuDomainCollectPCIAddress() function
              * has already reserved the address, so we must skip */
         }
-    } else if (addrs->nbuses && !qemuDeviceVideoUsable) {
+    } else if (addrs->nbuses && !videoPrimaryEnabled) {
         memset(&tmp_addr, 0, sizeof(tmp_addr));
         tmp_addr.slot = 2;
 
@@ -694,13 +693,12 @@ qemuDomainValidateDevicePCISlotsPIIX3(virDomainDefPtr def,
 
 static int
 qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
-                                    virQEMUCapsPtr qemuCaps,
-                                    virDomainPCIAddressSetPtr addrs)
+                                    virDomainPCIAddressSetPtr addrs,
+                                    bool videoPrimaryEnabled)
 {
     int ret = -1;
     size_t i;
     virPCIDeviceAddress tmp_addr;
-    bool qemuDeviceVideoUsable = virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
     char *addrStr = NULL;
     virDomainPCIConnectFlags flags = VIR_PCI_CONNECT_TYPE_PCIE_DEVICE;
 
@@ -835,7 +833,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
                 goto cleanup;
 
             if (virDomainPCIAddressSlotInUse(addrs, &tmp_addr)) {
-                if (qemuDeviceVideoUsable) {
+                if (videoPrimaryEnabled) {
                     if (virDomainPCIAddressReserveNextSlot(addrs,
                                                            &primaryVideo->info,
                                                            flags) < 0)
@@ -852,7 +850,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
                 primaryVideo->info.type = VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI;
                 primaryVideo->info.addr.pci = tmp_addr;
             }
-        } else if (!qemuDeviceVideoUsable) {
+        } else if (!videoPrimaryEnabled) {
             if (primaryVideo->info.addr.pci.domain != 0 ||
                 primaryVideo->info.addr.pci.bus != 0 ||
                 primaryVideo->info.addr.pci.slot != 1 ||
@@ -864,7 +862,7 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
             /* If TYPE == PCI, then qemuDomainCollectPCIAddress() function
              * has already reserved the address, so we must skip */
         }
-    } else if (addrs->nbuses && !qemuDeviceVideoUsable) {
+    } else if (addrs->nbuses && !videoPrimaryEnabled) {
         memset(&tmp_addr, 0, sizeof(tmp_addr));
         tmp_addr.slot = 1;
 
@@ -886,16 +884,16 @@ qemuDomainValidateDevicePCISlotsQ35(virDomainDefPtr def,
 
 static int
 qemuDomainValidateDevicePCISlotsChipsets(virDomainDefPtr def,
-                                         virQEMUCapsPtr qemuCaps,
-                                         virDomainPCIAddressSetPtr addrs)
+                                         virDomainPCIAddressSetPtr addrs,
+                                         bool videoPrimaryEnabled)
 {
     if (qemuDomainMachineIsI440FX(def) &&
-        qemuDomainValidateDevicePCISlotsPIIX3(def, qemuCaps, addrs) < 0) {
+        qemuDomainValidateDevicePCISlotsPIIX3(def, addrs, videoPrimaryEnabled) < 0) {
         return -1;
     }
 
     if (qemuDomainMachineIsQ35(def) &&
-        qemuDomainValidateDevicePCISlotsQ35(def, qemuCaps, addrs) < 0) {
+        qemuDomainValidateDevicePCISlotsQ35(def, addrs, videoPrimaryEnabled) < 0) {
         return -1;
     }
 
@@ -954,8 +952,8 @@ qemuDomainPCIBusFullyReserved(virDomainPCIAddressBusPtr bus)
  */
 static int
 qemuDomainAssignDevicePCISlots(virDomainDefPtr def,
-                               virQEMUCapsPtr qemuCaps,
-                               virDomainPCIAddressSetPtr addrs)
+                               virDomainPCIAddressSetPtr addrs,
+                               bool virtioMMIOEnabled)
 {
     size_t i, j;
     virDomainPCIConnectFlags flags = 0; /* initialize to quiet gcc warning */
@@ -1136,7 +1134,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def,
         /* Also ignore virtio-mmio disks if our machine allows them */
         if (def->disks[i]->info.type ==
             VIR_DOMAIN_DEVICE_ADDRESS_TYPE_VIRTIO_MMIO &&
-            virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO))
+            virtioMMIOEnabled)
             continue;
 
         if (!virDeviceInfoPCIAddressWanted(&def->disks[i]->info)) {
@@ -1265,7 +1263,7 @@ qemuDomainAssignDevicePCISlots(virDomainDefPtr def,
 
 static bool
 qemuDomainSupportsPCI(virDomainDefPtr def,
-                      virQEMUCapsPtr qemuCaps)
+                      bool gpexEnabled)
 {
     if ((def->os.arch != VIR_ARCH_ARMV7L) && (def->os.arch != VIR_ARCH_AARCH64))
         return true;
@@ -1274,7 +1272,7 @@ qemuDomainSupportsPCI(virDomainDefPtr def,
         return true;
 
     if (qemuDomainMachineIsVirt(def) &&
-        virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_GPEX))
+        gpexEnabled)
         return true;
 
     return false;
@@ -1388,7 +1386,9 @@ qemuDomainAddressFindNewBusNr(virDomainDefPtr def)
 
 virDomainPCIAddressSetPtr
 qemuDomainPCIAddrSetCreateFromDomain(virDomainDefPtr def,
-                                     virQEMUCapsPtr qemuCaps)
+                                     bool virtioMMIOEnabled,
+                                     bool videoPrimaryEnabled,
+                                     bool gpexEnabled)
 {
     virDomainPCIAddressSetPtr addrs = NULL;
     int max_idx = -1;
@@ -1408,12 +1408,12 @@ qemuDomainPCIAddrSetCreateFromDomain(virDomainDefPtr def,
     if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, false)))
         goto cleanup;
 
-    if (qemuDomainSupportsPCI(def, qemuCaps)) {
-        if (qemuDomainValidateDevicePCISlotsChipsets(def, qemuCaps,
-                                                     addrs) < 0)
+    if (qemuDomainSupportsPCI(def, gpexEnabled)) {
+        if (qemuDomainValidateDevicePCISlotsChipsets(def, addrs,
+                                             videoPrimaryEnabled) < 0)
             goto cleanup;
 
-        if (qemuDomainAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
+        if (qemuDomainAssignDevicePCISlots(def, addrs, virtioMMIOEnabled) < 0)
             goto cleanup;
     }
 
@@ -1428,7 +1428,10 @@ qemuDomainPCIAddrSetCreateFromDomain(virDomainDefPtr def,
 
 static int
 qemuDomainAssignPCIAddresses(virDomainDefPtr def,
-                             virQEMUCapsPtr qemuCaps)
+                             bool pciBridgeEnabled,
+                             bool virtioMMIOEnabled,
+                             bool videoPrimaryEnabled,
+                             bool gpexEnabled)
 {
     int ret = -1;
     virDomainPCIAddressSetPtr addrs = NULL;
@@ -1450,15 +1453,15 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
     nbuses = max_idx + 1;
 
     if (nbuses > 0 &&
-        virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE)) {
+        pciBridgeEnabled) {
         virDomainDeviceInfo info;
 
         /* 1st pass to figure out how many PCI bridges we need */
         if (!(addrs = qemuDomainPCIAddressSetCreate(def, nbuses, true)))
             goto cleanup;
 
-        if (qemuDomainValidateDevicePCISlotsChipsets(def, qemuCaps,
-                                                     addrs) < 0)
+        if (qemuDomainValidateDevicePCISlotsChipsets(def, addrs,
+                                                     videoPrimaryEnabled) < 0)
             goto cleanup;
 
         for (i = 0; i < addrs->nbuses; i++) {
@@ -1479,7 +1482,7 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
             virDomainPCIAddressReserveNextSlot(addrs, &info, flags) < 0)
             goto cleanup;
 
-        if (qemuDomainAssignDevicePCISlots(def, qemuCaps, addrs) < 0)
+        if (qemuDomainAssignDevicePCISlots(def, addrs, virtioMMIOEnabled) < 0)
             goto cleanup;
 
         for (i = 1; i < addrs->nbuses; i++) {
@@ -1505,10 +1508,13 @@ qemuDomainAssignPCIAddresses(virDomainDefPtr def,
         goto cleanup;
     }
 
-    if (!(addrs = qemuDomainPCIAddrSetCreateFromDomain(def, qemuCaps)))
+    if (!(addrs = qemuDomainPCIAddrSetCreateFromDomain(def,
+                                                       virtioMMIOEnabled,
+                                                       videoPrimaryEnabled,
+                                                       gpexEnabled)))
         goto cleanup;
 
-    if (qemuDomainSupportsPCI(def, qemuCaps)) {
+    if (qemuDomainSupportsPCI(def, gpexEnabled)) {
         for (i = 0; i < def->ncontrollers; i++) {
             virDomainControllerDefPtr cont = def->controllers[i];
             int idx = cont->idx;
@@ -1600,6 +1606,11 @@ qemuDomainAssignAddresses(virDomainDefPtr def,
                           virDomainObjPtr obj ATTRIBUTE_UNUSED,
                           bool newDomain ATTRIBUTE_UNUSED)
 {
+    bool pciBridgeEnabled = virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_PCI_BRIDGE);
+    bool virtioMMIOEnabled = virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO);
+    bool videoPrimaryEnabled = virQEMUCapsGet(qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY);
+    bool gpexEnabled = virQEMUCapsGet(qemuCaps, QEMU_CAPS_OBJECT_GPEX);
+
     if (virDomainAssignVirtioSerialAddresses(def) < 0)
         return -1;
 
@@ -1611,7 +1622,8 @@ qemuDomainAssignAddresses(virDomainDefPtr def,
 
     qemuDomainAssignARMVirtioMMIOAddresses(def, qemuCaps);
 
-    if (qemuDomainAssignPCIAddresses(def, qemuCaps) < 0)
+    if (qemuDomainAssignPCIAddresses(def, pciBridgeEnabled, virtioMMIOEnabled,
+                                     videoPrimaryEnabled, gpexEnabled) < 0)
         return -1;
 
     return 0;
diff --git a/src/qemu/qemu_domain_address.h b/src/qemu/qemu_domain_address.h
index 5f35a92..77a5541 100644
--- a/src/qemu/qemu_domain_address.h
+++ b/src/qemu/qemu_domain_address.h
@@ -43,8 +43,10 @@ qemuDomainCCWAddrSetCreateFromDomain(virDomainDefPtr def)
 
 virDomainPCIAddressSetPtr
 qemuDomainPCIAddrSetCreateFromDomain(virDomainDefPtr def,
-                                     virQEMUCapsPtr qemuCaps)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+                                     bool virtioMMIOEnabled,
+                                     bool videoPrimaryEnabled,
+                                     bool gpexEnabled)
+    ATTRIBUTE_NONNULL(1);
 
 # define __QEMU_DOMAIN_ADDRESS_H__
 
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index a6404d8..fa7a8e9 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -335,7 +335,9 @@ qemuDomainAttachVirtioDiskDevice(virConnectPtr conn,
     } else if (!disk->info.type ||
                 disk->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
         if (!(pciaddrs = qemuDomainPCIAddrSetCreateFromDomain(vm->def,
-                                                              priv->qemuCaps)))
+                            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO),
+                            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY),
+                            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_GPEX))))
             goto error;
         if (virDomainPCIAddressEnsureAddr(pciaddrs, &disk->info) < 0)
             goto error;
@@ -455,7 +457,9 @@ int qemuDomainAttachControllerDevice(virQEMUDriverPtr driver,
     if (controller->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
         controller->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
         if (!(pciaddrs = qemuDomainPCIAddrSetCreateFromDomain(vm->def,
-                                                              priv->qemuCaps)))
+                            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO),
+                            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY),
+                            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_GPEX))))
             goto cleanup;
         if (virDomainPCIAddressEnsureAddr(pciaddrs, &controller->info) < 0)
             goto cleanup;
@@ -973,7 +977,9 @@ qemuDomainAttachNetDevice(virQEMUDriverPtr driver,
         goto cleanup;
     } else {
         if (!(pciaddrs = qemuDomainPCIAddrSetCreateFromDomain(vm->def,
-                                                              priv->qemuCaps)))
+                            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO),
+                            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY),
+                            virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_GPEX))))
             goto cleanup;
         if (virDomainPCIAddressEnsureAddr(pciaddrs, &net->info) < 0)
             goto cleanup;
@@ -1252,7 +1258,10 @@ qemuDomainAttachHostPCIDevice(virQEMUDriverPtr driver,
 
     if (qemuAssignDeviceHostdevAlias(vm->def, &hostdev->info->alias, -1) < 0)
         goto error;
-    if (!(pciaddrs = qemuDomainPCIAddrSetCreateFromDomain(vm->def, priv->qemuCaps)))
+    if (!(pciaddrs = qemuDomainPCIAddrSetCreateFromDomain(vm->def,
+                        virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO),
+                        virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY),
+                        virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_GPEX))))
         goto cleanup;
     if (virDomainPCIAddressEnsureAddr(pciaddrs, hostdev->info) < 0)
         goto error;
@@ -1498,7 +1507,10 @@ qemuDomainAttachChrDeviceAssignAddr(virDomainDefPtr def,
 
     } else if (chr->deviceType == VIR_DOMAIN_CHR_DEVICE_TYPE_SERIAL &&
                chr->targetType == VIR_DOMAIN_CHR_SERIAL_TARGET_TYPE_PCI) {
-        if (!(pciaddrs = qemuDomainPCIAddrSetCreateFromDomain(def, priv->qemuCaps)))
+        if (!(pciaddrs = qemuDomainPCIAddrSetCreateFromDomain(def,
+                             virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO),
+                             virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY),
+                             virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_GPEX))))
             goto cleanup;
         if (virDomainPCIAddressEnsureAddr(pciaddrs, &chr->info) < 0)
             goto cleanup;
@@ -1626,7 +1638,10 @@ qemuDomainAttachRNGDevice(virQEMUDriverPtr driver,
 
     if (rng->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_NONE ||
         rng->info.type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_PCI) {
-        if (!(pciaddrs = qemuDomainPCIAddrSetCreateFromDomain(vm->def, priv->qemuCaps)))
+        if (!(pciaddrs = qemuDomainPCIAddrSetCreateFromDomain(vm->def,
+                             virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIRTIO_MMIO),
+                             virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_DEVICE_VIDEO_PRIMARY),
+                             virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_OBJECT_GPEX))))
             goto cleanup;
         if (virDomainPCIAddressEnsureAddr(pciaddrs, &rng->info) < 0)
             goto cleanup;
-- 
2.7.4 (Apple Git-66)




More information about the libvir-list mailing list