aboutsummaryrefslogtreecommitdiffstats
path: root/net/sched/sch_generic.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sched/sch_generic.c')
-rw-r--r--net/sched/sch_generic.c19
1 files changed, 7 insertions, 12 deletions
diff --git a/net/sched/sch_generic.c b/net/sched/sch_generic.c
index 4ae6aa562f2b..ff4dd53eeff0 100644
--- a/net/sched/sch_generic.c
+++ b/net/sched/sch_generic.c
@@ -24,6 +24,7 @@
24#include <linux/init.h> 24#include <linux/init.h>
25#include <linux/rcupdate.h> 25#include <linux/rcupdate.h>
26#include <linux/list.h> 26#include <linux/list.h>
27#include <linux/slab.h>
27#include <net/pkt_sched.h> 28#include <net/pkt_sched.h>
28 29
29/* Main transmission queue. */ 30/* Main transmission queue. */
@@ -119,32 +120,26 @@ int sch_direct_xmit(struct sk_buff *skb, struct Qdisc *q,
119 spin_unlock(root_lock); 120 spin_unlock(root_lock);
120 121
121 HARD_TX_LOCK(dev, txq, smp_processor_id()); 122 HARD_TX_LOCK(dev, txq, smp_processor_id());
122 if (!netif_tx_queue_stopped(txq) && 123 if (!netif_tx_queue_stopped(txq) && !netif_tx_queue_frozen(txq))
123 !netif_tx_queue_frozen(txq))
124 ret = dev_hard_start_xmit(skb, dev, txq); 124 ret = dev_hard_start_xmit(skb, dev, txq);
125
125 HARD_TX_UNLOCK(dev, txq); 126 HARD_TX_UNLOCK(dev, txq);
126 127
127 spin_lock(root_lock); 128 spin_lock(root_lock);
128 129
129 switch (ret) { 130 if (dev_xmit_complete(ret)) {
130 case NETDEV_TX_OK: 131 /* Driver sent out skb successfully or skb was consumed */
131 /* Driver sent out skb successfully */
132 ret = qdisc_qlen(q); 132 ret = qdisc_qlen(q);
133 break; 133 } else if (ret == NETDEV_TX_LOCKED) {
134
135 case NETDEV_TX_LOCKED:
136 /* Driver try lock failed */ 134 /* Driver try lock failed */
137 ret = handle_dev_cpu_collision(skb, txq, q); 135 ret = handle_dev_cpu_collision(skb, txq, q);
138 break; 136 } else {
139
140 default:
141 /* Driver returned NETDEV_TX_BUSY - requeue skb */ 137 /* Driver returned NETDEV_TX_BUSY - requeue skb */
142 if (unlikely (ret != NETDEV_TX_BUSY && net_ratelimit())) 138 if (unlikely (ret != NETDEV_TX_BUSY && net_ratelimit()))
143 printk(KERN_WARNING "BUG %s code %d qlen %d\n", 139 printk(KERN_WARNING "BUG %s code %d qlen %d\n",
144 dev->name, ret, q->q.qlen); 140 dev->name, ret, q->q.qlen);
145 141
146 ret = dev_requeue_skb(skb, q); 142 ret = dev_requeue_skb(skb, q);
147 break;
148 } 143 }
149 144
150 if (ret && (netif_tx_queue_stopped(txq) || 145 if (ret && (netif_tx_queue_stopped(txq) ||