Message ID | 20240824181901.953776-1-edumazet@google.com (mailing list archive) |
---|---|
State | Accepted |
Commit | bc21000e99f92a6b5540d7267c6b22806c5c33d3 |
Delegated to: | Netdev Maintainers |
Headers | show |
Series | [net] net_sched: sch_fq: fix incorrect behavior for small weights | expand |
Hello: This patch was applied to netdev/net.git (main) by Jakub Kicinski <kuba@kernel.org>: On Sat, 24 Aug 2024 18:19:01 +0000 you wrote: > fq_dequeue() has a complex logic to find packets in one of the 3 bands. > > As Neal found out, it is possible that one band has a deficit smaller > than its weight. fq_dequeue() can return NULL while some packets are > elligible for immediate transmit. > > In this case, more than one iteration is needed to refill pband->credit. > > [...] Here is the summary with links: - [net] net_sched: sch_fq: fix incorrect behavior for small weights https://git.kernel.org/netdev/net/c/bc21000e99f9 You are awesome, thank you!
diff --git a/net/sched/sch_fq.c b/net/sched/sch_fq.c index 238974725679327b0a0d483c011e15fc94ab0878..19a49af5a9e527ed0371a3bb96e0113755375eac 100644 --- a/net/sched/sch_fq.c +++ b/net/sched/sch_fq.c @@ -663,7 +663,9 @@ static struct sk_buff *fq_dequeue(struct Qdisc *sch) pband = &q->band_flows[q->band_nr]; pband->credit = min(pband->credit + pband->quantum, pband->quantum); - goto begin; + if (pband->credit > 0) + goto begin; + retry = 0; } if (q->time_next_delayed_flow != ~0ULL) qdisc_watchdog_schedule_range_ns(&q->watchdog,