mirror of
https://github.com/torvalds/linux.git
synced 2026-05-12 16:18:45 +02:00
net: sched: sch_dualpi2: use qdisc_dequeue_drop() for dequeue drops
DualPI2 drops packets during dequeue but was using kfree_skb_reason() directly, bypassing trace_qdisc_drop. Convert to qdisc_dequeue_drop() and add QDISC_DROP_L4S_STEP_NON_ECN to the qdisc drop reason enum. - Set TCQ_F_DEQUEUE_DROPS flag in dualpi2_init() - Use enum qdisc_drop_reason in drop_and_retry() - Replace kfree_skb_reason() with qdisc_dequeue_drop() Signed-off-by: Jesper Dangaard Brouer <hawk@kernel.org> Reviewed-by: Toke Høiland-Jørgensen <toke@redhat.com> Link: https://patch.msgid.link/177211351978.3011628.11267023360997620069.stgit@firesoul Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
9d3e7f9718
commit
67713dff63
|
|
@ -121,7 +121,6 @@
|
|||
FN(CANFD_RX_INVALID_FRAME) \
|
||||
FN(CANXL_RX_INVALID_FRAME) \
|
||||
FN(PFMEMALLOC) \
|
||||
FN(DUALPI2_STEP_DROP) \
|
||||
FN(PSP_INPUT) \
|
||||
FN(PSP_OUTPUT) \
|
||||
FNe(MAX)
|
||||
|
|
@ -579,11 +578,6 @@ enum skb_drop_reason {
|
|||
* reached a path or socket not eligible for use of memory reserves
|
||||
*/
|
||||
SKB_DROP_REASON_PFMEMALLOC,
|
||||
/**
|
||||
* @SKB_DROP_REASON_DUALPI2_STEP_DROP: dropped by the step drop
|
||||
* threshold of DualPI2 qdisc.
|
||||
*/
|
||||
SKB_DROP_REASON_DUALPI2_STEP_DROP,
|
||||
/** @SKB_DROP_REASON_PSP_INPUT: PSP input checks failed */
|
||||
SKB_DROP_REASON_PSP_INPUT,
|
||||
/** @SKB_DROP_REASON_PSP_OUTPUT: PSP output checks failed */
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@
|
|||
FN(BAND_LIMIT) \
|
||||
FN(HORIZON_LIMIT) \
|
||||
FN(FLOW_LIMIT) \
|
||||
FN(L4S_STEP_NON_ECN) \
|
||||
FNe(MAX)
|
||||
|
||||
#undef FN
|
||||
|
|
@ -93,6 +94,13 @@ enum qdisc_drop_reason {
|
|||
* monopolizing queue resources.
|
||||
*/
|
||||
QDISC_DROP_FLOW_LIMIT,
|
||||
/**
|
||||
* @QDISC_DROP_L4S_STEP_NON_ECN: DualPI2 qdisc dropped a non-ECN-capable
|
||||
* packet because the L4S queue delay exceeded the step threshold.
|
||||
* Since the packet cannot be ECN-marked, it must be dropped to signal
|
||||
* congestion. See RFC 9332 for the DualQ Coupled AQM step mechanism.
|
||||
*/
|
||||
QDISC_DROP_L4S_STEP_NON_ECN,
|
||||
/**
|
||||
* @QDISC_DROP_MAX: the maximum of qdisc drop reasons, which
|
||||
* shouldn't be used as a real 'reason' - only for tracing code gen
|
||||
|
|
|
|||
|
|
@ -571,11 +571,11 @@ static int do_step_aqm(struct dualpi2_sched_data *q, struct sk_buff *skb,
|
|||
}
|
||||
|
||||
static void drop_and_retry(struct dualpi2_sched_data *q, struct sk_buff *skb,
|
||||
struct Qdisc *sch, enum skb_drop_reason reason)
|
||||
struct Qdisc *sch, enum qdisc_drop_reason reason)
|
||||
{
|
||||
++q->deferred_drops_cnt;
|
||||
q->deferred_drops_len += qdisc_pkt_len(skb);
|
||||
kfree_skb_reason(skb, reason);
|
||||
qdisc_dequeue_drop(sch, skb, reason);
|
||||
qdisc_qstats_drop(sch);
|
||||
}
|
||||
|
||||
|
|
@ -590,15 +590,13 @@ static struct sk_buff *dualpi2_qdisc_dequeue(struct Qdisc *sch)
|
|||
|
||||
while ((skb = dequeue_packet(sch, q, &credit_change, now))) {
|
||||
if (!q->drop_early && must_drop(sch, q, skb)) {
|
||||
drop_and_retry(q, skb, sch,
|
||||
SKB_DROP_REASON_QDISC_DROP);
|
||||
drop_and_retry(q, skb, sch, QDISC_DROP_CONGESTED);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (skb_in_l_queue(skb) && do_step_aqm(q, skb, now)) {
|
||||
qdisc_qstats_drop(q->l_queue);
|
||||
drop_and_retry(q, skb, sch,
|
||||
SKB_DROP_REASON_DUALPI2_STEP_DROP);
|
||||
drop_and_retry(q, skb, sch, QDISC_DROP_L4S_STEP_NON_ECN);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -915,6 +913,8 @@ static int dualpi2_init(struct Qdisc *sch, struct nlattr *opt,
|
|||
struct dualpi2_sched_data *q = qdisc_priv(sch);
|
||||
int err;
|
||||
|
||||
sch->flags |= TCQ_F_DEQUEUE_DROPS;
|
||||
|
||||
q->l_queue = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
|
||||
TC_H_MAKE(sch->handle, 1), extack);
|
||||
if (!q->l_queue)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user