diff options
| author | Jakub Kicinski <kuba@kernel.org> | 2025-05-05 13:51:36 -0700 | 
|---|---|---|
| committer | Jakub Kicinski <kuba@kernel.org> | 2025-05-05 13:51:38 -0700 | 
| commit | 75dbdaad327da09435ce5557ca0c2f89e10702fb (patch) | |
| tree | fcfa787f9a15b435bad32c2cb910e2d3caee34de | |
| parent | ebd297a2affadb6f6f4d2e5d975c1eda18ac762d (diff) | |
| parent | 63890286f557aa5c4eed7e90a5a31658de8fdb4d (diff) | |
Merge branch 'net_sched-fix-a-regression-in-sch_htb'
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>
| -rw-r--r-- | net/sched/sch_htb.c | 15 | ||||
| -rw-r--r-- | tools/testing/selftests/tc-testing/tc-tests/infra/qdiscs.json | 35 | 
2 files changed, 41 insertions, 9 deletions
| diff --git a/net/sched/sch_htb.c b/net/sched/sch_htb.c index 4b9a639b642e..14bf71f57057 100644 --- a/net/sched/sch_htb.c +++ b/net/sched/sch_htb.c @@ -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);  }  /** @@ -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;  } @@ -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);  } @@ -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, @@ -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) { diff --git a/tools/testing/selftests/tc-testing/tc-tests/infra/qdiscs.json b/tools/testing/selftests/tc-testing/tc-tests/infra/qdiscs.json index 0843f6d37e9c..a951c0d33cd2 100644 --- a/tools/testing/selftests/tc-testing/tc-tests/infra/qdiscs.json +++ b/tools/testing/selftests/tc-testing/tc-tests/infra/qdiscs.json @@ -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" +        ]      }  ] | 
