Commit 68c7af98 authored by Paolo Abeni's avatar Paolo Abeni Committed by Jakub Kicinski
Browse files

mptcp: factor out a basic skb coalesce helper



The upcoming patch will introduced backlog processing for MPTCP
socket, and we want to leverage coalescing in such data path.

Factor out the relevant bits not touching memory accounting to
deal with such use-case.

Co-developed-by: default avatarGeliang Tang <geliang@kernel.org>
Signed-off-by: default avatarGeliang Tang <geliang@kernel.org>
Reviewed-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
Signed-off-by: default avatarMatthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20250927-net-next-mptcp-rcv-path-imp-v1-6-5da266aa9c1a@kernel.org


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent c4ebc4ee
Loading
Loading
Loading
Loading
+17 −6
Original line number Diff line number Diff line
@@ -142,22 +142,33 @@ static void mptcp_drop(struct sock *sk, struct sk_buff *skb)
	__kfree_skb(skb);
}

static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
			       struct sk_buff *from)
static bool __mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
				 struct sk_buff *from, bool *fragstolen,
				 int *delta)
{
	bool fragstolen;
	int delta;
	int limit = READ_ONCE(sk->sk_rcvbuf);

	if (unlikely(MPTCP_SKB_CB(to)->cant_coalesce) ||
	    MPTCP_SKB_CB(from)->offset ||
	    ((to->len + from->len) > (sk->sk_rcvbuf >> 3)) ||
	    !skb_try_coalesce(to, from, &fragstolen, &delta))
	    ((to->len + from->len) > (limit >> 3)) ||
	    !skb_try_coalesce(to, from, fragstolen, delta))
		return false;

	pr_debug("colesced seq %llx into %llx new len %d new end seq %llx\n",
		 MPTCP_SKB_CB(from)->map_seq, MPTCP_SKB_CB(to)->map_seq,
		 to->len, MPTCP_SKB_CB(from)->end_seq);
	MPTCP_SKB_CB(to)->end_seq = MPTCP_SKB_CB(from)->end_seq;
	return true;
}

static bool mptcp_try_coalesce(struct sock *sk, struct sk_buff *to,
			       struct sk_buff *from)
{
	bool fragstolen;
	int delta;

	if (!__mptcp_try_coalesce(sk, to, from, &fragstolen, &delta))
		return false;

	/* note the fwd memory can reach a negative value after accounting
	 * for the delta, but the later skb free will restore a non