Commit a6efc273 authored by Eric Dumazet's avatar Eric Dumazet Committed by Paolo Abeni
Browse files

net_sched: use qdisc_dequeue_drop() in cake, codel, fq_codel



cake, codel and fq_codel can drop many packets from dequeue().

Use qdisc_dequeue_drop() so that the freeing can happen
outside of the qdisc spinlock scope.

Add TCQ_F_DEQUEUE_DROPS to sch->flags.

Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
Link: https://patch.msgid.link/20251121083256.674562-15-edumazet@google.com


Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
parent 191ff13e
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -2183,7 +2183,7 @@ static struct sk_buff *cake_dequeue(struct Qdisc *sch)
		b->tin_dropped++;
		qdisc_tree_reduce_backlog(sch, 1, qdisc_pkt_len(skb));
		qdisc_qstats_drop(sch);
		kfree_skb_reason(skb, reason);
		qdisc_dequeue_drop(sch, skb, reason);
		if (q->rate_flags & CAKE_FLAG_INGRESS)
			goto retry;
	}
@@ -2724,6 +2724,8 @@ static int cake_init(struct Qdisc *sch, struct nlattr *opt,
	int i, j, err;

	sch->limit = 10240;
	sch->flags |= TCQ_F_DEQUEUE_DROPS;

	q->tin_mode = CAKE_DIFFSERV_DIFFSERV3;
	q->flow_mode  = CAKE_FLOW_TRIPLE;

+3 −1
Original line number Diff line number Diff line
@@ -52,7 +52,7 @@ static void drop_func(struct sk_buff *skb, void *ctx)
{
	struct Qdisc *sch = ctx;

	kfree_skb_reason(skb, SKB_DROP_REASON_QDISC_CONGESTED);
	qdisc_dequeue_drop(sch, skb, SKB_DROP_REASON_QDISC_CONGESTED);
	qdisc_qstats_drop(sch);
}

@@ -182,6 +182,8 @@ static int codel_init(struct Qdisc *sch, struct nlattr *opt,
	else
		sch->flags &= ~TCQ_F_CAN_BYPASS;

	sch->flags |= TCQ_F_DEQUEUE_DROPS;

	return 0;
}

+4 −1
Original line number Diff line number Diff line
@@ -275,7 +275,7 @@ static void drop_func(struct sk_buff *skb, void *ctx)
{
	struct Qdisc *sch = ctx;

	kfree_skb_reason(skb, SKB_DROP_REASON_QDISC_CONGESTED);
	qdisc_dequeue_drop(sch, skb, SKB_DROP_REASON_QDISC_CONGESTED);
	qdisc_qstats_drop(sch);
}

@@ -519,6 +519,9 @@ static int fq_codel_init(struct Qdisc *sch, struct nlattr *opt,
		sch->flags |= TCQ_F_CAN_BYPASS;
	else
		sch->flags &= ~TCQ_F_CAN_BYPASS;

	sch->flags |= TCQ_F_DEQUEUE_DROPS;

	return 0;

alloc_failure: