From: Cong Wang <xiyou.wangcong@gmail.com>
To: Victor Nogueira <victor@mojatatu.com>
Cc: netdev@vger.kernel.org, jhs@mojatatu.com, jiri@resnulli.us,
alan@wylie.me.uk
Subject: Re: [Patch net 1/2] sch_htb: make htb_deactivate() idempotent
Date: Sun, 4 May 2025 13:18:04 -0700 [thread overview]
Message-ID: <aBfEk6QUI//BIyZC@pop-os.localdomain> (raw)
In-Reply-To: <eecd9a29-14f9-432d-a3cf-5215313df9f0@mojatatu.com>
On Wed, Apr 30, 2025 at 12:19:03PM -0300, Victor Nogueira wrote:
> On 4/28/25 20:29, Cong Wang wrote:
> > Alan reported a NULL pointer dereference in htb_next_rb_node()
> > after we made htb_qlen_notify() idempotent.
> >
> > It turns out in the following case it introduced some regression:
> >
> > htb_dequeue_tree():
> > |-> fq_codel_dequeue()
> > |-> qdisc_tree_reduce_backlog()
> > |-> htb_qlen_notify()
> > |-> htb_deactivate()
> > |-> htb_next_rb_node()
> > |-> htb_deactivate()
> >
> > For htb_next_rb_node(), after calling the 1st htb_deactivate(), the
> > clprio[prio]->ptr could be already set to NULL, which means
> > htb_next_rb_node() is vulnerable here.
>
> If I'm not missing something, the issue seems to be that
> fq_codel_dequeue or codel_qdisc_dequeue may call qdisc_tree_reduce_backlog
> with sch->q.qlen == 0 after commit 342debc12183. This will cause
> htb_qlen_notify to be called which will deactivate before we
> call htb_next_rb_node further down in htb_dequeue_tree (as you
> said above).
>
> If that's so, couldn't we instead of doing:
>
> > @@ -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);
> > }
>
> do something like:
>
> @@ -921,7 +921,9 @@ static struct sk_buff *htb_dequeue_tree(struct htb_sched
> *q, const int prio,
> cl->leaf.deficit[level] -= qdisc_pkt_len(skb);
> if (cl->leaf.deficit[level] < 0) {
> cl->leaf.deficit[level] += cl->quantum;
> - htb_next_rb_node(level ?
> &cl->parent->inner.clprio[prio].ptr :
> + /* Account for (fq_)codel child deactivating after
> dequeue */
> + if (likely(cl->prio_activity))
> + htb_next_rb_node(level ?
It reads odd to me to check cl->prio_activity before htb_next_rb_node(),
and I don't see any existing pattern of using this.
My patch pretty much follows all the existing patterns of checking
either cl->prio_activity or cl->leaf.q->q.qlen. So, although it looks
bigger from diffstat, it is safer from this point of view.
Thanks!
next prev parent reply other threads:[~2025-05-04 20:18 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-28 23:29 [Patch net 0/2] net_sched: fix a regression in sch_htb Cong Wang
2025-04-28 23:29 ` [Patch net 1/2] sch_htb: make htb_deactivate() idempotent Cong Wang
2025-04-30 15:19 ` Victor Nogueira
2025-05-02 9:59 ` Paolo Abeni
2025-05-02 22:13 ` Victor Nogueira
2025-05-04 20:18 ` Cong Wang [this message]
2025-04-28 23:29 ` [Patch net 2/2] selftests/tc-testing: Add a test case to cover basic HTB+FQ_CODEL case Cong Wang
2025-05-05 23:51 ` [Patch net 0/2] net_sched: fix a regression in sch_htb patchwork-bot+netdevbpf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=aBfEk6QUI//BIyZC@pop-os.localdomain \
--to=xiyou.wangcong@gmail.com \
--cc=alan@wylie.me.uk \
--cc=jhs@mojatatu.com \
--cc=jiri@resnulli.us \
--cc=netdev@vger.kernel.org \
--cc=victor@mojatatu.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox