Re: [PATCH v2 mptcp-next 7/7] mptcp: implemented OoO queue pruning

Matthieu Baerts <[email protected]>
Newsgroups dev.linux.lists.mptcp
Organization NGI0 Core
Message-ID <[email protected]>
On 06/08/2026 18:42, Paolo Abeni wrote:
> On 8/6/26 4:45 PM, Paolo Abeni wrote:
>> When moving incoming skbs in the msk receive queue and the latter
>> is above limits, prune it as needed quite alike what TCP is doing
>> at the subflow level. The main difference relies in the stop condition:
>> since MPTCP does not perform collapsing, it's better off dropping the
>> bare minimum to fit the (newer) incoming packet.
>>
>> Signed-off-by: Paolo Abeni <[email protected]>
>> Tested-by: Gang Yan <[email protected]>
>> Reviewed-by: Matthieu Baerts (NGI0) <[email protected]>
>> ---
>> v<n> -> v<n+1>:
>>   - prune only for new data
>>   - reorganize the code to follow more closely TCP
>> ---
>>  net/mptcp/mib.c      |  1 +
>>  net/mptcp/mib.h      |  1 +
>>  net/mptcp/protocol.c | 81 ++++++++++++++++++++++++++++++++++++++------
>>  3 files changed, 73 insertions(+), 10 deletions(-)
>>
>> diff --git a/net/mptcp/mib.c b/net/mptcp/mib.c
>> index ef65e2df709f..2569385bab7c 100644
>> --- a/net/mptcp/mib.c
>> +++ b/net/mptcp/mib.c
>> @@ -87,6 +87,7 @@ static const struct snmp_mib mptcp_snmp_list[] = {
>>  	SNMP_MIB_ITEM("WinProbe", MPTCP_MIB_WINPROBE),
>>  	SNMP_MIB_ITEM("BacklogDrop", MPTCP_MIB_BACKLOGDROP),
>>  	SNMP_MIB_ITEM("RcvPruned", MPTCP_MIB_RCVPRUNED),
>> +	SNMP_MIB_ITEM("OFOPruned", MPTCP_MIB_OFOPRUNED),
>>  };
>>  
>>  /* mptcp_mib_alloc - allocate percpu mib counters
>> diff --git a/net/mptcp/mib.h b/net/mptcp/mib.h
>> index 9271205f682e..3a3425e258a7 100644
>> --- a/net/mptcp/mib.h
>> +++ b/net/mptcp/mib.h
>> @@ -90,6 +90,7 @@ enum linux_mptcp_mib_field {
>>  	MPTCP_MIB_WINPROBE,		/* MPTCP-level zero window probe */
>>  	MPTCP_MIB_BACKLOGDROP,		/* Backlog over memory limit */
>>  	MPTCP_MIB_RCVPRUNED,		/* Dropped due to memory constraints */
>> +	MPTCP_MIB_OFOPRUNED,		/* MPTCP-level OoO queue pruned */
>>  	__MPTCP_MIB_MAX
>>  };
>>  
>> diff --git a/net/mptcp/protocol.c b/net/mptcp/protocol.c
>> index 63f2c18bc01f..ec874d2ead6a 100644
>> --- a/net/mptcp/protocol.c
>> +++ b/net/mptcp/protocol.c
>> @@ -242,6 +242,65 @@ static bool mptcp_rcvbuf_grow(struct sock *sk, u32 newval)
>>  	return false;
>>  }
>>  
>> +/* "Inspired" from the TCP version; main difference: stop as soon as the MPTCP
>> + * socket is under memory limit.
>> + */
>> +static void mptcp_prune_ofo_queue(struct sock *sk,
>> +				  const struct sk_buff *in_skb)
>> +{
>> +	struct mptcp_sock *msk = mptcp_sk(sk);
>> +	struct rb_node *node, *prev;
>> +	bool pruned = false;
>> +	u64 mem;
>> +
>> +	if (RB_EMPTY_ROOT(&msk->out_of_order_queue))
>> +		return;
>> +
>> +	node = &msk->ooo_last_skb->rbnode;
>> +
>> +	do {
>> +		struct sk_buff *skb = rb_to_skb(node);
>> +
>> +		/* Stop pruning if the incoming skb would land in OoO tail. */
>> +		if (after64(MPTCP_SKB_CB(in_skb)->map_seq,
>> +			    MPTCP_SKB_CB(skb)->map_seq))
>> +			break;
>> +
>> +		pruned = true;
>> +		prev = rb_prev(node);
>> +		rb_erase(node, &msk->out_of_order_queue);
>> +		mptcp_drop(sk, skb);
>> +		msk->ooo_last_skb = rb_to_skb(prev);
>> +
>> +		mem = (unsigned int)sk_rmem_alloc_get(sk);
>> +		if (mem <= sk->sk_rcvbuf)
>> +			break;
>> +
>> +		node = prev;
>> +	} while (node);
>> +
>> +	if (pruned)
>> +		MPTCP_INC_STATS(sock_net(sk), MPTCP_MIB_OFOPRUNED);
>> +}
>> +
>> +/* The stack can't drop packets for fallback socket at the msk level, or the
>> + * stream will break.
>> + */
>> +static bool mptcp_can_ingest(const struct sock *sk)
>> +{
>> +	return unlikely(sk_rmem_alloc_get(sk) <= READ_ONCE(sk->sk_rcvbuf)) ||
>> +			__mptcp_check_fallback(mptcp_sk(sk));
> The above should obviously be: 'likely(...)'
> 
> @Matttbe: please LMK if you prefer a repost or you could adjust that
> while applying to the export branch.
No problem, I can adjust them when applying them (if there are no other
big modifications required, but I guess no).

Cheers,
Matt
-- 
Sponsored by the NGI0 Core fund.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.