Re: iproute2 / tbf with large burst seems broken again
From: Denys Fedoryschenko <hidden>
Date: 2009-08-25 10:32:50
Thanks a lot for your help! I will try now. On Tuesday 25 August 2009 12:41:20 Jarek Poplawski wrote:
quoted hunk ↗ jump to hunk
On Tue, Aug 25, 2009 at 09:00:35AM +0000, Jarek Poplawski wrote:quoted
On Tue, Aug 25, 2009 at 08:43:06AM +0000, Jarek Poplawski wrote: ...quoted
since these 64 bits will be needed soon for higher rates anyway, I guess we could try some change like the patch below, if you find it works for you (I didn't test it yet.)I hope this time it works... Jarek P.--- (take 2) net/sched/sch_tbf.c | 14 +++++++------- 1 files changed, 7 insertions(+), 7 deletions(-) diff --git a/net/sched/sch_tbf.c b/net/sched/sch_tbf.c index e22dfe8..7d0fe69 100644 --- a/net/sched/sch_tbf.c +++ b/net/sched/sch_tbf.c@@ -108,8 +108,8 @@ struct tbf_sched_data struct qdisc_rate_table *P_tab; /* Variables */ - long tokens; /* Current number of B tokens */ - long ptokens; /* Current number of P tokens */ + u32 tokens; /* Current number of B tokens */ + u32 ptokens; /* Current number of P tokens */ psched_time_t t_c; /* Time check-point */ struct Qdisc *qdisc; /* Inner qdisc, default - bfifo queue */ struct qdisc_watchdog watchdog; /* Watchdog timer */@@ -160,21 +160,21 @@ static struct sk_buff *tbf_dequeue(struct Qdisc* sch) if (skb) { psched_time_t now; - long toks; - long ptoks = 0; + long long toks; + long long ptoks = 0; unsigned int len = qdisc_pkt_len(skb); now = psched_get_time(); - toks = psched_tdiff_bounded(now, q->t_c, q->buffer); + toks = min_t(u32, now - q->t_c, q->buffer); if (q->P_tab) { ptoks = toks + q->ptokens; - if (ptoks > (long)q->mtu) + if (ptoks > q->mtu) ptoks = q->mtu; ptoks -= L2T_P(q, len); } toks += q->tokens; - if (toks > (long)q->buffer) + if (toks > q->buffer) toks = q->buffer; toks -= L2T(q, len);