Skip to content

Commit

Permalink
Merge branch 'net_sched-fix-a-regression-in-sch_htb'
Browse files Browse the repository at this point in the history
Cong Wang says:

====================
net_sched: fix a regression in sch_htb

This patchset contains a fix for the regression reported by Alan and a
selftest to cover that case. Please see each patch description for more
details.
====================

Link: https://patch.msgid.link/20250428232955.1740419-1-xiyou.wangcong@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
  • Loading branch information
Jakub Kicinski committed May 5, 2025
2 parents ebd297a + 6389028 commit 75dbdaa
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 9 deletions.
15 changes: 6 additions & 9 deletions net/sched/sch_htb.c
Original file line number Diff line number Diff line change
Expand Up @@ -348,7 +348,8 @@ static void htb_add_to_wait_tree(struct htb_sched *q,
*/
static inline void htb_next_rb_node(struct rb_node **n)
{
*n = rb_next(*n);
if (*n)
*n = rb_next(*n);
}

/**
Expand Down Expand Up @@ -609,8 +610,8 @@ static inline void htb_activate(struct htb_sched *q, struct htb_class *cl)
*/
static inline void htb_deactivate(struct htb_sched *q, struct htb_class *cl)
{
WARN_ON(!cl->prio_activity);

if (!cl->prio_activity)
return;
htb_deactivate_prios(q, cl);
cl->prio_activity = 0;
}
Expand Down Expand Up @@ -1485,8 +1486,6 @@ static void htb_qlen_notify(struct Qdisc *sch, unsigned long arg)
{
struct htb_class *cl = (struct htb_class *)arg;

if (!cl->prio_activity)
return;
htb_deactivate(qdisc_priv(sch), cl);
}

Expand Down Expand Up @@ -1740,8 +1739,7 @@ static int htb_delete(struct Qdisc *sch, unsigned long arg,
if (cl->parent)
cl->parent->children--;

if (cl->prio_activity)
htb_deactivate(q, cl);
htb_deactivate(q, cl);

if (cl->cmode != HTB_CAN_SEND)
htb_safe_rb_erase(&cl->pq_node,
Expand Down Expand Up @@ -1949,8 +1947,7 @@ static int htb_change_class(struct Qdisc *sch, u32 classid,
/* turn parent into inner node */
qdisc_purge_queue(parent->leaf.q);
parent_qdisc = parent->leaf.q;
if (parent->prio_activity)
htb_deactivate(q, parent);
htb_deactivate(q, parent);

/* remove from evt list because of level change */
if (parent->cmode != HTB_CAN_SEND) {
Expand Down
35 changes: 35 additions & 0 deletions tools/testing/selftests/tc-testing/tc-tests/infra/qdiscs.json
Original file line number Diff line number Diff line change
Expand Up @@ -538,5 +538,40 @@
"$TC qdisc del dev $DUMMY handle 1:0 root",
"$IP addr del 10.10.10.10/24 dev $DUMMY || true"
]
},
{
"id": "62c4",
"name": "Test HTB with FQ_CODEL - basic functionality",
"category": [
"qdisc",
"htb",
"fq_codel"
],
"plugins": {
"requires": [
"nsPlugin",
"scapyPlugin"
]
},
"setup": [
"$TC qdisc add dev $DEV1 root handle 1: htb default 11",
"$TC class add dev $DEV1 parent 1: classid 1:1 htb rate 10kbit",
"$TC class add dev $DEV1 parent 1:1 classid 1:11 htb rate 10kbit prio 0 quantum 1486",
"$TC qdisc add dev $DEV1 parent 1:11 fq_codel quantum 300 noecn",
"sleep 0.5"
],
"scapy": {
"iface": "$DEV0",
"count": 5,
"packet": "Ether()/IP(dst='10.10.10.1', src='10.10.10.10')/TCP(sport=12345, dport=80)"
},
"cmdUnderTest": "$TC -s qdisc show dev $DEV1",
"expExitCode": "0",
"verifyCmd": "$TC -s qdisc show dev $DEV1 | grep -A 5 'qdisc fq_codel'",
"matchPattern": "Sent [0-9]+ bytes [0-9]+ pkt",
"matchCount": "1",
"teardown": [
"$TC qdisc del dev $DEV1 handle 1: root"
]
}
]

0 comments on commit 75dbdaa

Please sign in to comment.