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(a)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 50c485853a..61c36be025 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -28804,15 +28804,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
@@ -28854,3 +28861,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 ccd19d6a6b..dee49a2014 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 e1e1fc0c8f..4cd96067a0 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -433,6 +433,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 a492b190e4..a0e45d1f65 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -5589,7 +5589,7 @@ networkBandwidthGenericChecks(virDomainNetDefPtr iface,
}
-bool
+static bool
networkBandwidthChangeAllowed(virDomainNetDefPtr iface,
virNetDevBandwidthPtr newBandwidth)
{
@@ -5620,7 +5620,7 @@ networkBandwidthChangeAllowed(virDomainNetDefPtr iface,
}
-int
+static int
networkBandwidthUpdate(virDomainNetDefPtr iface,
virNetDevBandwidthPtr newBandwidth)
{
@@ -5718,7 +5718,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 0d005ca945..24c577a1b5 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