aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChangli Gao <xiaosuo@gmail.com>2010-12-04 14:09:08 +0000
committerPaul Gortmaker <paul.gortmaker@windriver.com>2011-04-17 16:16:04 -0400
commite2d5d2b57b92b386e4867d575c20f9fdc16bcbbc (patch)
tree111a0c11931a891fd79346e678b9738b23e533c4
parent7742df2151c0a78b58f710bbbc2de61616821dd6 (diff)
ifb: goto resched directly if error happens and dp->tq isn't empty
commit 75c1c82566f23dd539fb7ccbf57a1caa7ba82628 upstream If we break the loop when there are still skbs in tq and no skb in rq, the skbs will be left in txq until new skbs are enqueued into rq. In rare cases, no new skb is queued, then these skbs will stay in rq forever. After this patch, if tq isn't empty when we break the loop, we goto resched directly. Signed-off-by: Changli Gao <xiaosuo@gmail.com> Signed-off-by: Jamal Hadi Salim <hadi@cyberus.ca> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Paul Gortmaker <paul.gortmaker@windriver.com>
-rw-r--r--drivers/net/ifb.c2
1 files changed, 2 insertions, 0 deletions
diff --git a/drivers/net/ifb.c b/drivers/net/ifb.c
index f4081c0a2d9..7f8276ef247 100644
--- a/drivers/net/ifb.c
+++ b/drivers/net/ifb.c
@@ -104,6 +104,8 @@ static void ri_tasklet(unsigned long dev)
rcu_read_unlock();
dev_kfree_skb(skb);
stats->tx_dropped++;
+ if (skb_queue_len(&dp->tq) != 0)
+ goto resched;
break;
}
rcu_read_unlock();