From: Cong Wang <xiyou.wangcong@gmail.com>
To: Paolo Abeni <pabeni@redhat.com>
Cc: Victor Nogueira <victor@mojatatu.com>,
netdev@vger.kernel.org, jhs@mojatatu.com, jiri@resnulli.us,
davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
toke@redhat.com, gerrard.tai@starlabs.sg, pctammela@mojatatu.com
Subject: Re: [PATCH net v2 0/5] net_sched: Adapt qdiscs for reentrant enqueue cases
Date: Wed, 23 Apr 2025 13:50:50 -0700 [thread overview]
Message-ID: <aAlSqk9UBMNu6JnJ@pop-os.localdomain> (raw)
In-Reply-To: <4295ec79-035c-4858-9ec4-eb639767d12b@redhat.com>
On Tue, Apr 22, 2025 at 01:21:22PM +0200, Paolo Abeni wrote:
> On 4/17/25 9:23 PM, Cong Wang wrote:
> > On Wed, Apr 16, 2025 at 07:24:22AM -0300, Victor Nogueira wrote:
> >> As described in Gerrard's report [1], there are cases where netem can
> >> make the qdisc enqueue callback reentrant. Some qdiscs (drr, hfsc, ets,
> >> qfq) break whenever the enqueue callback has reentrant behaviour.
> >> This series addresses these issues by adding extra checks that cater for
> >> these reentrant corner cases. This series has passed all relevant test
> >> cases in the TDC suite.
> >>
> >> [1] https://lore.kernel.org/netdev/CAHcdcOm+03OD2j6R0=YHKqmy=VgJ8xEOKuP6c7mSgnp-TEJJbw@mail.gmail.com/
> >>
> >
> > I am wondering why we need to enqueue the duplicate skb before enqueuing
> > the original skb in netem? IOW, why not just swap them?
>
> It's not clear to me what you are suggesting, could you please rephrase
> and/or expand the above?
Sure, below is the change on my mind:
diff --git a/net/sched/sch_netem.c b/net/sched/sch_netem.c
index fdd79d3ccd8c..000f8138f561 100644
--- a/net/sched/sch_netem.c
+++ b/net/sched/sch_netem.c
@@ -531,21 +531,6 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
return NET_XMIT_DROP;
}
- /*
- * If doing duplication then re-insert at top of the
- * qdisc tree, since parent queuer expects that only one
- * skb will be queued.
- */
- if (skb2) {
- struct Qdisc *rootq = qdisc_root_bh(sch);
- u32 dupsave = q->duplicate; /* prevent duplicating a dup... */
-
- q->duplicate = 0;
- rootq->enqueue(skb2, rootq, to_free);
- q->duplicate = dupsave;
- skb2 = NULL;
- }
-
qdisc_qstats_backlog_inc(sch, skb);
cb = netem_skb_cb(skb);
@@ -613,6 +598,21 @@ static int netem_enqueue(struct sk_buff *skb, struct Qdisc *sch,
sch->qstats.requeues++;
}
+ /*
+ * If doing duplication then re-insert at top of the
+ * qdisc tree, since parent queuer expects that only one
+ * skb will be queued.
+ */
+ if (skb2) {
+ struct Qdisc *rootq = qdisc_root_bh(sch);
+ u32 dupsave = q->duplicate; /* prevent duplicating a dup... */
+
+ q->duplicate = 0;
+ rootq->enqueue(skb2, rootq, to_free);
+ q->duplicate = dupsave;
+ skb2 = NULL;
+ }
+
finish_segs:
if (skb2)
__qdisc_drop(skb2, to_free);
>
> When duplication packets, I think we will need to call root->enqueue()
> no matter what, to ensure proper accounting, and that would cause the
> re-entrancy issue. What I'm missing?
The problem here is the ordering, if we enqueue the skb2 (aka the
duplication packet) first (as what it is), the qlen is not yet increased
at this point so the qdisc is technically still empty (as we test qlen).
If we reverse that order, that is, enqueuing skb2 _after_ the original
packet, qlen should be increased by tfifo_enqueue() _before_ skb2 is
enqueue, so the qdisc is not empty for skb2 any more.
This is why I think (meaning I never test it) it could solve the problem
here and is a much simpler fix (0 line of code in delta).
Thanks!
next prev parent reply other threads:[~2025-04-23 20:50 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-04-16 10:24 [PATCH net v2 0/5] net_sched: Adapt qdiscs for reentrant enqueue cases Victor Nogueira
2025-04-16 10:24 ` [PATCH net v2 1/5] net_sched: drr: Fix double list add in class with netem as child qdisc Victor Nogueira
2025-04-23 0:44 ` Jakub Kicinski
2025-04-23 14:41 ` Victor Nogueira
2025-04-16 10:24 ` [PATCH net v2 2/5] net_sched: hfsc: Fix a UAF vulnerability " Victor Nogueira
2025-04-16 10:24 ` [PATCH net v2 3/5] net_sched: ets: Fix double list add " Victor Nogueira
2025-04-16 10:24 ` [PATCH net v2 4/5] net_sched: qfq: " Victor Nogueira
2025-04-16 10:24 ` [PATCH net v2 5/5] selftests: tc-testing: Add TDC tests that exercise reentrant enqueue behaviour Victor Nogueira
2025-04-17 16:07 ` [PATCH net v2 0/5] net_sched: Adapt qdiscs for reentrant enqueue cases Jakub Kicinski
2025-04-17 21:49 ` Victor Nogueira
2025-04-22 11:34 ` Paolo Abeni
2025-04-17 19:23 ` Cong Wang
2025-04-17 22:13 ` Victor Nogueira
2025-04-22 11:21 ` Paolo Abeni
2025-04-23 20:50 ` Cong Wang [this message]
2025-04-23 23:29 ` Cong Wang
2025-04-24 0:24 ` Jakub Kicinski
2025-04-24 15:22 ` Jamal Hadi Salim
2025-04-24 15:40 ` Jamal Hadi Salim
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=aAlSqk9UBMNu6JnJ@pop-os.localdomain \
--to=xiyou.wangcong@gmail.com \
--cc=davem@davemloft.net \
--cc=edumazet@google.com \
--cc=gerrard.tai@starlabs.sg \
--cc=jhs@mojatatu.com \
--cc=jiri@resnulli.us \
--cc=kuba@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=pctammela@mojatatu.com \
--cc=toke@redhat.com \
--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