From 1438aea4ee4c65be1c7e5096a5549bc0f7581165 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20P=2E=20Berrang=C3=A9?= Date: Thu, 25 Jan 2018 09:35:48 +0000 Subject: [PATCH] conf: expand network device callbacks to cover bandwidth updates MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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é --- 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 53c33df0dd..6de9a00fca 100644 --- a/src/conf/domain_conf.c +++ b/src/conf/domain_conf.c @@ -28821,15 +28821,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 @@ -28871,3 +28878,29 @@ virDomainNetReleaseActualDevice(virDomainDefPtr dom, return netRelease(dom, iface); } + +bool +virDomainNetBandwidthChangeAllowed(virDomainNetDefPtr iface, + virNetDevBandwidthPtr newBandwidth) +{ + if (!netBandwidthChangeAllowed) { + virReportError(VIR_ERR_NO_SUPPORT, "%s", + _("Network device bandwidth change query not available")); + return -1; + } + + return netBandwidthChangeAllowed(iface, newBandwidth); +} + +int +virDomainNetBandwidthUpdate(virDomainNetDefPtr iface, + virNetDevBandwidthPtr newBandwidth) +{ + if (!netBandwidthUpdate) { + virReportError(VIR_ERR_NO_SUPPORT, "%s", + _("Network device bandwidth update not available")); + return -1; + } + + return netBandwidthUpdate(iface, newBandwidth); +} diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h index a0f2af4a7a..3c87bb5727 100644 --- a/src/conf/domain_conf.h +++ b/src/conf/domain_conf.h @@ -3468,10 +3468,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, @@ -3488,6 +3499,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 2990c35484..44b5655bdb 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 @@ -11309,12 +11308,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,