Message ID | 20190206180913.19381-1-marcos.antonio@digirati.com.br |
---|---|
State | Changes Requested |
Delegated to: | stephen hemminger |
Headers | show |
Series | Using rates in bits when limits are specified in % | expand |
On Wed, 6 Feb 2019 16:09:13 -0200 Marcos Antonio Moraes <marcos.antonio@digirati.com.br> wrote: > As /sys/class/net/<iface>/speed indicates a value in Mbits/sec, the > transformation is necessary to create the correct limitations. Not sure, if this is correct or not could you give an example? This patch needs a signed-off-by and a a Fixes tag. Also please put iproute2 in subject line: [PATCH iproute2] tc: use bits not mbits/sec in rate percent. Also, please rebase since I just found a memory leak in this function.
Em 06/02/2019 16:51, Stephen Hemminger escreveu: > On Wed, 6 Feb 2019 16:09:13 -0200 > Marcos Antonio Moraes <marcos.antonio@digirati.com.br> wrote: > >> As /sys/class/net/<iface>/speed indicates a value in Mbits/sec, the >> transformation is necessary to create the correct limitations. > Not sure, if this is correct or not could you give an example? Sure. With an interface with 1000 Mbits/sec speed, the following commands are expected to create the same result: `tc class add dev enp0s3 parent 1:0 classid 1:1 htb rate 500Mbit` `tc class add dev enp0s3 parent 1:0 classid 1:1 htb rate 50%` The first command creates the correct class: class htb 1:1 root prio 0 rate 500Mbit ceil 500Mbit burst 1500b cburst 1500b The second one should do the same, instead of creating a class like this: class htb 1:1 root prio 0 rate 496bit ceil 496bit burst 1599b cburst 1599b This happens because after parse_percent_rate(), get_rate() (or get_rate64()) is called, and it expects to treat the value with the unit suffix. And the value read from /sys/class/net/<iface>/speed is in Mbit/sec but does not include the unit. Converting the unity from mbit to bit would solve the problem. > > This patch needs a signed-off-by and a a Fixes tag. > > Also please put iproute2 in subject line: > > [PATCH iproute2] tc: use bits not mbits/sec in rate percent. > > Also, please rebase since I just found a memory leak in this function. I'll provide a patch with this adjustments. > >
diff --git a/tc/tc_util.c b/tc/tc_util.c index ab717890..b82142ab 100644 --- a/tc/tc_util.c +++ b/tc/tc_util.c @@ -194,7 +194,7 @@ static int parse_percent_rate(char *rate, const char *str, const char *dev) { long dev_mbit; int ret; - double perc, rate_mbit; + double perc, rate_bit; char *str_perc; if (!dev[0]) { @@ -219,9 +219,9 @@ static int parse_percent_rate(char *rate, const char *str, const char *dev) return -1; } - rate_mbit = perc * dev_mbit; + rate_bit = perc * dev_mbit * 1000 * 1000; - ret = snprintf(rate, 20, "%lf", rate_mbit); + ret = snprintf(rate, 20, "%lf", rate_bit); if (ret <= 0 || ret >= 20) { fprintf(stderr, "Unable to parse calculated rate\n"); return -1;