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 :|