From: gang.yan@linux.dev
To: "Paolo Abeni" <pabeni@redhat.com>, mptcp@lists.linux.dev
Subject: Re: [Patch mptcp-net 3/3] mptcp: fix stall because of data_ready
Date: Thu, 05 Feb 2026 13:27:48 +0000 [thread overview]
Message-ID: <ae1e6eed249537f658201bd6692845257a3126db@linux.dev> (raw)
In-Reply-To: <44a1f815-45bf-49b2-a772-6e0d53fdbbae@redhat.com>
[-- Attachment #1: Type: text/plain, Size: 4695 bytes --]
February 5, 2026 at 6:07 PM, "Paolo Abeni" <pabeni@redhat.com mailto:pabeni@redhat.com?to=%22Paolo%20Abeni%22%20%3Cpabeni%40redhat.com%3E > wrote:
Hi, Paolo:
>
> On 2/5/26 7:41 AM, Gang Yan wrote:
>
> >
> > From: Gang Yan <yangang@kylinos.cn>
> >
> > This patch fixes the second type of backlog_list stall issue that
> > occurs when the data_ready callback attempts to trigger data transfer.
> > The issue reproduces at approximately a 20% rate (once every five runs)
> > when running multi_chunk.sh tests.
> >
> > The stall occurs under the following conditions:
> > 1. A large amount of out-of-order (OFO) data causes sk_rmem_alloc to
> > exceed sk_rcvbuf
> >
> Thinking again about this scenario, the above condition is quite
> unexpected to me. Could you please share a pcap capture of this stall?
> In theory the sender should not fill the rcv window with OoO skb only.
The captured packets (ns1.pcap) are attached to this email.
>
> >
> > 2. The skb matching the current ack_seq is not present in backlog_list
> > 3. Data reception relies on data_ready callback notification
> >
> > In this scenario, the data_ready callback (via mptcp_data_ready() ->
> > sk->sk_data_ready()) attempts to trigger data movement, but
> > __mptcp_move_skbs_from_subflow() repeatedly moves the ack_seq skb into
> > backlog_list and returns false:
> >
> > '''
> > [ 144.961282][ C0] MPTCP: msk->ack_seq:3442119990924456661, map_seq:3442119990924456661, offset:0, fin:0
> > [ 144.961293][ C0] MPTCP: [MPTCP_BACKLOG] #0 map_seq=3442119990924655746 end_seq=3442119990924660542 len=4796
> > [ 144.962310][ C0] MPTCP: [MPTCP_BACKLOG] #1 map_seq=3442119990924491850 end_seq=3442119990924500364 len=8514
> > [ 144.962783][ C0] MPTCP: [MPTCP_BACKLOG] #2 map_seq=3442119990924660542 end_seq=3442119990924726001 len=65459
> > [ 144.963260][ C0] MPTCP: [MPTCP_BACKLOG] #3 map_seq=3442119990924508114 end_seq=3442119990924514971 len=6857
> > [ 144.963729][ C0] MPTCP: [MPTCP_BACKLOG] #4 map_seq=3442119990924726001 end_seq=3442119990924731093 len=5092
> > [ 144.964193][ C0] MPTCP: [MPTCP_BACKLOG] #5 map_seq=3442119990924456661 end_seq=3442119990924464310 len=7649
> > [ 144.964651][ C0] MPTCP: [MPTCP_BACKLOG] #6 map_seq=3442119990924456661 end_seq=3442119990924464310 len=7649
> > [ 144.965164][ C0] MPTCP: [MPTCP_BACKLOG] #7 map_seq=3442119990924456661 end_seq=3442119990924464310 len=7649
> > [ 144.965711][ C0] MPTCP: [MPTCP_BACKLOG] #8 map_seq=3442119990924456661 end_seq=3442119990924464310 len=7649
> > [ 144.966260][ C0] MPTCP: [MPTCP_BACKLOG] #9 map_seq=3442119990924456661 end_seq=3442119990924464310 len=7649
> > [ 144.966804][ C0] MPTCP: [MPTCP_BACKLOG] #10 map_seq=3442119990924456661 end_seq=3442119990924464310 len=7649
> > [ 144.967308][ C0] MPTCP: [MPTCP_BACKLOG] #11 map_seq=3442119990924456661 end_seq=3442119990924464310 len=7649
> > [ 144.967793][ C0] MPTCP: [MPTCP_BACKLOG] #12 map_seq=3442119990924456661 end_seq=3442119990924464310 len=7649
> > ...
> > '''
> >
> > The fix adds a check for an empty receive queue in addition to the
> > rcvbuf comparison. When the receive queue is empty, skbs should still
> > be moved to prevent the stall. With this patch, all mptcp_tls tests
> > pass successfully.
> >
> > Co-developed-by: Geliang Tang <tanggeliang@kylinos.cn>
> > Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
> > Signed-off-by: Gang Yan <yangang@kylinos.cn>
> > ---
> > net/mptcp/protocol.c | 3 ++-
> > 1 file changed, 2 insertions(+), 1 deletion(-)
> >
> > diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
> > index b6bafc37eea4..054aa72c9aa6 100644
> > --- a/net/mptcp/protocol.c
> > +++ b/net/mptcp/protocol.c
> > @@ -739,7 +739,8 @@ static bool __mptcp_move_skbs_from_subflow(struct mptcp_sock *msk,
> >
> > mptcp_init_skb(ssk, skb, offset, len);
> >
> > - if (own_msk && sk_rmem_alloc_get(sk) < sk->sk_rcvbuf) {
> > + if (own_msk && (sk_rmem_alloc_get(sk) < sk->sk_rcvbuf ||
> > + skb_queue_empty(&sk->sk_receive_queue))) {
> >
> Similar consideration WRT the previous patch, we need protect against
> possible attacks. I think checking and allowing in-sequence skbs should
> be enough:
>
> if (own_msk && (sk_rmem_alloc_get(sk) < sk->sk_rcvbuf ||
> MPTCP_SKB_CB(skb)->map_seq == msk->ack_seq)) {
>
This patch addresses the blocking issue that affects the NVMe-over-MPTCP testing.
Could this fix be considered for merging separately into the export branch as a
standalone fix? If that’s acceptable, I’ll prepare and send a v2 patch focused
only on this fix shortly.
Best regards,
Gang
> /P
>
[-- Attachment #2: ns1.pcap --]
[-- Type: application/vnd.tcpdump.pcap, Size: 672053 bytes --]
next prev parent reply other threads:[~2026-02-05 13:27 UTC|newest]
Thread overview: 13+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-02-05 6:41 [Patch mptcp-net 0/3] Fix the transmission stall due to backlog Gang Yan
2026-02-05 6:41 ` [Patch mptcp-net 1/3] mptcp: add backlog_list bug reproducer test Gang Yan
2026-02-05 9:20 ` Paolo Abeni
2026-02-05 13:05 ` gang.yan
2026-02-05 18:01 ` Matthieu Baerts
2026-02-05 6:41 ` [Patch mptcp-net 2/3] mptcp: fix receive stalls when 'ack_seq' in backlog_list Gang Yan
2026-02-05 9:36 ` Paolo Abeni
[not found] ` <f9a2229cd1d69731db91a003ac1018f446be9572@linux.dev>
2026-02-09 9:02 ` gang.yan
2026-02-05 6:41 ` [Patch mptcp-net 3/3] mptcp: fix stall because of data_ready Gang Yan
2026-02-05 10:07 ` Paolo Abeni
2026-02-05 13:27 ` gang.yan [this message]
2026-02-09 8:56 ` gang.yan
2026-02-05 7:58 ` [Patch mptcp-net 0/3] Fix the transmission stall due to backlog MPTCP CI
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=ae1e6eed249537f658201bd6692845257a3126db@linux.dev \
--to=gang.yan@linux.dev \
--cc=mptcp@lists.linux.dev \
--cc=pabeni@redhat.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