]> xenbits.xensource.com Git - libvirt.git/commitdiff
Recreate the USB address cache at reconnect
authorJán Tomko <jtomko@redhat.com>
Fri, 21 Oct 2016 11:09:04 +0000 (13:09 +0200)
committerJán Tomko <jtomko@redhat.com>
Thu, 27 Oct 2016 11:38:56 +0000 (13:38 +0200)
When starting a new domain, we allocate the USB addresses and keep
an address cache in the domain object's private data.

However this data is lost on libvirtd restart.

Also generate the address cache if all the addresses have been
specified, so that devices hotplugged after libvirtd restart
also get theirs assigned.

https://bugzilla.redhat.com/show_bug.cgi?id=1387666

src/conf/domain_addr.c
src/conf/domain_addr.h
src/libvirt_private.syms
src/qemu/qemu_domain_address.c

index 2e0c9818db561d27cbb157ebe3e4edadaa0a9dbc..2af9c646c238170c7503f598b52b170ad7b23358 100644 (file)
@@ -1830,6 +1830,18 @@ virDomainUSBAddressAssign(virDomainUSBAddressSetPtr addrs,
 }
 
 
+int
+virDomainUSBAddressPresent(virDomainDeviceInfoPtr info,
+                           void *data ATTRIBUTE_UNUSED)
+{
+    if (info->type == VIR_DOMAIN_DEVICE_ADDRESS_TYPE_USB &&
+        virDomainUSBAddressPortIsValid(info->addr.usb.port))
+        return 0;
+
+    return -1;
+}
+
+
 int
 virDomainUSBAddressReserve(virDomainDeviceInfoPtr info,
                            void *data)
index 7b6fff058a3298c9c21c73b84120b3adf69d081c..ff80fce6fe7743598d882617c1393332bc49ceb4 100644 (file)
@@ -300,6 +300,10 @@ size_t
 virDomainUSBAddressCountAllPorts(virDomainDefPtr def);
 void virDomainUSBAddressSetFree(virDomainUSBAddressSetPtr addrs);
 
+int
+virDomainUSBAddressPresent(virDomainDeviceInfoPtr info,
+                           void *data)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 int
 virDomainUSBAddressReserve(virDomainDeviceInfoPtr info,
                            void *data)
index d2156bd72587c9eb1fee8e74c0e59946eccb6283..162fda54f95201e79ad7c011a6e8e07107d3182b 100644 (file)
@@ -116,6 +116,7 @@ virDomainUSBAddressEnsure;
 virDomainUSBAddressPortFormat;
 virDomainUSBAddressPortFormatBuf;
 virDomainUSBAddressPortIsValid;
+virDomainUSBAddressPresent;
 virDomainUSBAddressRelease;
 virDomainUSBAddressReserve;
 virDomainUSBAddressSetAddControllers;
index 12f3a29f94fca8119f7be81d5d2ddf33f5c6e9d2..b35a95f08cb7a8f7f9af1e98d2a9553f43750a75 100644 (file)
@@ -1750,12 +1750,24 @@ qemuDomainUSBAddressAddHubs(virDomainDefPtr def)
 
 static int
 qemuDomainAssignUSBAddresses(virDomainDefPtr def,
-                             virDomainObjPtr obj)
+                             virDomainObjPtr obj,
+                             bool newDomain)
 {
     int ret = -1;
     virDomainUSBAddressSetPtr addrs = NULL;
     qemuDomainObjPrivatePtr priv = NULL;
 
+    if (!newDomain) {
+        /* only create the address cache for:
+         *  new domains
+         *  domains that already have all the addresses specified
+         * otherwise libvirt's attempt to recreate the USB topology via
+         * QEMU command line might fail */
+        if (virDomainUSBDeviceDefForeach(def, virDomainUSBAddressPresent, NULL,
+                                         false) < 0)
+            return 0;
+    }
+
     if (!(addrs = virDomainUSBAddressSetCreate()))
         goto cleanup;
 
@@ -1812,7 +1824,7 @@ qemuDomainAssignAddresses(virDomainDefPtr def,
     if (qemuDomainAssignPCIAddresses(def, qemuCaps, obj) < 0)
         return -1;
 
-    if (newDomain && qemuDomainAssignUSBAddresses(def, obj) < 0)
+    if (qemuDomainAssignUSBAddresses(def, obj, newDomain) < 0)
         return -1;
 
     return 0;