]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/sched/sch_generic.c
fastboot: make the raid autodetect code wait for all devices to init
[karo-tx-linux.git] / net / sched / sch_generic.c
index 5e7e0bd38fe80a8e82829fad7ce6cccdbc4ba8a1..7b5572d6beb59b561e92ad6d030d801f5fd0c72f 100644 (file)
@@ -44,15 +44,16 @@ static inline int qdisc_qlen(struct Qdisc *q)
 
 static inline int dev_requeue_skb(struct sk_buff *skb, struct Qdisc *q)
 {
-       __skb_queue_head(&q->requeue, skb);
-
+       q->gso_skb = skb;
+       q->qstats.requeues++;
        __netif_schedule(q);
+
        return 0;
 }
 
 static inline struct sk_buff *dequeue_skb(struct Qdisc *q)
 {
-       struct sk_buff *skb = skb_peek(&q->requeue);
+       struct sk_buff *skb = q->gso_skb;
 
        if (unlikely(skb)) {
                struct net_device *dev = qdisc_dev(q);
@@ -61,7 +62,7 @@ static inline struct sk_buff *dequeue_skb(struct Qdisc *q)
                /* check the reason of requeuing without tx lock first */
                txq = netdev_get_tx_queue(dev, skb_get_queue_mapping(skb));
                if (!netif_tx_queue_stopped(txq) && !netif_tx_queue_frozen(txq))
-                       __skb_unlink(skb, &q->requeue);
+                       q->gso_skb = NULL;
                else
                        skb = NULL;
        } else {
@@ -548,6 +549,7 @@ void qdisc_destroy(struct Qdisc *qdisc)
        module_put(ops->owner);
        dev_put(qdisc_dev(qdisc));
 
+       kfree_skb(qdisc->gso_skb);
        __skb_queue_purge(&qdisc->requeue);
 
        kfree((char *) qdisc - qdisc->padded);