[libvirt] [PATCH v5 13/24] network: introduce networkUpdatePortBandwidth

Daniel P. Berrangé berrange at redhat.com
Tue May 14 15:48:25 UTC 2019


Separate network port bandwidth update code from the domain driver
network callback implementation.

Reviewed-by: Laine Stump <laine at laine.org>
Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 src/network/bridge_driver.c | 117 ++++++++++++++++++++----------------
 1 file changed, 66 insertions(+), 51 deletions(-)

diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 8025c4c984..aada1e0316 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -5416,78 +5416,56 @@ networkNetworkObjTaint(virNetworkObjPtr obj,
 
 
 static int
-networkBandwidthUpdate(virDomainNetDefPtr iface,
-                       virNetDevBandwidthPtr newBandwidth)
+networkUpdatePortBandwidth(virNetworkObjPtr obj,
+                           virMacAddrPtr mac,
+                           unsigned int *class_id,
+                           virNetDevBandwidthPtr oldBandwidth,
+                           virNetDevBandwidthPtr newBandwidth)
 {
     virNetworkDriverStatePtr driver = networkGetDriver();
-    virNetworkObjPtr obj = NULL;
     virNetworkDefPtr def;
     unsigned long long tmp_floor_sum;
-    virNetDevBandwidthPtr ifaceBand = virDomainNetGetActualBandwidth(iface);
     unsigned long long new_rate = 0;
     unsigned long long old_floor, new_floor;
     int plug_ret;
-    int ret = -1;
-
-    if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
-        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
-                       _("Expected an interface for a virtual network"));
-        return -1;
-    }
-
-    if (virDomainNetGetActualType(iface) != VIR_DOMAIN_NET_TYPE_NETWORK &&
-        (virDomainNetGetActualType(iface) != VIR_DOMAIN_NET_TYPE_BRIDGE ||
-         iface->data.network.actual->data.bridge.brname != NULL)) {
-        /* This is not an interface that's plugged into a bridge.
-         * We don't care. Thus from our POV bandwidth change is allowed. */
-        return 0;
-    }
 
     old_floor = new_floor = 0;
 
-    if (ifaceBand && ifaceBand->in)
-        old_floor = ifaceBand->in->floor;
+    if (oldBandwidth && oldBandwidth->in)
+        old_floor = oldBandwidth->in->floor;
     if (newBandwidth && newBandwidth->in)
         new_floor = newBandwidth->in->floor;
 
     if (new_floor == old_floor)
         return 0;
 
-    obj = virNetworkObjFindByName(driver->networks, iface->data.network.name);
-    if (!obj) {
-        virReportError(VIR_ERR_NO_NETWORK,
-                       _("no network with matching name '%s'"),
-                       iface->data.network.name);
-        return ret;
-    }
     def = virNetworkObjGetDef(obj);
 
-    if ((plug_ret = networkCheckBandwidth(obj, newBandwidth, ifaceBand,
-                                          &iface->mac, &new_rate)) < 0) {
+    if ((plug_ret = networkCheckBandwidth(obj, newBandwidth, oldBandwidth,
+                                          mac, &new_rate)) < 0) {
         /* helper reported error */
-        goto cleanup;
+        return -1;
     }
 
     if (plug_ret > 0) {
         /* no QoS needs to be set; claim success */
-        ret = 0;
-        goto cleanup;
+        return 0;
     }
 
     /* Okay, there are three possible scenarios: */
 
-    if (ifaceBand && ifaceBand->in && ifaceBand->in->floor &&
+    if (oldBandwidth && oldBandwidth->in && oldBandwidth->in->floor &&
         newBandwidth->in && newBandwidth->in->floor) {
         /* Either we just need to update @floor .. */
 
         if (virNetDevBandwidthUpdateRate(def->bridge,
-                                         iface->data.network.actual->class_id,
+                                         *class_id,
                                          def->bandwidth,
                                          newBandwidth->in->floor) < 0)
-            goto cleanup;
+            return -1;
 
         tmp_floor_sum = virNetworkObjGetFloorSum(obj);
-        tmp_floor_sum -= ifaceBand->in->floor;
+        tmp_floor_sum -= oldBandwidth->in->floor;
         tmp_floor_sum += newBandwidth->in->floor;
         virNetworkObjSetFloorSum(obj, tmp_floor_sum);
         new_rate -= tmp_floor_sum;
@@ -5497,34 +5475,71 @@ networkBandwidthUpdate(virDomainNetDefPtr iface,
             virNetworkObjSaveStatus(driver->stateDir, obj) < 0) {
             /* Ouch, rollback */
             tmp_floor_sum -= newBandwidth->in->floor;
-            tmp_floor_sum += ifaceBand->in->floor;
+            tmp_floor_sum += oldBandwidth->in->floor;
             virNetworkObjSetFloorSum(obj, tmp_floor_sum);
 
             ignore_value(virNetDevBandwidthUpdateRate(def->bridge,
-                                                      iface->data.network.actual->class_id,
+                                                      *class_id,
                                                       def->bandwidth,
-                                                      ifaceBand->in->floor));
-            goto cleanup;
+                                                      oldBandwidth->in->floor));
+            return -1;
         }
     } else if (newBandwidth->in && newBandwidth->in->floor) {
         /* .. or we need to plug in new .. */
 
-        if (networkPlugBandwidthImpl(obj, &iface->mac, newBandwidth,
-                                     iface->data.network.actual ?
-                                     &iface->data.network.actual->class_id : NULL,
+        if (networkPlugBandwidthImpl(obj, mac, newBandwidth,
+                                     class_id,
                                      new_rate) < 0)
-            goto cleanup;
+            return -1;
     } else {
         /* .. or unplug old. */
 
-        if (networkUnplugBandwidth(obj, iface->bandwidth,
-                                   iface->data.network.actual ?
-                                   &iface->data.network.actual->class_id : NULL) < 0)
-            goto cleanup;
+        if (networkUnplugBandwidth(obj, oldBandwidth, class_id) < 0)
+            return -1;
     }
 
-    ret = 0;
- cleanup:
+    return 0;
+}
+
+
+static int
+networkBandwidthUpdate(virDomainNetDefPtr iface,
+                       virNetDevBandwidthPtr newBandwidth)
+{
+    virNetworkDriverStatePtr driver = networkGetDriver();
+    virNetworkObjPtr obj = NULL;
+    virNetDevBandwidthPtr oldBandwidth = virDomainNetGetActualBandwidth(iface);
+    int ret = -1;
+
+    if (iface->type != VIR_DOMAIN_NET_TYPE_NETWORK) {
+        virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+                       _("Expected an interface for a virtual network"));
+        return -1;
+    }
+
+    if (virDomainNetGetActualType(iface) != VIR_DOMAIN_NET_TYPE_NETWORK &&
+        (virDomainNetGetActualType(iface) != VIR_DOMAIN_NET_TYPE_BRIDGE ||
+         iface->data.network.actual->data.bridge.brname != NULL)) {
+        /* This is not an interface that's plugged into a bridge.
+         * We don't care. Thus from our POV bandwidth change is allowed. */
+        return 0;
+    }
+
+    obj = virNetworkObjFindByName(driver->networks, iface->data.network.name);
+    if (!obj) {
+        virReportError(VIR_ERR_NO_NETWORK,
+                       _("no network with matching name '%s'"),
+                       iface->data.network.name);
+        return ret;
+    }
+
+    ret = networkUpdatePortBandwidth(obj,
+                                     &iface->mac,
+                                     iface->data.network.actual ?
+                                     &iface->data.network.actual->class_id : NULL,
+                                     newBandwidth,
+                                     oldBandwidth);
+
     virNetworkObjEndAPI(&obj);
     return ret;
 }
-- 
2.21.0




More information about the libvir-list mailing list