
On Fri, Nov 22, 2024 at 04:16:37PM -0500, Laine Stump wrote:
There will soon be two separate users of tc on virtual networks, and both will use the "qdisc root handle 1: htb" to add tx filters. One or the other could get the first chance to add the qdisc, and then if at a later time the other decides to use it, we need to prevent the 2nd user from attempting to re-add the qdisc (because that just generates an error).
We do this by running "tc qdisc show dev $bridge handle 1:" then checking if the output of that command starts with "qdisc htb 1: root". If it does then the qdisc is already there. If not then we need to add it now.
diff --git a/src/util/virnetdevbandwidth.c b/src/util/virnetdevbandwidth.c index 09c10e9a15..ae7214a9d5 100644 --- a/src/util/virnetdevbandwidth.c +++ b/src/util/virnetdevbandwidth.c
+ + /* output will be something like: "qdisc htb 1: root refcnt ..." + * if the qdisc was already added. + */ + if (!(testResult && STRPREFIX(testResult, "qdisc htb 1: root"))) {
I wonder a little how stable "tc qdisc show" output format has been over time ? This is a very exact match we're performing. Don't suppose there's some way to detect this scenario without parsing human output from 'tc' ?
+ /* didn't find qdisc in output, so we need to add one */ + g_autoptr(virCommand) addCmd = virCommandNew(TC); + + virCommandAddArgList(addCmd, "qdisc", "add", "dev", ifname, "root", + "handle", "1:", "htb", "default", + hierarchical_class ? "2" : "1", NULL); + + return virCommandRun(addCmd, NULL); + } + + return 0; }
With regards, Daniel -- |: https://berrange.com -o- https://www.flickr.com/photos/dberrange :| |: https://libvirt.org -o- https://fstop138.berrange.com :| |: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|