From d53b09235398c1320ed2f1b45b640823171467ed Mon Sep 17 00:00:00 2001 From: Michal Privoznik Date: Fri, 4 Dec 2020 12:50:58 +0100 Subject: [PATCH] qemu: Restore default root qdisc when QoS is cleared out MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When an interface has some bandwidth limitation set (it's root qdisc is htb in that case) but this gets cleared out via public API call (virDomainSetInterfaceParameters() or virDomainUpdateDeviceFlags()) then virNetDevBandwidthSet() clears out whatever qdiscs were set on the interface and kernel places the default qdisc at the root. What we need to do next is to replace the root qdisc with the one we want. Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1329644 Fixes: 0b66196d86ea375234cb0ee99289c486f9921820 Signed-off-by: Michal Privoznik Reviewed-by: Daniel P. Berrangé --- src/qemu/qemu_driver.c | 9 +++++++++ src/qemu/qemu_hotplug.c | 9 +++++++++ 2 files changed, 18 insertions(+) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 88324945ef..26c6e9b2e1 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -10339,6 +10339,15 @@ qemuDomainSetInterfaceParameters(virDomainPtr dom, goto endjob; } + /* If the old bandwidth was cleared out, restore qdisc. */ + if (virDomainNetTypeSharesHostView(net)) { + if (!newBandwidth->out || newBandwidth->out->average == 0) + qemuDomainInterfaceSetDefaultQDisc(driver, net); + } else { + if (!newBandwidth->in || newBandwidth->in->average == 0) + qemuDomainInterfaceSetDefaultQDisc(driver, net); + } + virNetDevBandwidthFree(net->bandwidth); if (newBandwidth->in || newBandwidth->out) { net->bandwidth = newBandwidth; diff --git a/src/qemu/qemu_hotplug.c b/src/qemu/qemu_hotplug.c index e5848d7de4..ec5c522000 100644 --- a/src/qemu/qemu_hotplug.c +++ b/src/qemu/qemu_hotplug.c @@ -3881,6 +3881,15 @@ qemuDomainChangeNet(virQEMUDriverPtr driver, */ virNetDevBandwidthClear(newdev->ifname); } + + /* If the old bandwidth was cleared out, restore qdisc. */ + if (virDomainNetTypeSharesHostView(newdev)) { + if (!newb->out || newb->out->average == 0) + qemuDomainInterfaceSetDefaultQDisc(driver, newdev); + } else { + if (!newb->in || newb->in->average == 0) + qemuDomainInterfaceSetDefaultQDisc(driver, newdev); + } needReplaceDevDef = true; }