Commit cbeeb8ef authored by Jesus Sanchez-Palencia's avatar Jesus Sanchez-Palencia Committed by David S. Miller

etf: Split timersortedlist_erase()

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: default avatarJesus Sanchez-Palencia <jesus.s.palencia@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 09fd4860
...@@ -190,10 +190,10 @@ static int etf_enqueue_timesortedlist(struct sk_buff *nskb, struct Qdisc *sch, ...@@ -190,10 +190,10 @@ static int etf_enqueue_timesortedlist(struct sk_buff *nskb, struct Qdisc *sch,
return NET_XMIT_SUCCESS; return NET_XMIT_SUCCESS;
} }
static void timesortedlist_erase(struct Qdisc *sch, struct sk_buff *skb, static void timesortedlist_drop(struct Qdisc *sch, struct sk_buff *skb)
bool drop)
{ {
struct etf_sched_data *q = qdisc_priv(sch); struct etf_sched_data *q = qdisc_priv(sch);
struct sk_buff *to_free = NULL;
rb_erase_cached(&skb->rbnode, &q->head); rb_erase_cached(&skb->rbnode, &q->head);
...@@ -206,19 +206,33 @@ static void timesortedlist_erase(struct Qdisc *sch, struct sk_buff *skb, ...@@ -206,19 +206,33 @@ static void timesortedlist_erase(struct Qdisc *sch, struct sk_buff *skb,
qdisc_qstats_backlog_dec(sch, 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); qdisc_drop(skb, sch, &to_free);
kfree_skb_list(to_free); kfree_skb_list(to_free);
qdisc_qstats_overlimit(sch); qdisc_qstats_overlimit(sch);
} else {
sch->q.qlen--;
}
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); qdisc_bstats_update(sch, skb);
q->last = skb->tstamp; q->last = skb->tstamp;
}
sch->q.qlen--; sch->q.qlen--;
} }
...@@ -237,7 +251,7 @@ static struct sk_buff *etf_dequeue_timesortedlist(struct Qdisc *sch) ...@@ -237,7 +251,7 @@ static struct sk_buff *etf_dequeue_timesortedlist(struct Qdisc *sch)
/* Drop if packet has expired while in queue. */ /* Drop if packet has expired while in queue. */
if (ktime_before(skb->tstamp, now)) { if (ktime_before(skb->tstamp, now)) {
timesortedlist_erase(sch, skb, true); timesortedlist_drop(sch, skb);
skb = NULL; skb = NULL;
goto out; goto out;
} }
...@@ -246,7 +260,7 @@ static struct sk_buff *etf_dequeue_timesortedlist(struct Qdisc *sch) ...@@ -246,7 +260,7 @@ static struct sk_buff *etf_dequeue_timesortedlist(struct Qdisc *sch)
* txtime from deadline to (now + delta). * txtime from deadline to (now + delta).
*/ */
if (q->deadline_mode) { if (q->deadline_mode) {
timesortedlist_erase(sch, skb, false); timesortedlist_remove(sch, skb);
skb->tstamp = now; skb->tstamp = now;
goto out; goto out;
} }
...@@ -255,7 +269,7 @@ static struct sk_buff *etf_dequeue_timesortedlist(struct Qdisc *sch) ...@@ -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. */ /* Dequeue only if now is within the [txtime - delta, txtime] range. */
if (ktime_after(now, next)) if (ktime_after(now, next))
timesortedlist_erase(sch, skb, false); timesortedlist_remove(sch, skb);
else else
skb = NULL; skb = NULL;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment