From: Alex Wang Date: Fri, 27 Mar 2015 18:34:53 +0000 (-0700) Subject: netdev-linux: Make htb quantum always no less than mtu. X-Git-Tag: v2.4.0~405 X-Git-Url: http://git.cascardo.eti.br/?a=commitdiff_plain;h=4f631ccd515ffb95dbe3f5c22d74b01c64a7d9b8;p=cascardo%2Fovs.git netdev-linux: Make htb quantum always no less than mtu. Currently, ovs uses hardcoded rate2quantum = 10 for each htb qdisc. When qdisc class's rate is small, the resulting quantum (calculated by min_rate / rate2quantum) will be smaller than MTU. This is not recommended and tc will keep complaining the following in syslog. localhost kernel: HTB: quantum of class 10003 is small. Consider r2q change. localhost kernel: HTB: quantum of class 10004 is small. Consider r2q change. localhost kernel: HTB: quantum of class 10005 is small. Consider r2q change. localhost kernel: HTB: quantum of class 10006 is small. Consider r2q change. To fix the issue, this commit makes ovs always use htb quantum no less than the MTU. Signed-off-by: Alex Wang Acked-by: Ben Pfaff --- diff --git a/lib/netdev-linux.c b/lib/netdev-linux.c index 5e6f01ef6..23f98566d 100644 --- a/lib/netdev-linux.c +++ b/lib/netdev-linux.c @@ -3497,6 +3497,7 @@ static const struct tc_ops tc_ops_sfq = { /* HTB traffic control class. */ #define HTB_N_QUEUES 0xf000 +#define HTB_RATE2QUANTUM 10 struct htb { struct tc tc; @@ -3555,7 +3556,7 @@ htb_setup_qdisc__(struct netdev *netdev) nl_msg_put_string(&request, TCA_KIND, "htb"); memset(&opt, 0, sizeof opt); - opt.rate2quantum = 10; + opt.rate2quantum = HTB_RATE2QUANTUM; opt.version = 3; opt.defcls = 1; @@ -3589,6 +3590,11 @@ htb_setup_class__(struct netdev *netdev, unsigned int handle, memset(&opt, 0, sizeof opt); tc_fill_rate(&opt.rate, class->min_rate, mtu); tc_fill_rate(&opt.ceil, class->max_rate, mtu); + /* Makes sure the quantum is at least MTU. Setting quantum will + * make htb ignore the r2q for this class. */ + if ((class->min_rate / HTB_RATE2QUANTUM) < mtu) { + opt.quantum = mtu; + } opt.buffer = tc_calc_buffer(opt.rate.rate, mtu, class->burst); opt.cbuffer = tc_calc_buffer(opt.ceil.rate, mtu, class->burst); opt.prio = class->priority;