提交 d90df3ad 编写于 作者: H Herbert Xu 提交者: David S. Miller

[NET_SCHED]: Rationalise return value of qdisc_restart

The current return value scheme and associated comment was invented
back in the 20th century when we still had that tbusy flag.  Things
have changed quite a bit since then (even Tony Blair is moving on
now, not to mention the new French president).

All we need to indicate now is whether the caller should continue
processing the queue.  Therefore it's sufficient if we return 0 if
we want to stop and non-zero otherwise.

This is based on a patch by Krishna Kumar.
Signed-off-by: NHerbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 5830725f
...@@ -71,12 +71,9 @@ void qdisc_unlock_tree(struct net_device *dev) ...@@ -71,12 +71,9 @@ void qdisc_unlock_tree(struct net_device *dev)
/* Kick device. /* Kick device.
Note, that this procedure can be called by a watchdog timer, so that
we do not check dev->tbusy flag here.
Returns: 0 - queue is empty. Returns: 0 - queue is empty or throttled.
>0 - queue is not empty, but throttled. >0 - queue is not empty.
<0 - queue is not empty. Device is throttled, if dev->tbusy != 0.
NOTE: Called under dev->queue_lock with locally disabled BH. NOTE: Called under dev->queue_lock with locally disabled BH.
*/ */
...@@ -115,7 +112,7 @@ static inline int qdisc_restart(struct net_device *dev) ...@@ -115,7 +112,7 @@ static inline int qdisc_restart(struct net_device *dev)
kfree_skb(skb); kfree_skb(skb);
if (net_ratelimit()) if (net_ratelimit())
printk(KERN_DEBUG "Dead loop on netdevice %s, fix it urgently!\n", dev->name); printk(KERN_DEBUG "Dead loop on netdevice %s, fix it urgently!\n", dev->name);
return -1; goto out;
} }
__get_cpu_var(netdev_rx_stat).cpu_collision++; __get_cpu_var(netdev_rx_stat).cpu_collision++;
goto requeue; goto requeue;
...@@ -135,7 +132,7 @@ static inline int qdisc_restart(struct net_device *dev) ...@@ -135,7 +132,7 @@ static inline int qdisc_restart(struct net_device *dev)
netif_tx_unlock(dev); netif_tx_unlock(dev);
} }
spin_lock(&dev->queue_lock); spin_lock(&dev->queue_lock);
return -1; goto out;
} }
if (ret == NETDEV_TX_LOCKED && nolock) { if (ret == NETDEV_TX_LOCKED && nolock) {
spin_lock(&dev->queue_lock); spin_lock(&dev->queue_lock);
...@@ -169,8 +166,10 @@ static inline int qdisc_restart(struct net_device *dev) ...@@ -169,8 +166,10 @@ static inline int qdisc_restart(struct net_device *dev)
else else
q->ops->requeue(skb, q); q->ops->requeue(skb, q);
netif_schedule(dev); netif_schedule(dev);
return 1; return 0;
} }
out:
BUG_ON((int) q->q.qlen < 0); BUG_ON((int) q->q.qlen < 0);
return q->q.qlen; return q->q.qlen;
} }
...@@ -180,8 +179,10 @@ void __qdisc_run(struct net_device *dev) ...@@ -180,8 +179,10 @@ void __qdisc_run(struct net_device *dev)
if (unlikely(dev->qdisc == &noop_qdisc)) if (unlikely(dev->qdisc == &noop_qdisc))
goto out; goto out;
while (qdisc_restart(dev) < 0 && !netif_queue_stopped(dev)) do {
/* NOTHING */; if (!qdisc_restart(dev))
break;
} while (!netif_queue_stopped(dev));
out: out:
clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state); clear_bit(__LINK_STATE_QDISC_RUNNING, &dev->state);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册