[libvirt] [PATCH 2/2] qemu, lxc: Fail explicitly if setting QoS on unsupported vNIC types

Michal Privoznik mprivozn at redhat.com
Wed Jan 7 17:31:06 UTC 2015


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

So, there are still plenty of vNIC types that we don't know how to set
bandwidth on. Let's fail explicitly in case user has requested it
instead of pretending everything

Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
---
 src/lxc/lxc_driver.c    | 20 +++++++++++++++-----
 src/lxc/lxc_process.c   | 20 +++++++++++++++-----
 src/qemu/qemu_command.c | 21 +++++++++++++++------
 src/qemu/qemu_hotplug.c | 20 +++++++++++++++-----
 4 files changed, 60 insertions(+), 21 deletions(-)

diff --git a/src/lxc/lxc_driver.c b/src/lxc/lxc_driver.c
index 51c664f..10a4a7e 100644
--- a/src/lxc/lxc_driver.c
+++ b/src/lxc/lxc_driver.c
@@ -4139,6 +4139,7 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn,
     virLXCDomainObjPrivatePtr priv = vm->privateData;
     int ret = -1;
     int actualType;
+    virNetDevBandwidthPtr actualBandwidth;
     char *veth = NULL;
 
     if (!priv->initpid) {
@@ -4186,11 +4187,20 @@ lxcDomainAttachDeviceNetLive(virConnectPtr conn,
                        _("Network device type is not supported"));
         goto cleanup;
     }
-    /* set network bandwidth */
-    if (virNetDevSupportBandwidth(actualType) &&
-        virNetDevBandwidthSet(net->ifname,
-                              virDomainNetGetActualBandwidth(net), false) < 0)
-        goto cleanup;
+    /* Set bandwidth or fail if requested and not supported. */
+    actualBandwidth = virDomainNetGetActualBandwidth(net);
+    if (actualBandwidth) {
+        if (!virNetDevSupportBandwidth(actualType)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("setting bandwidth on interfaces of "
+                             "type '%s' is not implemented yet"),
+                           virDomainNetTypeToString(actualType));
+            goto cleanup;
+        }
+
+        if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false) < 0)
+            goto cleanup;
+    }
 
     if (virNetDevSetNamespace(veth, priv->initpid) < 0) {
         virDomainAuditNet(vm, NULL, net, "attach", false);
diff --git a/src/lxc/lxc_process.c b/src/lxc/lxc_process.c
index d7eb8bc..9fa900e 100644
--- a/src/lxc/lxc_process.c
+++ b/src/lxc/lxc_process.c
@@ -371,6 +371,7 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn,
 
     for (i = 0; i < def->nnets; i++) {
         char *veth = NULL;
+        virNetDevBandwidthPtr actualBandwidth;
         /* If appropriate, grab a physical device from the configured
          * network's pool of devices, or resolve bridge device name
          * to the one defined in the network definition.
@@ -424,11 +425,20 @@ static int virLXCProcessSetupInterfaces(virConnectPtr conn,
 
         }
 
-        /* set network bandwidth */
-        if (virNetDevSupportBandwidth(type) &&
-            virNetDevBandwidthSet(net->ifname,
-                                  virDomainNetGetActualBandwidth(net), false) < 0)
-            goto cleanup;
+        /* Set bandwidth or fail if requested and not supported. */
+        actualBandwidth = virDomainNetGetActualBandwidth(net);
+        if (actualBandwidth) {
+            if (!virNetDevSupportBandwidth(type)) {
+                virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                               _("setting bandwidth on interfaces of "
+                                 "type '%s' is not implemented yet"),
+                               virDomainNetTypeToString(type));
+                goto cleanup;
+            }
+
+            if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false) < 0)
+                goto cleanup;
+        }
 
         (*veths)[(*nveths)-1] = veth;
 
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index d5679de..1729866 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -7358,6 +7358,7 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
     char **tapfdName = NULL;
     char **vhostfdName = NULL;
     int actualType = virDomainNetGetActualType(net);
+    virNetDevBandwidthPtr actualBandwidth;
     size_t i;
 
     if (actualType == VIR_DOMAIN_NET_TYPE_VHOSTUSER)
@@ -7408,12 +7409,20 @@ qemuBuildInterfaceCommandLine(virCommandPtr cmd,
             goto cleanup;
     }
 
-    /* Set Bandwidth */
-    if (virNetDevSupportBandwidth(actualType) &&
-        virNetDevBandwidthSet(net->ifname,
-                              virDomainNetGetActualBandwidth(net),
-                              false) < 0)
-        goto cleanup;
+    /* Set bandwidth or fail if requested and not supported. */
+    actualBandwidth = virDomainNetGetActualBandwidth(net);
+    if (actualBandwidth) {
+        if (!virNetDevSupportBandwidth(actualType)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("setting bandwidth on interfaces of "
+                             "type '%s' is not implemented yet"),
+                           virDomainNetTypeToString(actualType));
+            goto cleanup;
+        }
+
+        if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false) < 0)
+            goto cleanup;
+    }
 
     if ((actualType == VIR_DOMAIN_NET_TYPE_NETWORK ||
          actualType == VIR_DOMAIN_NET_TYPE_BRIDGE ||
diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c
index 1714341..5ea374b 100644
--- a/src/qemu/qemu_hotplug.c
+++ b/src/qemu/qemu_hotplug.c
@@ -838,6 +838,7 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
     bool releaseaddr = false;
     bool iface_connected = false;
     int actualType;
+    virNetDevBandwidthPtr actualBandwidth;
     virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
     size_t i;
 
@@ -926,11 +927,20 @@ int qemuDomainAttachNetDevice(virConnectPtr conn,
     if (qemuInterfaceStartDevice(net) < 0)
         goto cleanup;
 
-    /* Set Bandwidth */
-    if (virNetDevSupportBandwidth(actualType) &&
-        virNetDevBandwidthSet(net->ifname,
-                              virDomainNetGetActualBandwidth(net), false) < 0)
-        goto cleanup;
+    /* Set bandwidth or fail if requested and not supported. */
+    actualBandwidth = virDomainNetGetActualBandwidth(net);
+    if (actualBandwidth) {
+        if (!virNetDevSupportBandwidth(actualType)) {
+            virReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                           _("setting bandwidth on interfaces of "
+                             "type '%s' is not implemented yet"),
+                           virDomainNetTypeToString(actualType));
+            goto cleanup;
+        }
+
+        if (virNetDevBandwidthSet(net->ifname, actualBandwidth, false) < 0)
+            goto cleanup;
+    }
 
     for (i = 0; i < tapfdSize; i++) {
         if (virSecurityManagerSetTapFDLabel(driver->securityManager,
-- 
2.0.5




More information about the libvir-list mailing list