etf: Split timersortedlist_erase()
authorJesus Sanchez-Palencia <jesus.sanchez-palencia@intel.com>
Thu, 15 Nov 2018 01:26:34 +0000 (17:26 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 17 Nov 2018 04:39:34 +0000 (20:39 -0800)
This is just a refactor that will simplify the implementation of the
next patch in this series which will drop all expired packets on the
dequeue flow.

Signed-off-by: Jesus Sanchez-Palencia <jesus.s.palencia@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sched/sch_etf.c

index 52452b546564c971ffbf4b63078063af809a8cd6..bfe04748d5f04112db016a22258b8af02863f439 100644 (file)
@@ -190,10 +190,10 @@ static int etf_enqueue_timesortedlist(struct sk_buff *nskb, struct Qdisc *sch,
        return NET_XMIT_SUCCESS;
 }
 
-static void timesortedlist_erase(struct Qdisc *sch, struct sk_buff *skb,
-                                bool drop)
+static void timesortedlist_drop(struct Qdisc *sch, struct sk_buff *skb)
 {
        struct etf_sched_data *q = qdisc_priv(sch);
+       struct sk_buff *to_free = NULL;
 
        rb_erase_cached(&skb->rbnode, &q->head);
 
@@ -206,19 +206,33 @@ static void timesortedlist_erase(struct Qdisc *sch, struct sk_buff *skb,
 
        qdisc_qstats_backlog_dec(sch, skb);
 
-       if (drop) {
-               struct sk_buff *to_free = NULL;
+       report_sock_error(skb, ECANCELED, SO_EE_CODE_TXTIME_MISSED);
 
-               report_sock_error(skb, ECANCELED, SO_EE_CODE_TXTIME_MISSED);
+       qdisc_drop(skb, sch, &to_free);
+       kfree_skb_list(to_free);
+       qdisc_qstats_overlimit(sch);
 
-               qdisc_drop(skb, sch, &to_free);
-               kfree_skb_list(to_free);
-               qdisc_qstats_overlimit(sch);
-       } else {
-               qdisc_bstats_update(sch, skb);
+       sch->q.qlen--;
+}
 
-               q->last = skb->tstamp;
-       }
+static void timesortedlist_remove(struct Qdisc *sch, struct sk_buff *skb)
+{
+       struct etf_sched_data *q = qdisc_priv(sch);
+
+       rb_erase_cached(&skb->rbnode, &q->head);
+
+       /* The rbnode field in the skb re-uses these fields, now that
+        * we are done with the rbnode, reset them.
+        */
+       skb->next = NULL;
+       skb->prev = NULL;
+       skb->dev = qdisc_dev(sch);
+
+       qdisc_qstats_backlog_dec(sch, skb);
+
+       qdisc_bstats_update(sch, skb);
+
+       q->last = skb->tstamp;
 
        sch->q.qlen--;
 }
@@ -237,7 +251,7 @@ static struct sk_buff *etf_dequeue_timesortedlist(struct Qdisc *sch)
 
        /* Drop if packet has expired while in queue. */
        if (ktime_before(skb->tstamp, now)) {
-               timesortedlist_erase(sch, skb, true);
+               timesortedlist_drop(sch, skb);
                skb = NULL;
                goto out;
        }
@@ -246,7 +260,7 @@ static struct sk_buff *etf_dequeue_timesortedlist(struct Qdisc *sch)
         * txtime from deadline to (now + delta).
         */
        if (q->deadline_mode) {
-               timesortedlist_erase(sch, skb, false);
+               timesortedlist_remove(sch, skb);
                skb->tstamp = now;
                goto out;
        }
@@ -255,7 +269,7 @@ static struct sk_buff *etf_dequeue_timesortedlist(struct Qdisc *sch)
 
        /* Dequeue only if now is within the [txtime - delta, txtime] range. */
        if (ktime_after(now, next))
-               timesortedlist_erase(sch, skb, false);
+               timesortedlist_remove(sch, skb);
        else
                skb = NULL;