net: sched: tbf: fix the calculation of max_size
authorYang Yingliang <yangyingliang@huawei.com>
Tue, 10 Dec 2013 06:59:27 +0000 (14:59 +0800)
committerDavid S. Miller <davem@davemloft.net>
Wed, 11 Dec 2013 20:08:41 +0000 (15:08 -0500)
commitcc106e441a63bec3b1cb72948df82ea15945c449
treebe4ee6109410b1613b0f465b94cca6dbb87a1561
parent4bd7b5127bd02c12c1cc837a7a0b6ce295eb2505
net: sched: tbf: fix the calculation of max_size

Current max_size is caluated from rate table. Now, the rate table
has been replaced and it's wrong to caculate max_size based on this
rate table. It can lead wrong calculation of max_size.

The burst in kernel may be lower than user asked, because burst may gets
some loss when transform it to buffer(E.g. "burst 40kb rate 30mbit/s")
and it seems we cannot avoid this loss. Burst's value(max_size) based on
rate table may be equal user asked. If a packet's length is max_size, this
packet will be stalled in tbf_dequeue() because its length is above the
burst in kernel so that it cannot get enough tokens. The max_size guards
against enqueuing packet sizes above q->buffer "time" in tbf_enqueue().

To make consistent with the calculation of tokens, this patch add a helper
psched_ns_t2l() to calculate burst(max_size) directly to fix this problem.

After this fix, we can support to using 64bit rates to calculate burst as well.

Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
Acked-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_tbf.c