When virNetDevBandwidthSet is called for a macvtap device in
qemu_command and qemu_hotplug, qemuDomainInterfaceSetDefaultQDisc has
been called already, setting the iface qdisc to 'noqueue'. If the
interface has an inbound-only bandwidth limit, the outgoing qdisc
on the device will be reset to the system default.
<interface type="direct">
...
<bandwidth>
<inbound average='3125000' peak='3125000'/>
</bandwidth>
</interface>
This only clears the qdisc on an interface before a bandwidth limit is
actually set.
Closes: https://gitlab.com/libvirt/libvirt/-/work_items/875
Signed-off-by: Wesley Hershberger <[email protected]>
---
src/util/virnetdevbandwidth.c | 18 ++++++++++++------
1 file changed, 12 insertions(+), 6 deletions(-)
diff --git a/src/util/virnetdevbandwidth.c b/src/util/virnetdevbandwidth.c
index 8de0b57943..9c14d84807 100644
--- a/src/util/virnetdevbandwidth.c
+++ b/src/util/virnetdevbandwidth.c
@@ -253,13 +253,13 @@ virNetDevBandwidthSet(const char *ifname,
tx = bandwidth->out;
}
- /* Only if the caller requests, clear everything including root
- * qdisc and all filters before adding everything.
- */
- if (flags & VIR_NETDEV_BANDWIDTH_SET_CLEAR_ALL)
- virNetDevBandwidthClear(ifname);
-
if (tx && tx->average) {
+ /* Only if the caller requests, clear the root qdisc and all filters
+ * before adding everything.
+ */
+ if (flags & VIR_NETDEV_BANDWIDTH_SET_CLEAR_ALL)
+ virNetDevBandwidthClearRoot(ifname);
+
average = g_strdup_printf("%llukbps", tx->average);
if (tx->peak)
peak = g_strdup_printf("%llukbps", tx->peak);
@@ -383,6 +383,12 @@ virNetDevBandwidthSet(const char *ifname,
}
if (rx) {
+ /* Only if the caller requests, clear the ingress qdisc and all
+ * filters before adding everything.
+ */
+ if (flags & VIR_NETDEV_BANDWIDTH_SET_CLEAR_ALL)
+ virNetDevBandwidthClearIngress(ifname);
+
average = g_strdup_printf("%llukbps", rx->average);
if (rx->burst) {
--
2.53.0