]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - net/sched/sch_multiq.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[karo-tx-linux.git] / net / sched / sch_multiq.c
index 155648d23b7cb5a2ed3918f1a097a0fc1de0b42a..7e151861794b5eb09eb7eb448834fc7be9fec3bc 100644 (file)
@@ -92,40 +92,6 @@ multiq_enqueue(struct sk_buff *skb, struct Qdisc *sch)
        return ret;
 }
 
-
-static int
-multiq_requeue(struct sk_buff *skb, struct Qdisc *sch)
-{
-       struct Qdisc *qdisc;
-       struct multiq_sched_data *q = qdisc_priv(sch);
-       int ret;
-
-       qdisc = multiq_classify(skb, sch, &ret);
-#ifdef CONFIG_NET_CLS_ACT
-       if (qdisc == NULL) {
-               if (ret & __NET_XMIT_BYPASS)
-                       sch->qstats.drops++;
-               kfree_skb(skb);
-               return ret;
-       }
-#endif
-
-       ret = qdisc->ops->requeue(skb, qdisc);
-       if (ret == NET_XMIT_SUCCESS) {
-               sch->q.qlen++;
-               sch->qstats.requeues++;
-               if (q->curband)
-                       q->curband--;
-               else
-                       q->curband = q->bands - 1;
-               return NET_XMIT_SUCCESS;
-       }
-       if (net_xmit_drop_count(ret))
-               sch->qstats.drops++;
-       return ret;
-}
-
-
 static struct sk_buff *multiq_dequeue(struct Qdisc *sch)
 {
        struct multiq_sched_data *q = qdisc_priv(sch);
@@ -140,7 +106,7 @@ static struct sk_buff *multiq_dequeue(struct Qdisc *sch)
                        q->curband = 0;
 
                /* Check that target subqueue is available before
-                * pulling an skb to avoid excessive requeues
+                * pulling an skb to avoid head-of-line blocking.
                 */
                if (!__netif_subqueue_stopped(qdisc_dev(sch), q->curband)) {
                        qdisc = q->queues[q->curband];
@@ -170,7 +136,7 @@ static struct sk_buff *multiq_peek(struct Qdisc *sch)
                        curband = 0;
 
                /* Check that target subqueue is available before
-                * pulling an skb to avoid excessive requeues
+                * pulling an skb to avoid head-of-line blocking.
                 */
                if (!__netif_subqueue_stopped(qdisc_dev(sch), curband)) {
                        qdisc = q->queues[curband];
@@ -248,7 +214,8 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt)
        q->bands = qopt->bands;
        for (i = q->bands; i < q->max_bands; i++) {
                if (q->queues[i] != &noop_qdisc) {
-                       struct Qdisc *child = xchg(&q->queues[i], &noop_qdisc);
+                       struct Qdisc *child = q->queues[i];
+                       q->queues[i] = &noop_qdisc;
                        qdisc_tree_decrease_qlen(child, child->q.qlen);
                        qdisc_destroy(child);
                }
@@ -258,7 +225,7 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt)
 
        for (i = 0; i < q->bands; i++) {
                if (q->queues[i] == &noop_qdisc) {
-                       struct Qdisc *child;
+                       struct Qdisc *child, *old;
                        child = qdisc_create_dflt(qdisc_dev(sch),
                                                  sch->dev_queue,
                                                  &pfifo_qdisc_ops,
@@ -266,12 +233,13 @@ static int multiq_tune(struct Qdisc *sch, struct nlattr *opt)
                                                            i + 1));
                        if (child) {
                                sch_tree_lock(sch);
-                               child = xchg(&q->queues[i], child);
+                               old = q->queues[i];
+                               q->queues[i] = child;
 
-                               if (child != &noop_qdisc) {
-                                       qdisc_tree_decrease_qlen(child,
-                                                                child->q.qlen);
-                                       qdisc_destroy(child);
+                               if (old != &noop_qdisc) {
+                                       qdisc_tree_decrease_qlen(old,
+                                                                old->q.qlen);
+                                       qdisc_destroy(old);
                                }
                                sch_tree_unlock(sch);
                        }
@@ -480,7 +448,6 @@ static struct Qdisc_ops multiq_qdisc_ops __read_mostly = {
        .enqueue        =       multiq_enqueue,
        .dequeue        =       multiq_dequeue,
        .peek           =       multiq_peek,
-       .requeue        =       multiq_requeue,
        .drop           =       multiq_drop,
        .init           =       multiq_init,
        .reset          =       multiq_reset,