All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next v4 0/5] net: sched: refactor qdisc drop reasons into dedicated tracepoint
@ 2026-02-16 15:30 Jesper Dangaard Brouer
  2026-02-16 15:30 ` [PATCH net-next v4 1/5] net: sched: introduce qdisc-specific drop reason tracing Jesper Dangaard Brouer
                   ` (4 more replies)
  0 siblings, 5 replies; 7+ messages in thread
From: Jesper Dangaard Brouer @ 2026-02-16 15:30 UTC (permalink / raw)
  To: netdev, Eric Dumazet, David S. Miller, Paolo Abeni,
	Toke Høiland-Jørgensen
  Cc: Jesper Dangaard Brouer, bpf, Jakub Kicinski, horms, jiri,
	edumazet, xiyou.wangcong, jhs, atenart, carges, kernel-team

(I know net-next is closed[0] until February 23rd, but I want to
 give bots a chance to pickup this patchset for testing/review, and
 I don't think they will do that if I post as RFC
 [0]: https://netdev.bots.linux.dev/net-next.html )

This series refactors qdisc drop reason handling by introducing a dedicated
enum qdisc_drop_reason and trace_qdisc_drop tracepoint, providing qdisc
layer drop diagnostics with direct qdisc context visibility.

Background:
-----------
Identifying which qdisc dropped a packet via skb_drop_reason is difficult.
Normally, the kfree_skb tracepoint caller "location" hints at the dropping
code, but qdisc drops happen at a central point (__dev_queue_xmit), making
this unusable. As a workaround, commits 5765c7f6e317 ("net_sched: sch_fq:
add three drop_reason") and a42d71e322a8 ("net_sched: sch_cake: Add drop
reasons") encoded qdisc names directly in the drop reason enums.

This series provides a cleaner solution by creating a dedicated qdisc
tracepoint that naturally includes qdisc context (handle, parent, kind).

Solution:
---------
Create a new tracepoint trace_qdisc_drop that builds on top of existing
trace_qdisc_enqueue infrastructure. It includes qdisc handle, parent,
qdisc kind (name), and device information directly.

The existing SKB_DROP_REASON_QDISC_DROP is retained for backwards
compatibility via kfree_skb_reason(). The qdisc-specific drop reasons
(QDISC_DROP_*) provide fine-grained detail via the new tracepoint.
The enum uses subsystem encoding (offset by SKB_DROP_REASON_SUBSYS_QDISC)
to catch type mismatches during debugging.

This implements the alternative approach described in:
https://lore.kernel.org/all/6be17a08-f8aa-4f91-9bd0-d9e1f0a92d90@kernel.org/

Changes since v3:
-----------------
v3: https://lore.kernel.org/all/177039500964.2258217.2989656069254156812.stgit@firesoul/
- Folded patch 3 (CAKE cobalt_should_drop) into patch 1 to avoid
  temporary enum type confusion between patches (Toke, Paolo)
- Split tcf_kfree_skb_list() into inline wrapper + __tcf_kfree_skb_list()
  for fastpath optimization when skb is NULL (Paolo)
- Series is now 5 patches instead of 6
- Added Reviewed-by from Toke Høiland-Jørgensen

Changes since v2:
-----------------
Link v2: https://lore.kernel.org/all/177032644012.1975497.16411100029657607833.stgit@firesoul/
- Patch 1: Fix tcf_kfree_skb_list() to handle TC classifier drop reasons
  - syzbot triggered WARN_ON_ONCE revealing TC classifier's SKB_DROP_REASON_TC_*
    reasons arrive via shared tc_skb_cb->drop_reason storage
  - Use SKB_DROP_REASON_SUBSYS_MASK to distinguish qdisc vs TC classifier reasons
  - Pass TC classifier reasons through to kfree_skb_reason() unchanged
  - Reported-by: syzbot+ci335f183b8446659a@syzkaller.appspotmail.com
- Patch 5 (was 6): Fix compile error - add missing QDISC_DROP_L4S_STEP_NON_ECN
  - Reported-by: kernel test robot <lkp@intel.com>
  - Closes: https://lore.kernel.org/oe-kbuild-all/202602061240.CRDtcOeX-lkp@intel.com/

Changes since RFC v1:
---------------------
Link RFC-v1: https://lore.kernel.org/all/177022452988.1827734.5121740962985640333.stgit@firesoul/
- Added SKB_DROP_REASON_SUBSYS_QDISC subsystem encoding for enum debugging
- Added WARN_ON_ONCE to catch wrong enum type (skb vs qdisc drop reason)
- Renamed QDISC_DROP_CAKE_FLOOD to QDISC_DROP_FLOOD_PROTECTION (Toke)
- Renamed QDISC_DROP_FQ_BAND_LIMIT to QDISC_DROP_BAND_LIMIT
- Renamed QDISC_DROP_FQ_HORIZON_LIMIT to QDISC_DROP_HORIZON_LIMIT
- Updated SKB_DROP_REASON_QDISC_DROP doc to reference qdisc:qdisc_drop
- Split rename changes into separate patches for clarity

Series overview:
----------------
Patch 1: Introduce the qdisc drop reason infrastructure
  - New enum qdisc_drop_reason with subsystem encoding
  - New trace_qdisc_drop tracepoint with qdisc context
  - tcf_kfree_skb_list() handles both qdisc and TC classifier drop reasons
  - Split into inline wrapper + __tcf_kfree_skb_list() for fastpath
  - Convert qdiscs with drop reasons to use the new infrastructure
  - Fix CAKE cobalt_should_drop() return type for type correctness

Patch 2: Convert SFQ as example for reviewers
  - Demonstrates how to convert a flow-based qdisc
  - Adds QDISC_DROP_MAXFLOWS for flow table exhaustion
  - Rename FQ_FLOW_LIMIT to generic FLOW_LIMIT, now shared by FQ and SFQ

Patch 3: Rename QDISC_DROP_FQ_* to generic names
  - QDISC_DROP_FQ_BAND_LIMIT -> QDISC_DROP_BAND_LIMIT
  - QDISC_DROP_FQ_HORIZON_LIMIT -> QDISC_DROP_HORIZON_LIMIT
  - Remove local FQDR() macro, use full QDISC_DROP_* names

Patch 4: Rename QDISC_DROP_CAKE_FLOOD to QDISC_DROP_FLOOD_PROTECTION
  - Generic name without embedding qdisc name

Patch 5: DualPI2 use qdisc_dequeue_drop() for dequeue drops
  - Demonstrates dequeue-time drop handling with trace_qdisc_drop
  - Adds QDISC_DROP_L4S_STEP_NON_ECN for L4S step AQM drops

Jesper Dangaard Brouer (5):
  net: sched: introduce qdisc-specific drop reason tracing
  net: sched: sfq: convert to qdisc drop reasons
  net: sched: rename QDISC_DROP_FQ_* to generic names
  net: sched: rename QDISC_DROP_CAKE_FLOOD to QDISC_DROP_FLOOD_PROTECTION
  net: sched: sch_dualpi2: use qdisc_dequeue_drop() for dequeue drops

---

Jesper Dangaard Brouer (5):
      net: sched: introduce qdisc-specific drop reason tracing
      net: sched: sfq: convert to qdisc drop reasons
      net: sched: rename QDISC_DROP_FQ_* to generic names
      net: sched: rename QDISC_DROP_CAKE_FLOOD to QDISC_DROP_FLOOD_PROTECTION
      net: sched: sch_dualpi2: use qdisc_dequeue_drop() for dequeue drops


 include/net/dropreason-core.h  |  48 ++------------
 include/net/dropreason-qdisc.h | 114 +++++++++++++++++++++++++++++++++
 include/net/dropreason.h       |   6 ++
 include/net/sch_generic.h      |  43 +++++++++----
 include/trace/events/qdisc.h   |  51 +++++++++++++++
 net/core/dev.c                 |   8 +--
 net/sched/sch_cake.c           |  26 ++++----
 net/sched/sch_codel.c          |   5 +-
 net/sched/sch_dualpi2.c        |  18 +++---
 net/sched/sch_fq.c             |  10 +--
 net/sched/sch_fq_codel.c       |   4 +-
 net/sched/sch_fq_pie.c         |   4 +-
 net/sched/sch_generic.c        |  29 ++++++++-
 net/sched/sch_gred.c           |   4 +-
 net/sched/sch_pie.c            |   4 +-
 net/sched/sch_red.c            |   4 +-
 net/sched/sch_sfb.c            |   4 +-
 net/sched/sch_sfq.c            |   8 +--
 18 files changed, 278 insertions(+), 112 deletions(-)
 create mode 100644 include/net/dropreason-qdisc.h

--


^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2026-02-18  0:34 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-02-16 15:30 [PATCH net-next v4 0/5] net: sched: refactor qdisc drop reasons into dedicated tracepoint Jesper Dangaard Brouer
2026-02-16 15:30 ` [PATCH net-next v4 1/5] net: sched: introduce qdisc-specific drop reason tracing Jesper Dangaard Brouer
2026-02-18  0:34   ` Jakub Kicinski
2026-02-16 15:30 ` [PATCH net-next v4 2/5] net: sched: sfq: convert to qdisc drop reasons Jesper Dangaard Brouer
2026-02-16 15:30 ` [PATCH net-next v4 3/5] net: sched: rename QDISC_DROP_FQ_* to generic names Jesper Dangaard Brouer
2026-02-16 15:30 ` [PATCH net-next v4 4/5] net: sched: rename QDISC_DROP_CAKE_FLOOD to QDISC_DROP_FLOOD_PROTECTION Jesper Dangaard Brouer
2026-02-16 15:30 ` [PATCH net-next v4 5/5] net: sched: sch_dualpi2: use qdisc_dequeue_drop() for dequeue drops Jesper Dangaard Brouer

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.