On Mon, 2016-04-11 at 08:24 +0200, Lars Persson wrote: > A failure in validate_xmit_skb_list() triggered an unconditional call > to dev_requeue_skb with skb=NULL. This slowly grows the queue > discipline's qlen count until all traffic through the queue stops. > > By introducing a NULL check in dev_requeue_skb it was also necessary > to make the __netif_schedule call conditional to avoid scheduling an > empty queue. > > Fixes: 55a93b3ea780 ("qdisc: validate skb without holding lock") > Signed-off-by: Lars Persson <lar...@axis.com> > --- > net/sched/sch_generic.c | 11 +++++++---- > 1 file changed, 7 insertions(+), 4 deletions(-) > > diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c > index f18c350..4e6a79c 100644 > --- a/net/sched/sch_generic.c > +++ b/net/sched/sch_generic.c > @@ -47,10 +47,13 @@ EXPORT_SYMBOL(default_qdisc_ops); > > static inline int dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q) > { > - q->gso_skb = skb; > - q->qstats.requeues++; > - q->q.qlen++; /* it's still part of the queue */ > - __netif_schedule(q); > + if (skb) { > + q->gso_skb = skb; > + q->qstats.requeues++; > + q->q.qlen++; /* it's still part of the queue */ > + } > + if (qdisc_qlen(q)) > + __netif_schedule(q); > > return 0; > }
Please always CC patch author when fixing a bug. Why adding the if (qdisc_qlen(q)) extra test ? This seems unrelated to the bug fix, and probably should be part of a second patch targeting net-next tree. Also please add a likely() clause if (likely(skb)) { q->gso_skb = skb; q->qstats.requeues++; q->q.qlen++; /* it's still part of the queue */ __netif_schedule(q); } Thanks !