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 <wesley.hershberger@canonical.com> --- 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