]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
network: unplug bandwidth and call networkRunHook only when appropriate
authorLaine Stump <laine@laine.org>
Tue, 25 Feb 2014 14:47:22 +0000 (16:47 +0200)
committerLaine Stump <laine@laine.org>
Wed, 26 Feb 2014 11:08:56 +0000 (13:08 +0200)
According to commit b4e0299d if networkAllocateActualDevice() was
successful, it will *always* allocate an iface->data.network.actual,
so we can use this during networkReleaseActualDevice() to know if
there is really anything to undo. We were properly using this
information to only decrement the network connections counter if it
had previously been incremented, but we were unconditionally
unplugging bandwidth and calling the "unplugged" network hook for
*all* interfaces (during qemuProcessStop()) whether they had been
previously plugged or not. This caused problems if a domain failed to
start at some time prior to all interfaces being allocated. (I
encountered this when an interface had a bandwidth floor set but no
inbound QoS).

This patch changes both the call to networkUnplugBandwidth() and the
call to networkRunHook() to only be called if there was a previous
call to "plug" for the same interface.

src/network/bridge_driver.c

index 3fb5ad321d3a6f0889da389efc5d9a8d412c573d..c797f8fd12e33031e304bef43c085feee5a3efc2 100644 (file)
@@ -3936,7 +3936,8 @@ networkReleaseActualDevice(virDomainDefPtr dom,
     }
     netdef = network->def;
 
-    if ((netdef->forward.type == VIR_NETWORK_FORWARD_NONE ||
+    if (iface->data.network.actual &&
+        (netdef->forward.type == VIR_NETWORK_FORWARD_NONE ||
          netdef->forward.type == VIR_NETWORK_FORWARD_NAT ||
          netdef->forward.type == VIR_NETWORK_FORWARD_ROUTE) &&
         networkUnplugBandwidth(network, iface) < 0)
@@ -4029,15 +4030,15 @@ networkReleaseActualDevice(virDomainDefPtr dom,
    }
 
 success:
-    if (iface->data.network.actual)
+    if (iface->data.network.actual) {
         netdef->connections--;
+        VIR_DEBUG("Releasing network %s, %d connections",
+                  netdef->name, netdef->connections);
 
-    /* finally we can call the 'unplugged' hook script if any */
-    networkRunHook(network, dom, iface, VIR_HOOK_NETWORK_OP_IFACE_UNPLUGGED,
-                   VIR_HOOK_SUBOP_BEGIN);
-
-    VIR_DEBUG("Releasing network %s, %d connections",
-              netdef->name, netdef->connections);
+        /* finally we can call the 'unplugged' hook script if any */
+        networkRunHook(network, dom, iface, VIR_HOOK_NETWORK_OP_IFACE_UNPLUGGED,
+                       VIR_HOOK_SUBOP_BEGIN);
+    }
     ret = 0;
 cleanup:
     if (network)