[libvirt] [PATCH v3 06/15] conf: expand network device callbacks to cover bandwidth updates

Daniel P. Berrangé berrange at redhat.com
Mon Feb 5 15:28:20 UTC 2018


Currently the QEMU driver will call directly into the network driver
impl to modify network device bandwidth for interfaces with
type=network. This introduces a callback system to allow us to decouple
the QEMU driver from the network driver.

Signed-off-by: Daniel P. Berrangé <berrange at redhat.com>
---
 src/conf/domain_conf.c      | 35 ++++++++++++++++++++++++++++++++++-
 src/conf/domain_conf.h      | 22 +++++++++++++++++++++-
 src/libvirt_private.syms    |  2 ++
 src/network/bridge_driver.c |  8 +++++---
 src/network/bridge_driver.h | 24 ------------------------
 src/qemu/qemu_driver.c      |  5 ++---
 6 files changed, 64 insertions(+), 32 deletions(-)

diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 1e3a83cf73..205f99618d 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -28820,15 +28820,22 @@ virDomainNetTypeSharesHostView(const virDomainNetDef *net)
 static virDomainNetAllocateActualDeviceImpl netAllocate;
 static virDomainNetNotifyActualDeviceImpl netNotify;
 static virDomainNetReleaseActualDeviceImpl netRelease;
+static virDomainNetBandwidthChangeAllowedImpl netBandwidthChangeAllowed;
+static virDomainNetBandwidthUpdateImpl netBandwidthUpdate;
+
 
 void
 virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl allocate,
                           virDomainNetNotifyActualDeviceImpl notify,
-                          virDomainNetReleaseActualDeviceImpl release)
+                          virDomainNetReleaseActualDeviceImpl release,
+                          virDomainNetBandwidthChangeAllowedImpl bandwidthChangeAllowed,
+                          virDomainNetBandwidthUpdateImpl bandwidthUpdate)
 {
     netAllocate = allocate;
     netNotify = notify;
     netRelease = release;
+    netBandwidthChangeAllowed = bandwidthChangeAllowed;
+    netBandwidthUpdate = bandwidthUpdate;
 }
 
 int
@@ -28870,3 +28877,29 @@ virDomainNetReleaseActualDevice(virDomainDefPtr dom,
 
     return netRelease(dom, iface);
 }
+
+bool
+virDomainNetBandwidthChangeAllowed(virDomainNetDefPtr iface,
+                              virNetDevBandwidthPtr newBandwidth)
+{
+    if (!netBandwidthChangeAllowed) {
+        virReportError(VIR_ERR_NO_SUPPORT, "%s",
+                       _("Network device release not available"));
+        return -1;
+    }
+
+    return netBandwidthChangeAllowed(iface, newBandwidth);
+}
+
+int
+virDomainNetBandwidthUpdate(virDomainNetDefPtr iface,
+                            virNetDevBandwidthPtr newBandwidth)
+{
+    if (!netBandwidthUpdate) {
+        virReportError(VIR_ERR_NO_SUPPORT, "%s",
+                       _("Network device release not available"));
+        return -1;
+    }
+
+    return netBandwidthUpdate(iface, newBandwidth);
+}
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 45461f8ef2..32948e181c 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -3466,10 +3466,21 @@ typedef int
 (*virDomainNetReleaseActualDeviceImpl)(virDomainDefPtr dom,
                                        virDomainNetDefPtr iface);
 
+typedef bool
+(*virDomainNetBandwidthChangeAllowedImpl)(virDomainNetDefPtr iface,
+                                          virNetDevBandwidthPtr newBandwidth);
+
+typedef int
+(*virDomainNetBandwidthUpdateImpl)(virDomainNetDefPtr iface,
+                                   virNetDevBandwidthPtr newBandwidth);
+
+
 void
 virDomainNetSetDeviceImpl(virDomainNetAllocateActualDeviceImpl allocate,
                           virDomainNetNotifyActualDeviceImpl notify,
-                          virDomainNetReleaseActualDeviceImpl release);
+                          virDomainNetReleaseActualDeviceImpl release,
+                          virDomainNetBandwidthChangeAllowedImpl bandwidthChangeAllowed,
+                          virDomainNetBandwidthUpdateImpl bandwidthUpdate);
 
 int
 virDomainNetAllocateActualDevice(virDomainDefPtr dom,
@@ -3486,6 +3497,15 @@ virDomainNetReleaseActualDevice(virDomainDefPtr dom,
                                 virDomainNetDefPtr iface)
     ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
+bool
+virDomainNetBandwidthChangeAllowed(virDomainNetDefPtr iface,
+                              virNetDevBandwidthPtr newBandwidth)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
+
+int
+virDomainNetBandwidthUpdate(virDomainNetDefPtr iface,
+                            virNetDevBandwidthPtr newBandwidth)
+    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
 
 
 #endif /* __DOMAIN_CONF_H */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index ecb90febc0..45ae25e57c 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -435,6 +435,8 @@ virDomainMemorySourceTypeFromString;
 virDomainMemorySourceTypeToString;
 virDomainNetAllocateActualDevice;
 virDomainNetAppendIPAddress;
+virDomainNetBandwidthChangeAllowed;
+virDomainNetBandwidthUpdate;
 virDomainNetDefClear;
 virDomainNetDefFormat;
 virDomainNetDefFree;
diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 4113217882..ab1d82ed31 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -5631,7 +5631,7 @@ networkBandwidthGenericChecks(virDomainNetDefPtr iface,
 }
 
 
-bool
+static bool
 networkBandwidthChangeAllowed(virDomainNetDefPtr iface,
                               virNetDevBandwidthPtr newBandwidth)
 {
@@ -5662,7 +5662,7 @@ networkBandwidthChangeAllowed(virDomainNetDefPtr iface,
 }
 
 
-int
+static int
 networkBandwidthUpdate(virDomainNetDefPtr iface,
                        virNetDevBandwidthPtr newBandwidth)
 {
@@ -5814,7 +5814,9 @@ networkRegister(void)
     virDomainNetSetDeviceImpl(
         networkAllocateActualDevice,
         networkNotifyActualDevice,
-        networkReleaseActualDevice);
+        networkReleaseActualDevice,
+        networkBandwidthChangeAllowed,
+        networkBandwidthUpdate);
 
     return 0;
 }
diff --git a/src/network/bridge_driver.h b/src/network/bridge_driver.h
index dbb4fa8086..098f9e5c5b 100644
--- a/src/network/bridge_driver.h
+++ b/src/network/bridge_driver.h
@@ -52,16 +52,6 @@ networkDnsmasqConfContents(virNetworkObjPtr obj,
                            dnsmasqContext *dctx,
                            dnsmasqCapsPtr caps);
 
-bool
-networkBandwidthChangeAllowed(virDomainNetDefPtr iface,
-                              virNetDevBandwidthPtr newBandwidth)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-
-int
-networkBandwidthUpdate(virDomainNetDefPtr iface,
-                       virNetDevBandwidthPtr newBandwidth)
-    ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
-
 # else
 /* Define no-op replacements that don't drag in any link dependencies.  */
 #  define networkGetActualType(iface) (iface->type)
@@ -69,20 +59,6 @@ networkBandwidthUpdate(virDomainNetDefPtr iface,
 #  define networkDnsmasqConfContents(network, pidfile, configstr, \
                     dctx, caps) 0
 
-static inline bool
-networkBandwidthChangeAllowed(virDomainNetDefPtr iface ATTRIBUTE_UNUSED,
-                              virNetDevBandwidthPtr newBandwidth ATTRIBUTE_UNUSED)
-{
-    return true;
-}
-
-static inline int
-networkBandwidthUpdate(virDomainNetDefPtr iface ATTRIBUTE_UNUSED,
-                       virNetDevBandwidthPtr newBandwidth ATTRIBUTE_UNUSED)
-{
-    return 0;
-}
-
 # endif
 
 #endif /* __VIR_NETWORK__DRIVER_H */
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 2b8b0682d5..c9bbe0ca37 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -106,7 +106,6 @@
 #include "virperf.h"
 #include "virnuma.h"
 #include "dirname.h"
-#include "network/bridge_driver.h"
 #include "netdev_bandwidth_conf.h"
 
 #define VIR_FROM_THIS VIR_FROM_QEMU
@@ -11265,12 +11264,12 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom,
                    sizeof(*newBandwidth->out));
         }
 
-        if (!networkBandwidthChangeAllowed(net, newBandwidth))
+        if (!virDomainNetBandwidthChangeAllowed(net, newBandwidth))
             goto endjob;
 
         if (virNetDevBandwidthSet(net->ifname, newBandwidth, false,
                                   !virDomainNetTypeSharesHostView(net)) < 0 ||
-            networkBandwidthUpdate(net, newBandwidth) < 0) {
+            virDomainNetBandwidthUpdate(net, newBandwidth) < 0) {
             ignore_value(virNetDevBandwidthSet(net->ifname,
                                                net->bandwidth,
                                                false,
-- 
2.14.3




More information about the libvir-list mailing list