net_sched: sch_choke: defer skb freeing
[cascardo/linux.git] / net / sched / sch_choke.c
index 0a08c86..789b69e 100644 (file)
@@ -365,22 +365,6 @@ static struct sk_buff *choke_dequeue(struct Qdisc *sch)
        return skb;
 }
 
-static unsigned int choke_drop(struct Qdisc *sch)
-{
-       struct choke_sched_data *q = qdisc_priv(sch);
-       unsigned int len;
-
-       len = qdisc_queue_drop(sch);
-       if (len > 0)
-               q->stats.other++;
-       else {
-               if (!red_is_idling(&q->vars))
-                       red_start_of_idle_period(&q->vars);
-       }
-
-       return len;
-}
-
 static void choke_reset(struct Qdisc *sch)
 {
        struct choke_sched_data *q = qdisc_priv(sch);
@@ -391,11 +375,11 @@ static void choke_reset(struct Qdisc *sch)
                q->head = (q->head + 1) & q->tab_mask;
                if (!skb)
                        continue;
-               qdisc_qstats_backlog_dec(sch, skb);
-               --sch->q.qlen;
-               qdisc_drop(skb, sch);
+               rtnl_qdisc_drop(skb, sch);
        }
 
+       sch->q.qlen = 0;
+       sch->qstats.backlog = 0;
        memset(q->tab, 0, (q->tab_mask + 1) * sizeof(struct sk_buff *));
        q->head = q->tail = 0;
        red_restart(&q->vars);
@@ -471,7 +455,7 @@ static int choke_change(struct Qdisc *sch, struct nlattr *opt)
                                dropped += qdisc_pkt_len(skb);
                                qdisc_qstats_backlog_dec(sch, skb);
                                --sch->q.qlen;
-                               qdisc_drop(skb, sch);
+                               rtnl_qdisc_drop(skb, sch);
                        }
                        qdisc_tree_reduce_backlog(sch, oqlen - sch->q.qlen, dropped);
                        q->head = 0;
@@ -569,7 +553,6 @@ static struct Qdisc_ops choke_qdisc_ops __read_mostly = {
        .enqueue        =       choke_enqueue,
        .dequeue        =       choke_dequeue,
        .peek           =       choke_peek_head,
-       .drop           =       choke_drop,
        .init           =       choke_init,
        .destroy        =       choke_destroy,
        .reset          =       choke_reset,