SUNRPC: Fail over more quickly on connect errors
[safe/jmp/linux-2.6] / net / sched / sch_generic.c
index 4ae6aa5..ff4dd53 100644 (file)
@@ -24,6 +24,7 @@
 #include <linux/init.h>
 #include <linux/rcupdate.h>
 #include <linux/list.h>
+#include <linux/slab.h>
 #include <net/pkt_sched.h>
 
 /* Main transmission queue. */
@@ -119,32 +120,26 @@ int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
        spin_unlock(root_lock);
 
        HARD_TX_LOCK(dev, txq, smp_processor_id());
-       if (!netif_tx_queue_stopped(txq) &&
-           !netif_tx_queue_frozen(txq))
+       if (!netif_tx_queue_stopped(txq) && !netif_tx_queue_frozen(txq))
                ret = dev_hard_start_xmit(skb, dev, txq);
+
        HARD_TX_UNLOCK(dev, txq);
 
        spin_lock(root_lock);
 
-       switch (ret) {
-       case NETDEV_TX_OK:
-               /* Driver sent out skb successfully */
+       if (dev_xmit_complete(ret)) {
+               /* Driver sent out skb successfully or skb was consumed */
                ret = qdisc_qlen(q);
-               break;
-
-       case NETDEV_TX_LOCKED:
+       } else if (ret == NETDEV_TX_LOCKED) {
                /* Driver try lock failed */
                ret = handle_dev_cpu_collision(skb, txq, q);
-               break;
-
-       default:
+       } else {
                /* Driver returned NETDEV_TX_BUSY - requeue skb */
                if (unlikely (ret != NETDEV_TX_BUSY && net_ratelimit()))
                        printk(KERN_WARNING "BUG %s code %d qlen %d\n",
                               dev->name, ret, q->q.qlen);
 
                ret = dev_requeue_skb(skb, q);
-               break;
        }
 
        if (ret && (netif_tx_queue_stopped(txq) ||