From nobody Thu Apr 17 08:17:02 2025
Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org
 [10.30.226.201])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id F0E3625C71B
	for <mptcp@lists.linux.dev>; Mon, 24 Mar 2025 08:19:53 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=10.30.226.201
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1742804394; cv=none;
 b=tc6AQckoDo/koByxHY0Y3E2U71K+470urBwvwg4LcGSK6HZcpt+BW7Vp05kbWtHOH9IX2XDSTS4F719Mcu3adqFGvhAysNxCRC8gqbouvvOd3vPtz/VtmEsC22rfrwQUx6zv/rU9IdBoMDdc1k/XbvTFeWEYD+3z3wlESEoUdFE=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1742804394; c=relaxed/simple;
	bh=BXGTvkft48Pz1dNbiMCp+7S4/NhhiPI1UvstLtFjoHA=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=sa1FNihrjJFUaNLeYUwC0OyLDLuxb2FCLRAbEIxQByUIVGj9S6DydbS4dlxNKR/oNWRS/ax159Kar4SLvsVbALmFV7GYwEHqirQ2/eABBMNFQs1l58Z9JI4Hbdh4WCYiq34Fd7YRvGZSwuALxrvktAc3Po82c2IUSneyCQ5yeAc=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b=sJmy+OHb; arc=none smtp.client-ip=10.30.226.201
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b="sJmy+OHb"
Received: by smtp.kernel.org (Postfix) with ESMTPSA id 47721C4CEED;
	Mon, 24 Mar 2025 08:19:51 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;
	s=k20201202; t=1742804393;
	bh=BXGTvkft48Pz1dNbiMCp+7S4/NhhiPI1UvstLtFjoHA=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
	b=sJmy+OHba0s5dStJZn0LYtMlLhplXWeDelIRZ+P2vKCGbHUhQTX3NgZVDK1foMZfv
	 6MjdAmG6hgm5LKt2HPNvuwJj4mmey3J0pI99Y+KjSjrbTOkpW1tN/GS4hdxbDXnXWt
	 zzoD2ArLpjTuP4Yozb3ZLwOiwVrMgtVVmJ9CJgfPV1AfYXepZBsyncn0RMSZ+4I0eK
	 LvvmFmEQHKko7avAL3d2lOiX4jGTZSHVt7Tm2yZEd0Y9pPdY7gdLkIlsDlZ5dW4fsd
	 HEMh5ZtR6nWEVK5brr6C4wtX7mho8dnZPoBZJN6GjKbegBXLcT5gYatyM2Jf22POMY
	 JgS191gDOARdQ==
From: Geliang Tang <geliang@kernel.org>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: [PATCH mptcp-next v4 1/9] Squash to "mptcp: pm: add get_local_id()
 interface"
Date: Mon, 24 Mar 2025 16:19:35 +0800
Message-ID: 
 <7fe68131f39121b2265856a91429f072332eb642.1742804266.git.tanggeliang@kylinos.cn>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <cover.1742804266.git.tanggeliang@kylinos.cn>
References: <cover.1742804266.git.tanggeliang@kylinos.cn>
Precedence: bulk
X-Mailing-List: mptcp@lists.linux.dev
List-Id: <mptcp.lists.linux.dev>
List-Subscribe: <mailto:mptcp+subscribe@lists.linux.dev>
List-Unsubscribe: <mailto:mptcp+unsubscribe@lists.linux.dev>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Geliang Tang <tanggeliang@kylinos.cn>

Add /* required */ comment for get_local_id and get_priority.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h | 1 +
 1 file changed, 1 insertion(+)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 6a08ac862bbe..9f28ef550e10 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -118,6 +118,7 @@ struct mptcp_sched_ops {
 #define MPTCP_PM_BUF_MAX	(MPTCP_PM_NAME_MAX * MPTCP_PM_MAX)
=20
 struct mptcp_pm_ops {
+	/* required */
 	int (*get_local_id)(struct mptcp_sock *msk,
 			    struct mptcp_pm_addr_entry *skc);
 	bool (*get_priority)(struct mptcp_sock *msk,
--=20
2.43.0
From nobody Thu Apr 17 08:17:02 2025
Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org
 [10.30.226.201])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id 3C47525D204
	for <mptcp@lists.linux.dev>; Mon, 24 Mar 2025 08:19:55 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=10.30.226.201
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1742804395; cv=none;
 b=bdAZ8tYHuZEvvSfSuQfQuxZ8l0PIXvWQ49ZUOR7hX106M7ESX29H1YEQr79zJGI3DP9IJmeTW+jmtK1c4duikioWed9Eei4O5VvALXlyINXWk7FoeQVP2Hj/l9bG9+i/oVwuj7Sv5CJD/t/tW2f1wtaZcWAvBJ7jjK0xwcOhFp4=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1742804395; c=relaxed/simple;
	bh=MNFlSDavUG5zv1IuuiCezCSDOHNvgQKy1BPm5hbCVNc=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=Z77D8uJ9J+KbmOzI/fmAbWllO+ZlOVn/fQnqdqHS5aTmvlGfRyOklEv+1H7ww6YPonu+cjcvrngsuSxH9Y7iA9LeUQxtiwBmJRkn3f9Bbth+mgvc/KC6zHvsZuhbWzpuHN/J8RR3g7FjzDtDgEod+L1sjlR3rNNluzsf6pvplZk=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b=jrzrCodz; arc=none smtp.client-ip=10.30.226.201
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b="jrzrCodz"
Received: by smtp.kernel.org (Postfix) with ESMTPSA id 08CF6C4CEE4;
	Mon, 24 Mar 2025 08:19:53 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;
	s=k20201202; t=1742804395;
	bh=MNFlSDavUG5zv1IuuiCezCSDOHNvgQKy1BPm5hbCVNc=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
	b=jrzrCodz7WoL7jj6UhVlanqdRxiofCBuBBKHoqcGzs+LGywsnDwD3JzZ2REcoHlg7
	 mSpi+2H4e4ejlQwNl/xIuhpjNSM+wBntHSHRi/liir38tE76bmrH2dYqli18BYibS6
	 0iz70JRijPlhrhDkpCJ9jbZb59kPL5nBEgx8OFLSNCv8hFqUwYhYpfi/HY6BO2elJG
	 yMFj9BlTeS+FZAcDoFpWujtm5xyVXNkCnZkA472eD8MrkMroz+sAwz51fO5UFRviu/
	 ij/Cobr/0394DM6NsQzhb94XcFlRLcZ9PE+A3FTHJoMkh9kBv9T5LcL/6L/eNH4xh5
	 oBrdySEPVF2cQ==
From: Geliang Tang <geliang@kernel.org>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: [PATCH mptcp-next v4 2/9] mptcp: pm: add established interfaces
Date: Mon, 24 Mar 2025 16:19:36 +0800
Message-ID: 
 <27d299ece14b91a1668a1310b07dda9bf84a2dbf.1742804266.git.tanggeliang@kylinos.cn>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <cover.1742804266.git.tanggeliang@kylinos.cn>
References: <cover.1742804266.git.tanggeliang@kylinos.cn>
Precedence: bulk
X-Mailing-List: mptcp@lists.linux.dev
List-Id: <mptcp.lists.linux.dev>
List-Subscribe: <mailto:mptcp+subscribe@lists.linux.dev>
List-Unsubscribe: <mailto:mptcp+unsubscribe@lists.linux.dev>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Geliang Tang <tanggeliang@kylinos.cn>

This patch adds .established and .subflow_established interfaces for
struct mptcp_pm_ops, and calls pm->ops->established/subflow_established
in from mptcp_pm_worker(). Then get rid of the corresponding code from
__mptcp_pm_kernel_worker().

Since mptcp_pm_addr_send_ack() is a sleepable kfunc, which is invoked
by mptcp_pm_create_subflow_or_signal_addr(), .established() and
.subflow_established() interfaces of BPF PM should be invoked by
__bpf_prog_enter_sleepable(), which can't be invoked under a lock.
This patch unlocks the pm lock before invoking this interface in
mptcp_pm_worker(), while holding this lock in mptcp_pm_kernel_established()
and mptcp_pm_kernel_subflow_established().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h   |  4 ++++
 net/mptcp/pm.c        | 32 ++++++++++++++++++++++++--------
 net/mptcp/pm_kernel.c | 25 +++++++++++--------------
 3 files changed, 39 insertions(+), 22 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 9f28ef550e10..4ac936e4ce0d 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -124,6 +124,10 @@ struct mptcp_pm_ops {
 	bool (*get_priority)(struct mptcp_sock *msk,
 			     struct mptcp_addr_info *skc);
=20
+	/* optional */
+	void (*established)(struct mptcp_sock *msk);
+	void (*subflow_established)(struct mptcp_sock *msk);
+
 	char			name[MPTCP_PM_NAME_MAX];
 	struct module		*owner;
 	struct list_head	list;
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index ba7424582ebf..e2b2c874a9f8 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -516,7 +516,8 @@ void mptcp_pm_fully_established(struct mptcp_sock *msk,=
 const struct sock *ssk)
 	 * be sure to serve this event only once.
 	 */
 	if (READ_ONCE(pm->work_pending) &&
-	    !(pm->status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)))
+	    !(pm->status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)) &&
+	    pm->ops->established)
 		mptcp_pm_schedule_work(msk, MPTCP_PM_ESTABLISHED);
=20
 	if ((pm->status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)) =3D=3D 0)
@@ -543,7 +544,7 @@ void mptcp_pm_subflow_established(struct mptcp_sock *ms=
k)
=20
 	pr_debug("msk=3D%p\n", msk);
=20
-	if (!READ_ONCE(pm->work_pending))
+	if (!READ_ONCE(pm->work_pending) || !pm->ops->subflow_established)
 		return;
=20
 	spin_lock_bh(&pm->lock);
@@ -570,7 +571,8 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk,
 		return;
 	}
=20
-	if (!READ_ONCE(pm->work_pending) && !update_subflows)
+	if (!pm->ops->subflow_established ||
+	    (!READ_ONCE(pm->work_pending) && !update_subflows))
 		return;
=20
 	spin_lock_bh(&pm->lock);
@@ -628,7 +630,7 @@ void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
=20
 	pr_debug("msk=3D%p\n", msk);
=20
-	if (!READ_ONCE(pm->work_pending))
+	if (!READ_ONCE(pm->work_pending) || !pm->ops->subflow_established)
 		return;
=20
 	spin_lock_bh(&pm->lock);
@@ -949,20 +951,34 @@ void mptcp_pm_worker(struct mptcp_sock *msk)
 	if (!(pm->status & MPTCP_PM_WORK_MASK))
 		return;
=20
-	spin_lock_bh(&msk->pm.lock);
-
 	pr_debug("msk=3D%p status=3D%x\n", msk, pm->status);
 	if (pm->status & BIT(MPTCP_PM_ADD_ADDR_SEND_ACK)) {
+		spin_lock_bh(&pm->lock);
 		pm->status &=3D ~BIT(MPTCP_PM_ADD_ADDR_SEND_ACK);
 		mptcp_pm_addr_send_ack(msk);
+		spin_unlock_bh(&pm->lock);
 	}
 	if (pm->status & BIT(MPTCP_PM_RM_ADDR_RECEIVED)) {
+		spin_lock_bh(&pm->lock);
 		pm->status &=3D ~BIT(MPTCP_PM_RM_ADDR_RECEIVED);
 		mptcp_pm_rm_addr_recv(msk);
+		spin_unlock_bh(&pm->lock);
+	}
+	if (pm->status & BIT(MPTCP_PM_ESTABLISHED)) {
+		spin_lock_bh(&pm->lock);
+		pm->status &=3D ~BIT(MPTCP_PM_ESTABLISHED);
+		spin_unlock_bh(&pm->lock);
+		pm->ops->established(msk);
+	}
+	if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) {
+		spin_lock_bh(&pm->lock);
+		pm->status &=3D ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED);
+		spin_unlock_bh(&pm->lock);
+		pm->ops->subflow_established(msk);
 	}
+	spin_lock_bh(&pm->lock);
 	__mptcp_pm_kernel_worker(msk);
-
-	spin_unlock_bh(&msk->pm.lock);
+	spin_unlock_bh(&pm->lock);
 }
=20
 static void mptcp_pm_ops_init(struct mptcp_sock *msk,
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
index 7ec81d5195d4..2e181224bccb 100644
--- a/net/mptcp/pm_kernel.c
+++ b/net/mptcp/pm_kernel.c
@@ -269,6 +269,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(stru=
ct mptcp_sock *msk)
 	local_addr_max =3D mptcp_pm_get_local_addr_max(msk);
 	subflows_max =3D mptcp_pm_get_subflows_max(msk);
=20
+	spin_lock_bh(&msk->pm.lock);
 	/* do lazy endpoint usage accounting for the MPC subflows */
 	if (unlikely(!(msk->pm.status & BIT(MPTCP_PM_MPC_ENDPOINT_ACCOUNTED))) &&=
 msk->first) {
 		struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(msk->first);
@@ -307,7 +308,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(stru=
ct mptcp_sock *msk)
 		 * current address announce will be completed.
 		 */
 		if (msk->pm.addr_signal & BIT(MPTCP_ADD_ADDR_SIGNAL))
-			return;
+			goto out;
=20
 		if (!select_signal_address(pernet, msk, &local))
 			goto subflow;
@@ -316,7 +317,7 @@ static void mptcp_pm_create_subflow_or_signal_addr(stru=
ct mptcp_sock *msk)
 		 * continuing, and trying to create subflows.
 		 */
 		if (!mptcp_pm_alloc_anno_list(msk, &local.addr))
-			return;
+			goto out;
=20
 		__clear_bit(local.addr.id, msk->pm.id_avail_bitmap);
 		msk->pm.add_addr_signaled++;
@@ -365,14 +366,16 @@ static void mptcp_pm_create_subflow_or_signal_addr(st=
ruct mptcp_sock *msk)
 		spin_lock_bh(&msk->pm.lock);
 	}
 	mptcp_pm_nl_check_work_pending(msk);
+out:
+	spin_unlock_bh(&msk->pm.lock);
 }
=20
-static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk)
+static void mptcp_pm_kernel_established(struct mptcp_sock *msk)
 {
 	mptcp_pm_create_subflow_or_signal_addr(msk);
 }
=20
-static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk)
+static void mptcp_pm_kernel_subflow_established(struct mptcp_sock *msk)
 {
 	mptcp_pm_create_subflow_or_signal_addr(msk);
 }
@@ -758,8 +761,8 @@ static int mptcp_nl_add_subflow_or_signal_addr(struct n=
et *net,
 		spin_lock_bh(&msk->pm.lock);
 		if (mptcp_addresses_equal(addr, &mpc_addr, addr->port))
 			msk->mpc_endpoint_id =3D addr->id;
-		mptcp_pm_create_subflow_or_signal_addr(msk);
 		spin_unlock_bh(&msk->pm.lock);
+		mptcp_pm_create_subflow_or_signal_addr(msk);
 		release_sock(sk);
=20
 next:
@@ -1243,8 +1246,8 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *m=
sk,
 	spin_lock_bh(&msk->pm.lock);
 	mptcp_pm_rm_subflow(msk, &list);
 	__mark_subflow_endp_available(msk, list.ids[0]);
-	mptcp_pm_create_subflow_or_signal_addr(msk);
 	spin_unlock_bh(&msk->pm.lock);
+	mptcp_pm_create_subflow_or_signal_addr(msk);
 }
=20
 static void mptcp_pm_nl_set_flags_all(struct net *net,
@@ -1348,14 +1351,6 @@ void __mptcp_pm_kernel_worker(struct mptcp_sock *msk)
 		pm->status &=3D ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED);
 		mptcp_pm_nl_add_addr_received(msk);
 	}
-	if (pm->status & BIT(MPTCP_PM_ESTABLISHED)) {
-		pm->status &=3D ~BIT(MPTCP_PM_ESTABLISHED);
-		mptcp_pm_nl_fully_established(msk);
-	}
-	if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) {
-		pm->status &=3D ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED);
-		mptcp_pm_nl_subflow_established(msk);
-	}
 }
=20
 static int __net_init pm_nl_init_net(struct net *net)
@@ -1422,6 +1417,8 @@ static void mptcp_pm_kernel_init(struct mptcp_sock *m=
sk)
 struct mptcp_pm_ops mptcp_pm_kernel =3D {
 	.get_local_id		=3D mptcp_pm_kernel_get_local_id,
 	.get_priority		=3D mptcp_pm_kernel_get_priority,
+	.established		=3D mptcp_pm_kernel_established,
+	.subflow_established	=3D mptcp_pm_kernel_subflow_established,
 	.init			=3D mptcp_pm_kernel_init,
 	.name			=3D "kernel",
 	.owner			=3D THIS_MODULE,
--=20
2.43.0
From nobody Thu Apr 17 08:17:02 2025
Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org
 [10.30.226.201])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id C88911459F6
	for <mptcp@lists.linux.dev>; Mon, 24 Mar 2025 08:19:56 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=10.30.226.201
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1742804396; cv=none;
 b=Vy/5mJgoXseYAJHqrowZ7G0CvqUBZuxmsPidkQ7tQ44vBqDrMAJ6OdBMm8l/CPYKjzdyykvD3gmpKUp+SGNuHLeIy2QCLX4LR5vEPOScE0Vx5N2ph6YozcTuzUeGQChL2mmN6tOdYvBwEIhyyFOKMalfP2urq2w+GQO7JZej96Y=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1742804396; c=relaxed/simple;
	bh=61vKMIrzXW1Lgy7L8zqTyNvGT8sisXMs1/mG5P/149Y=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=hyg7gqBvGw5+DmxPFtShNEJj0OzL/1Jz2hIwG6//Dgs4562lKeeFi05idPLXVbMDzl/izadsgRLP8wsOud9k2QFafkG0GiXcFC19HXmXdj8LTGm44LOu0aTZfqoYCdK2hSL3e3y+jSFS6OKlTbBUhiVN8JJeuZx0Ni7KpNwUkVw=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b=EnveZXkx; arc=none smtp.client-ip=10.30.226.201
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b="EnveZXkx"
Received: by smtp.kernel.org (Postfix) with ESMTPSA id BC71EC4CEED;
	Mon, 24 Mar 2025 08:19:55 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;
	s=k20201202; t=1742804396;
	bh=61vKMIrzXW1Lgy7L8zqTyNvGT8sisXMs1/mG5P/149Y=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
	b=EnveZXkxbqwi0LFotG72ITFke6vR/yXALAc5/kmWk/6iyz6Z0ZT046rv9eO0clfgz
	 HjDtZvyoc7Sw61Z7QrBWiBRvOZhXpqvIft0khzbFRuMIrI3ue6vO0X5V6cxElKUfzT
	 5gSFteHVYKeDgE51xmMwX1AD/OLMlsLD7UNU2+Y73xAb+gwNc82SzhmJcvqN/TQhhc
	 dwtGak0cpNakU/z8UaEFmrbwOZEK3CFDIE1Xm6NfO4Ss/DvnZN5VDEsh031nnPyArD
	 ASlxcjq0h9GKqqWWDcQz5m1LeSssqTcGgm6/iqtMVyRw4psqR0JSiQzk/zjalQkZbx
	 lwaN0tVgaQFhw==
From: Geliang Tang <geliang@kernel.org>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: [PATCH mptcp-next v4 3/9] mptcp: pm: drop is_userspace in
 subflow_check_next
Date: Mon, 24 Mar 2025 16:19:37 +0800
Message-ID: 
 <c7f5b4fe1579c47eae9d34ac8b5570bccf277f13.1742804266.git.tanggeliang@kylinos.cn>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <cover.1742804266.git.tanggeliang@kylinos.cn>
References: <cover.1742804266.git.tanggeliang@kylinos.cn>
Precedence: bulk
X-Mailing-List: mptcp@lists.linux.dev
List-Id: <mptcp.lists.linux.dev>
List-Subscribe: <mailto:mptcp+subscribe@lists.linux.dev>
List-Unsubscribe: <mailto:mptcp+unsubscribe@lists.linux.dev>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Geliang Tang <tanggeliang@kylinos.cn>

This patch moves mptcp_pm_close_subflow() forward to let it be used by both
the userspace PM and the in-kernel PM in mptcp_pm_subflow_check_next().Then
mptcp_pm_is_userspace() here can be dropped.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 net/mptcp/pm.c | 12 ++----------
 1 file changed, 2 insertions(+), 10 deletions(-)

diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index e2b2c874a9f8..906c558aef0b 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -562,22 +562,14 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *m=
sk,
 	bool update_subflows;
=20
 	update_subflows =3D subflow->request_join || subflow->mp_join;
-	if (mptcp_pm_is_userspace(msk)) {
-		if (update_subflows) {
-			spin_lock_bh(&pm->lock);
-			pm->subflows--;
-			spin_unlock_bh(&pm->lock);
-		}
-		return;
-	}
+	if (update_subflows)
+		mptcp_pm_close_subflow(msk);
=20
 	if (!pm->ops->subflow_established ||
 	    (!READ_ONCE(pm->work_pending) && !update_subflows))
 		return;
=20
 	spin_lock_bh(&pm->lock);
-	if (update_subflows)
-		__mptcp_pm_close_subflow(msk);
=20
 	/* Even if this subflow is not really established, tell the PM to try
 	 * to pick the next ones, if possible.
--=20
2.43.0
From nobody Thu Apr 17 08:17:02 2025
Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org
 [10.30.226.201])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id 65933257453
	for <mptcp@lists.linux.dev>; Mon, 24 Mar 2025 08:19:58 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=10.30.226.201
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1742804398; cv=none;
 b=V1BM6M9W2aY6SyzWBLIk9GCi52RIJSYuTy/NotCg2k/AVHmSrz0P7sTz+VwmvUk75JicX+9r3DCRDwLBQEuG3WsOuuons34RUyY1JouJ/lSwIh2jjaR8DlP9qQGEURVcp6XaMsxn2wouKoyd8jp/kutFCWPudw1oL+CtsJ/1iKk=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1742804398; c=relaxed/simple;
	bh=Ow1hK2WLiruOPeZn+Dtb69TBX0BXmFysmVrd4o+S4fU=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=b0R685gPTE9YTqR6QwJIm93yffSF10DMY+XD6D/ofPiv7nYaN4CAdAb4o0lvn+q29tP5bePSE1up5UevzK1uXDnZvv5rXR2k/G9eEORZevG5CwlFM25sA8rYoxTw2DXIxiIS8TGwG2+8V6aXkrqmrQNhMcjQfEdXNIJ5i/Rr4Gw=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b=Ts/HngP8; arc=none smtp.client-ip=10.30.226.201
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b="Ts/HngP8"
Received: by smtp.kernel.org (Postfix) with ESMTPSA id 4B616C4CEDD;
	Mon, 24 Mar 2025 08:19:57 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;
	s=k20201202; t=1742804398;
	bh=Ow1hK2WLiruOPeZn+Dtb69TBX0BXmFysmVrd4o+S4fU=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
	b=Ts/HngP8q/3T1KBW5UhcTbkjI6+Ab8WWxpJqghHjsOSTb+AUj/RMglOqUPNhOAxTT
	 59gppJ9QNqguxDFvNCzzoOJTihIL70tyT7liRPzGOl0N9UC6BlgHeFPbDkIbZFNvyL
	 2/Xf13+XV7I0lXAzJ9tKF0rGWZjHAcIf79Fr78uhjEAJengbUSfCm54rw32lfFAm/C
	 OUmlZP+DKTfg3MdL3087shLxZSBAc22wAw8vxnjpbFF1aa4q4lvv4o9gNVTQUq5d7N
	 eBuDLNJS+3a6SaVlyLsU+hK/wzyO4cPhSR8WmtooI1lycglXaUY458iPcwphkjs5WO
	 v7/y/9DqHDcxQ==
From: Geliang Tang <geliang@kernel.org>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: [PATCH mptcp-next v4 4/9] mptcp: pm: drop redundant
 MPTCP_MIB_ADDADDRDROP
Date: Mon, 24 Mar 2025 16:19:38 +0800
Message-ID: 
 <d16062a0e4387b9b09554eda9a5447e89ff7529a.1742804266.git.tanggeliang@kylinos.cn>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <cover.1742804266.git.tanggeliang@kylinos.cn>
References: <cover.1742804266.git.tanggeliang@kylinos.cn>
Precedence: bulk
X-Mailing-List: mptcp@lists.linux.dev
List-Id: <mptcp.lists.linux.dev>
List-Subscribe: <mailto:mptcp+subscribe@lists.linux.dev>
List-Unsubscribe: <mailto:mptcp+unsubscribe@lists.linux.dev>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Geliang Tang <tanggeliang@kylinos.cn>

MPTCP_MIB_ADDADDRDROP MIB counter is incremented from both the in-kernel PM
and the userspace PM. This can be called only once to reduce redundant
code.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 net/mptcp/pm.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 906c558aef0b..8efb47331f79 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -586,6 +586,7 @@ void mptcp_pm_add_addr_received(const struct sock *ssk,
 	struct mptcp_subflow_context *subflow =3D mptcp_subflow_ctx(ssk);
 	struct mptcp_sock *msk =3D mptcp_sk(subflow->conn);
 	struct mptcp_pm_data *pm =3D &msk->pm;
+	int ret =3D 0;
=20
 	pr_debug("msk=3D%p remote_id=3D%d accept=3D%d\n", msk, addr->id,
 		 READ_ONCE(pm->accept_addr));
@@ -599,7 +600,7 @@ void mptcp_pm_add_addr_received(const struct sock *ssk,
 			mptcp_pm_announce_addr(msk, addr, true);
 			mptcp_pm_add_addr_send_ack(msk);
 		} else {
-			__MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_ADDADDRDROP);
+			ret =3D -EINVAL;
 		}
 	/* id0 should not have a different address */
 	} else if ((addr->id =3D=3D 0 && !mptcp_pm_is_init_remote_addr(msk, addr)=
) ||
@@ -609,9 +610,12 @@ void mptcp_pm_add_addr_received(const struct sock *ssk,
 	} else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
 		pm->remote =3D *addr;
 	} else {
-		__MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_ADDADDRDROP);
+		ret =3D -EINVAL;
 	}
=20
+	if (ret)
+		__MPTCP_INC_STATS(sock_net((struct sock *)msk), MPTCP_MIB_ADDADDRDROP);
+
 	spin_unlock_bh(&pm->lock);
 }
=20
--=20
2.43.0
From nobody Thu Apr 17 08:17:02 2025
Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org
 [10.30.226.201])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7ED8A257453
	for <mptcp@lists.linux.dev>; Mon, 24 Mar 2025 08:20:00 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=10.30.226.201
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1742804400; cv=none;
 b=qTI9l9PICMgLyw3CoA01p+83gqUdpqyxhbUnnep1PceH/tAFBZs4kApLiG0X+nSrV6j5wcSlIqXs3tDY6SZE8Z1oCYAp9gLvVIykFWXxcGLmTZW1W72ADRU9e4vIhzbst9JizEGk3nvG83OPq8XIExMFzGjv1G66PtToBdrOZh4=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1742804400; c=relaxed/simple;
	bh=DL4+csqHUjsaftRsTM0cQCMB7RSYstoo7sRijzVk2yc=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=nGAbxiYIfehqXNiIWScL3WrwL0kVBLKbTyKT5c0OUK06BQlNQE1y3JWPRez9i0MF3ygVf8WHHGaOFCvDXMeOrrYkelzWkgBFIpbM7r1XkxGvFSulsThfUj7tHbgDD9dQjhMul/GMj3HMuCIsEjulozLcyQUq/tgHhalThQyw5BQ=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b=mHGoYqEE; arc=none smtp.client-ip=10.30.226.201
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b="mHGoYqEE"
Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0C7B6C4CEDD;
	Mon, 24 Mar 2025 08:19:58 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;
	s=k20201202; t=1742804400;
	bh=DL4+csqHUjsaftRsTM0cQCMB7RSYstoo7sRijzVk2yc=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
	b=mHGoYqEEC9TFp1AiDYd2lcAEG0B3PBva4jqcDzclTU60qzKr1ryLiJvu/l49MyLVE
	 VQslTilOpIOezBJ5q4/l2MFZmNPMxVAxF4DEc3EaJIc9v6Uui2dGhVMB3mPA2jRrsV
	 y0ApGowa97TN6fjWyLQ1Lids6oujaT3Ixc9Nb/4VhaDtYPagoZXNAPCtSyfnR9iFaw
	 RMNxxnQKipRqP8ywUpHJHI+WHeJILJBt8fgnDQKSQ3axHGqJyiMdMhrqj3yL3Zvi/L
	 VCSGN0yTAgb33wWuE7rL9JxWRRRBqA9mIG1POgCdLhxMwbMWvAn94WZRKgY4cKqwwB
	 ZCHSDCUBgotfw==
From: Geliang Tang <geliang@kernel.org>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: [PATCH mptcp-next v4 5/9] mptcp: pm: add add_addr_received()
 interface
Date: Mon, 24 Mar 2025 16:19:39 +0800
Message-ID: 
 <0b18abccee51f68bb1e0016426159df0b2ca1e36.1742804266.git.tanggeliang@kylinos.cn>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <cover.1742804266.git.tanggeliang@kylinos.cn>
References: <cover.1742804266.git.tanggeliang@kylinos.cn>
Precedence: bulk
X-Mailing-List: mptcp@lists.linux.dev
List-Id: <mptcp.lists.linux.dev>
List-Subscribe: <mailto:mptcp+subscribe@lists.linux.dev>
List-Unsubscribe: <mailto:mptcp+unsubscribe@lists.linux.dev>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Geliang Tang <tanggeliang@kylinos.cn>

This patch adds an optional .add_addr_received interface for struct
mptcp_pm_ops and invokes it in mptcp_pm_worker().

This interface is only implemented in the in-kernel PM as a wrapper
of mptcp_pm_nl_add_addr_received().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h   |  1 +
 net/mptcp/pm.c        | 18 +++++++++++-------
 net/mptcp/pm_kernel.c | 24 +++++++++++-------------
 net/mptcp/protocol.h  |  1 -
 4 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 4ac936e4ce0d..5118d11d2ee9 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -127,6 +127,7 @@ struct mptcp_pm_ops {
 	/* optional */
 	void (*established)(struct mptcp_sock *msk);
 	void (*subflow_established)(struct mptcp_sock *msk);
+	void (*add_addr_received)(struct mptcp_sock *msk);
=20
 	char			name[MPTCP_PM_NAME_MAX];
 	struct module		*owner;
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 8efb47331f79..71589cd5dee7 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -607,10 +607,11 @@ void mptcp_pm_add_addr_received(const struct sock *ss=
k,
 		   (addr->id > 0 && !READ_ONCE(pm->accept_addr))) {
 		mptcp_pm_announce_addr(msk, addr, true);
 		mptcp_pm_add_addr_send_ack(msk);
-	} else if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED)) {
-		pm->remote =3D *addr;
-	} else {
-		ret =3D -EINVAL;
+	} else if (pm->ops->add_addr_received) {
+		if (mptcp_pm_schedule_work(msk, MPTCP_PM_ADD_ADDR_RECEIVED))
+			pm->remote =3D *addr;
+		else
+			ret =3D -EINVAL;
 	}
=20
 	if (ret)
@@ -948,6 +949,12 @@ void mptcp_pm_worker(struct mptcp_sock *msk)
 		return;
=20
 	pr_debug("msk=3D%p status=3D%x\n", msk, pm->status);
+	if (pm->status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED)) {
+		spin_lock_bh(&pm->lock);
+		pm->status &=3D ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED);
+		spin_unlock_bh(&pm->lock);
+		pm->ops->add_addr_received(msk);
+	}
 	if (pm->status & BIT(MPTCP_PM_ADD_ADDR_SEND_ACK)) {
 		spin_lock_bh(&pm->lock);
 		pm->status &=3D ~BIT(MPTCP_PM_ADD_ADDR_SEND_ACK);
@@ -972,9 +979,6 @@ void mptcp_pm_worker(struct mptcp_sock *msk)
 		spin_unlock_bh(&pm->lock);
 		pm->ops->subflow_established(msk);
 	}
-	spin_lock_bh(&pm->lock);
-	__mptcp_pm_kernel_worker(msk);
-	spin_unlock_bh(&pm->lock);
 }
=20
 static void mptcp_pm_ops_init(struct mptcp_sock *msk,
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
index 2e181224bccb..4f4791620072 100644
--- a/net/mptcp/pm_kernel.c
+++ b/net/mptcp/pm_kernel.c
@@ -461,12 +461,13 @@ static void mptcp_pm_nl_add_addr_received(struct mptc=
p_sock *msk)
 		 msk->pm.add_addr_accepted, add_addr_accept_max,
 		 msk->pm.remote.family);
=20
+	spin_lock_bh(&msk->pm.lock);
 	remote =3D msk->pm.remote;
 	mptcp_pm_announce_addr(msk, &remote, true);
 	mptcp_pm_addr_send_ack(msk);
=20
 	if (lookup_subflow_by_daddr(&msk->conn_list, &remote))
-		return;
+		goto out;
=20
 	/* pick id 0 port, if none is provided the remote address */
 	if (!remote.port)
@@ -477,7 +478,7 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_=
sock *msk)
 	 */
 	nr =3D fill_local_addresses_vec(msk, &remote, locals);
 	if (nr =3D=3D 0)
-		return;
+		goto out;
=20
 	spin_unlock_bh(&msk->pm.lock);
 	for (i =3D 0; i < nr; i++)
@@ -493,6 +494,8 @@ static void mptcp_pm_nl_add_addr_received(struct mptcp_=
sock *msk)
 		    msk->pm.subflows >=3D subflows_max)
 			WRITE_ONCE(msk->pm.accept_addr, false);
 	}
+out:
+	spin_unlock_bh(&msk->pm.lock);
 }
=20
 void mptcp_pm_nl_rm_addr(struct mptcp_sock *msk, u8 rm_id)
@@ -1342,17 +1345,6 @@ bool mptcp_pm_nl_check_work_pending(struct mptcp_soc=
k *msk)
 	return true;
 }
=20
-/* Called under PM lock */
-void __mptcp_pm_kernel_worker(struct mptcp_sock *msk)
-{
-	struct mptcp_pm_data *pm =3D &msk->pm;
-
-	if (pm->status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED)) {
-		pm->status &=3D ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED);
-		mptcp_pm_nl_add_addr_received(msk);
-	}
-}
-
 static int __net_init pm_nl_init_net(struct net *net)
 {
 	struct pm_nl_pernet *pernet =3D pm_nl_get_pernet(net);
@@ -1394,6 +1386,11 @@ static struct pernet_operations mptcp_pm_pernet_ops =
=3D {
 	.size =3D sizeof(struct pm_nl_pernet),
 };
=20
+static void mptcp_pm_kernel_add_addr_received(struct mptcp_sock *msk)
+{
+	mptcp_pm_nl_add_addr_received(msk);
+}
+
 static void mptcp_pm_kernel_init(struct mptcp_sock *msk)
 {
 	bool subflows_allowed =3D !!mptcp_pm_get_subflows_max(msk);
@@ -1419,6 +1416,7 @@ struct mptcp_pm_ops mptcp_pm_kernel =3D {
 	.get_priority		=3D mptcp_pm_kernel_get_priority,
 	.established		=3D mptcp_pm_kernel_established,
 	.subflow_established	=3D mptcp_pm_kernel_subflow_established,
+	.add_addr_received	=3D mptcp_pm_kernel_add_addr_received,
 	.init			=3D mptcp_pm_kernel_init,
 	.name			=3D "kernel",
 	.owner			=3D THIS_MODULE,
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 64aa091cb685..7fa26c49fbed 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1164,7 +1164,6 @@ void __init mptcp_pm_kernel_register(void);
 void __init mptcp_pm_userspace_register(void);
 void __init mptcp_pm_nl_init(void);
 void mptcp_pm_worker(struct mptcp_sock *msk);
-void __mptcp_pm_kernel_worker(struct mptcp_sock *msk);
 unsigned int mptcp_pm_get_add_addr_signal_max(const struct mptcp_sock *msk=
);
 unsigned int mptcp_pm_get_add_addr_accept_max(const struct mptcp_sock *msk=
);
 unsigned int mptcp_pm_get_subflows_max(const struct mptcp_sock *msk);
--=20
2.43.0
From nobody Thu Apr 17 08:17:02 2025
Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org
 [10.30.226.201])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id 47A6425D200
	for <mptcp@lists.linux.dev>; Mon, 24 Mar 2025 08:20:01 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=10.30.226.201
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1742804402; cv=none;
 b=QT7PnZIFa+tWCp2xiy7e24okzB94KF9jlu7zxarxbwTKZWx3M7ps19Uc9Slifpgbb3ScDAHsfFARWPiF90rELZ1TS6VhNGijeouGmouzERINMvkTElB+1bsJ9E8vMeNz2Bmr0wWNfHLkXAJdd5qU8YjGXyw4lBAXDDc8/A71SD8=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1742804402; c=relaxed/simple;
	bh=W/e97zLFoyLEYBASGxWCwqj1wdt2TFdaNun5EwZGW/4=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=Oc+n741voOZMaxbpY/mf4prR5UG05jwYnVzufI029i1ZeIc266S6ohAgFdGsWgYkRvogZ+Lf7OYs2Uzj3I51cCRi0IqNo8h5zVm3iazTMTcfqJazDFjsTXVWHfdA2v/6DGmoysNvNJ4uFUXaBtPIkD+lvPV6lnriK22wPf2crXI=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b=oLA3B8Ie; arc=none smtp.client-ip=10.30.226.201
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b="oLA3B8Ie"
Received: by smtp.kernel.org (Postfix) with ESMTPSA id A7E18C4CEE4;
	Mon, 24 Mar 2025 08:20:00 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;
	s=k20201202; t=1742804401;
	bh=W/e97zLFoyLEYBASGxWCwqj1wdt2TFdaNun5EwZGW/4=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
	b=oLA3B8IeyYAXOhTQT+X0fK/bcO6nDkHmoXkQZv0nLCmK/1v1KiQMkPKc54UXyU0dm
	 /mVpk+Gs+xYuDol9n4ZBKUNhMkdzKWVGxdUYodbzWVDukKxmz0yCx74DM6U3qgqLX6
	 KTXKoasUqUGmRZC69oeCoVMHqPYIB94+8srf7K5EeAzWg+9HsbclqMgY5IYNzQjFkg
	 XKt/b3szUE02guPS1TNYewFIk8VXq8sYFIyLFGbhn3tEpNI6GaDJQuAMjKL6X2z+Yv
	 qfx+c55ZlVdvFp51MW1Uv1O+iCEKePMLo6p9rhgJDLUjBxnGbvKIVH0KFA7kmW9dGh
	 GUVaIRyuZ260g==
From: Geliang Tang <geliang@kernel.org>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: [PATCH mptcp-next v4 6/9] mptcp: pm: add rm_addr_received() interface
Date: Mon, 24 Mar 2025 16:19:40 +0800
Message-ID: 
 <73e63af9c3dc74deb1b6aa79a9b7ed57f331ba33.1742804266.git.tanggeliang@kylinos.cn>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <cover.1742804266.git.tanggeliang@kylinos.cn>
References: <cover.1742804266.git.tanggeliang@kylinos.cn>
Precedence: bulk
X-Mailing-List: mptcp@lists.linux.dev
List-Id: <mptcp.lists.linux.dev>
List-Subscribe: <mailto:mptcp+subscribe@lists.linux.dev>
List-Unsubscribe: <mailto:mptcp+unsubscribe@lists.linux.dev>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Geliang Tang <tanggeliang@kylinos.cn>

This patch adds an optional .rm_addr_received interface for struct
mptcp_pm_ops and invokes it in mptcp_pm_rm_addr_or_subflow().

This interface is only implemented in the in-kernel PM as a wrapper
of mptcp_pm_nl_rm_addr().

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h   | 1 +
 net/mptcp/pm.c        | 4 ++--
 net/mptcp/pm_kernel.c | 6 ++++++
 3 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 5118d11d2ee9..3f06fbd2a908 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -128,6 +128,7 @@ struct mptcp_pm_ops {
 	void (*established)(struct mptcp_sock *msk);
 	void (*subflow_established)(struct mptcp_sock *msk);
 	void (*add_addr_received)(struct mptcp_sock *msk);
+	void (*rm_addr_received)(struct mptcp_sock *msk, u8 id);
=20
 	char			name[MPTCP_PM_NAME_MAX];
 	struct module		*owner;
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index 71589cd5dee7..bf3c19defe98 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -703,8 +703,8 @@ static void mptcp_pm_rm_addr_or_subflow(struct mptcp_so=
ck *msk,
=20
 		if (rm_type =3D=3D MPTCP_MIB_RMADDR) {
 			__MPTCP_INC_STATS(sock_net(sk), rm_type);
-			if (removed && mptcp_pm_is_kernel(msk))
-				mptcp_pm_nl_rm_addr(msk, rm_id);
+			if (removed && msk->pm.ops->rm_addr_received)
+				msk->pm.ops->rm_addr_received(msk, rm_id);
 		}
 	}
 }
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
index 4f4791620072..1a71676bdf43 100644
--- a/net/mptcp/pm_kernel.c
+++ b/net/mptcp/pm_kernel.c
@@ -1391,6 +1391,11 @@ static void mptcp_pm_kernel_add_addr_received(struct=
 mptcp_sock *msk)
 	mptcp_pm_nl_add_addr_received(msk);
 }
=20
+static void mptcp_pm_kernel_rm_addr_received(struct mptcp_sock *msk, u8 id)
+{
+	mptcp_pm_nl_rm_addr(msk, id);
+}
+
 static void mptcp_pm_kernel_init(struct mptcp_sock *msk)
 {
 	bool subflows_allowed =3D !!mptcp_pm_get_subflows_max(msk);
@@ -1417,6 +1422,7 @@ struct mptcp_pm_ops mptcp_pm_kernel =3D {
 	.established		=3D mptcp_pm_kernel_established,
 	.subflow_established	=3D mptcp_pm_kernel_subflow_established,
 	.add_addr_received	=3D mptcp_pm_kernel_add_addr_received,
+	.rm_addr_received	=3D mptcp_pm_kernel_rm_addr_received,
 	.init			=3D mptcp_pm_kernel_init,
 	.name			=3D "kernel",
 	.owner			=3D THIS_MODULE,
--=20
2.43.0
From nobody Thu Apr 17 08:17:02 2025
Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org
 [10.30.226.201])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id C44121459F6
	for <mptcp@lists.linux.dev>; Mon, 24 Mar 2025 08:20:03 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=10.30.226.201
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1742804403; cv=none;
 b=o8jN5zU1GjzNC/9w/39c+Fz44PvmVOxliMI8b3/dUDirvV/div+488/obel22wPvnaKsS5nqkvk/R6+nHpaK3sHqCgfXE1YvC3Ia+6mBwQEXbKTgAUOQLZnlEKkBecR+KAX2ldouKv9XwuOroMJnbdiev8uZPVoj9b2c6LMxMFg=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1742804403; c=relaxed/simple;
	bh=Vs5W0eCJ66/TbuvTa03eadua1h1TPprvSgcYWrrq3L4=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=rhaHX+dUOj6WMunzKH9cwDdaP4D7T+8Ly9HILfq0PrBngJHh1DL6oLZJfs6kAE/561G4qAjt5CtRMDGrMPCxepOR+GiYHF0zdkqVut3btRyirwHXBId04+oyjkF9atl+0IGgmVtrwE2g939P7qFg4rKNEtPNnDr4o9Hyv0RAZrM=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b=WW+LLuv8; arc=none smtp.client-ip=10.30.226.201
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b="WW+LLuv8"
Received: by smtp.kernel.org (Postfix) with ESMTPSA id 37693C4CEDD;
	Mon, 24 Mar 2025 08:20:02 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;
	s=k20201202; t=1742804403;
	bh=Vs5W0eCJ66/TbuvTa03eadua1h1TPprvSgcYWrrq3L4=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
	b=WW+LLuv8I8AUs+coOUHt93yjXxOW/YNTf9L6VOWRYJE+dYQBo95VWzhR2v4yz6swZ
	 2dUD1cVWFv1uVnhZWT9yhUeBkdnodyb0UpLkTvEAxhhvKlsA1/ponheq3IUhJKanqE
	 mVKswUJK1iViKlnrd5bZ5gAJdoCoTyOAVD42IYO895YyY845Wt5rFTTdf2UO9hwlqp
	 DZUXjptZZgueYdTcHmHR/kOUULtGfRQ/qETf5bfL3WFkhPw2Xy6bLYMcYnuLXVWp/u
	 cz7lumGrS06V5r0CBEKZ6kdA88ljszrhwjls4P5160qkhBZPbch+IjgZePbXuc0nRC
	 LNBjvGeKlfSZg==
From: Geliang Tang <geliang@kernel.org>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: [PATCH mptcp-next v4 7/9] mptcp: pm: add add_addr_echo() interface
Date: Mon, 24 Mar 2025 16:19:41 +0800
Message-ID: 
 <f5dacf8e5b6491509a6df16dc448e172b1963807.1742804266.git.tanggeliang@kylinos.cn>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <cover.1742804266.git.tanggeliang@kylinos.cn>
References: <cover.1742804266.git.tanggeliang@kylinos.cn>
Precedence: bulk
X-Mailing-List: mptcp@lists.linux.dev
List-Id: <mptcp.lists.linux.dev>
List-Subscribe: <mailto:mptcp+subscribe@lists.linux.dev>
List-Unsubscribe: <mailto:mptcp+unsubscribe@lists.linux.dev>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Geliang Tang <tanggeliang@kylinos.cn>

The helper mptcp_pm_is_userspace() is used to distinguish userspace PM
operations from in-kernel PM in mptcp_pm_add_addr_received(). It seems
reasonable to add a mandatory .add_addr_echo interface for struct
mptcp_pm_ops.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h      |  4 ++++
 net/mptcp/pm.c           | 20 +++++++-------------
 net/mptcp/pm_kernel.c    |  9 +++++++++
 net/mptcp/pm_userspace.c |  7 +++++++
 net/mptcp/protocol.h     |  2 ++
 5 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 3f06fbd2a908..18d3679a752c 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -130,6 +130,10 @@ struct mptcp_pm_ops {
 	void (*add_addr_received)(struct mptcp_sock *msk);
 	void (*rm_addr_received)(struct mptcp_sock *msk, u8 id);
=20
+	/* required */
+	bool (*add_addr_echo)(struct mptcp_sock *msk,
+			      const struct mptcp_addr_info *addr);
+
 	char			name[MPTCP_PM_NAME_MAX];
 	struct module		*owner;
 	struct list_head	list;
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index bf3c19defe98..d37f89bf0180 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -104,8 +104,8 @@ void mptcp_remote_address(const struct sock_common *skc,
 #endif
 }
=20
-static bool mptcp_pm_is_init_remote_addr(struct mptcp_sock *msk,
-					 const struct mptcp_addr_info *remote)
+bool mptcp_pm_is_init_remote_addr(struct mptcp_sock *msk,
+				  const struct mptcp_addr_info *remote)
 {
 	struct mptcp_addr_info mpc_remote;
=20
@@ -595,16 +595,7 @@ void mptcp_pm_add_addr_received(const struct sock *ssk,
=20
 	spin_lock_bh(&pm->lock);
=20
-	if (mptcp_pm_is_userspace(msk)) {
-		if (mptcp_userspace_pm_active(msk)) {
-			mptcp_pm_announce_addr(msk, addr, true);
-			mptcp_pm_add_addr_send_ack(msk);
-		} else {
-			ret =3D -EINVAL;
-		}
-	/* id0 should not have a different address */
-	} else if ((addr->id =3D=3D 0 && !mptcp_pm_is_init_remote_addr(msk, addr)=
) ||
-		   (addr->id > 0 && !READ_ONCE(pm->accept_addr))) {
+	if (pm->ops->add_addr_echo(msk, addr)) {
 		mptcp_pm_announce_addr(msk, addr, true);
 		mptcp_pm_add_addr_send_ack(msk);
 	} else if (pm->ops->add_addr_received) {
@@ -612,6 +603,8 @@ void mptcp_pm_add_addr_received(const struct sock *ssk,
 			pm->remote =3D *addr;
 		else
 			ret =3D -EINVAL;
+	} else {
+		ret =3D -EINVAL;
 	}
=20
 	if (ret)
@@ -1063,7 +1056,8 @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name)
=20
 int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops)
 {
-	if (!pm_ops->get_local_id || !pm_ops->get_priority) {
+	if (!pm_ops->get_local_id || !pm_ops->get_priority ||
+	    !pm_ops->add_addr_echo) {
 		pr_err("%s does not implement required ops\n", pm_ops->name);
 		return -EINVAL;
 	}
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
index 1a71676bdf43..9d159196afe5 100644
--- a/net/mptcp/pm_kernel.c
+++ b/net/mptcp/pm_kernel.c
@@ -1396,6 +1396,14 @@ static void mptcp_pm_kernel_rm_addr_received(struct =
mptcp_sock *msk, u8 id)
 	mptcp_pm_nl_rm_addr(msk, id);
 }
=20
+static bool mptcp_pm_kernel_add_addr_echo(struct mptcp_sock *msk,
+					  const struct mptcp_addr_info *addr)
+{
+	/* id0 should not have a different address */
+	return (addr->id =3D=3D 0 && !mptcp_pm_is_init_remote_addr(msk, addr)) ||
+	       (addr->id > 0 && !READ_ONCE(msk->pm.accept_addr));
+}
+
 static void mptcp_pm_kernel_init(struct mptcp_sock *msk)
 {
 	bool subflows_allowed =3D !!mptcp_pm_get_subflows_max(msk);
@@ -1423,6 +1431,7 @@ struct mptcp_pm_ops mptcp_pm_kernel =3D {
 	.subflow_established	=3D mptcp_pm_kernel_subflow_established,
 	.add_addr_received	=3D mptcp_pm_kernel_add_addr_received,
 	.rm_addr_received	=3D mptcp_pm_kernel_rm_addr_received,
+	.add_addr_echo		=3D mptcp_pm_kernel_add_addr_echo,
 	.init			=3D mptcp_pm_kernel_init,
 	.name			=3D "kernel",
 	.owner			=3D THIS_MODULE,
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 7fc19b844384..3f7778ab064b 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -683,6 +683,12 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm=
_addr_entry *addr,
 	return ret;
 }
=20
+static bool mptcp_pm_userspace_add_addr_echo(struct mptcp_sock *msk,
+					     const struct mptcp_addr_info *addr)
+{
+	return mptcp_userspace_pm_active(msk);
+}
+
 static void mptcp_pm_userspace_release(struct mptcp_sock *msk)
 {
 	mptcp_userspace_pm_free_local_addr_list(msk);
@@ -691,6 +697,7 @@ static void mptcp_pm_userspace_release(struct mptcp_soc=
k *msk)
 static struct mptcp_pm_ops mptcp_pm_userspace =3D {
 	.get_local_id		=3D mptcp_pm_userspace_get_local_id,
 	.get_priority		=3D mptcp_pm_userspace_get_priority,
+	.add_addr_echo		=3D mptcp_pm_userspace_add_addr_echo,
 	.release		=3D mptcp_pm_userspace_release,
 	.name			=3D "userspace",
 	.owner			=3D THIS_MODULE,
diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h
index 7fa26c49fbed..a886e89a806c 100644
--- a/net/mptcp/protocol.h
+++ b/net/mptcp/protocol.h
@@ -1014,6 +1014,8 @@ void mptcp_pm_subflow_established(struct mptcp_sock *=
msk);
 bool mptcp_pm_nl_check_work_pending(struct mptcp_sock *msk);
 void mptcp_pm_subflow_check_next(struct mptcp_sock *msk,
 				 const struct mptcp_subflow_context *subflow);
+bool mptcp_pm_is_init_remote_addr(struct mptcp_sock *msk,
+				  const struct mptcp_addr_info *remote);
 void mptcp_pm_add_addr_received(const struct sock *ssk,
 				const struct mptcp_addr_info *addr);
 void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk,
--=20
2.43.0
From nobody Thu Apr 17 08:17:02 2025
Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org
 [10.30.226.201])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id D311C1459F6
	for <mptcp@lists.linux.dev>; Mon, 24 Mar 2025 08:20:04 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=10.30.226.201
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1742804404; cv=none;
 b=SKe1wxuMEFiH4nyuMbYV7lDondWNcU2Xv/ZruB88cje03jMvDI5XWryjKptJy5UzFw64u+G1LwufjH3OGQEz+eNgXyspwihbJI3ufHF2zyx8mFYbKeFVUuGRB2chn+zjXuOZ38wrgc1/66x2qPLmN45tWcs9tbzPDDTReQPqChQ=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1742804404; c=relaxed/simple;
	bh=CRoX+qm2vj4ArF/cz4+27Me7C0xt0bOrrm/utoSzNPs=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=OaOiZStKWfHx2TqQdHvkDeKzfBx+K3AbCNTohGwFcuv9g/nTH/J2rorQ9Rij2hYnMBWg/cD/8/6OgwJFS4jubrVACWvadVelyQ/KooQQ2wUoVmben+0Y0LWul2CIqF6TB1K4/Fz9Su2dB5bANe68+cGl5FlGAxFwKnCc8LlkT0c=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b=UOHDG+xH; arc=none smtp.client-ip=10.30.226.201
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b="UOHDG+xH"
Received: by smtp.kernel.org (Postfix) with ESMTPSA id E0E02C4CEE4;
	Mon, 24 Mar 2025 08:20:03 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;
	s=k20201202; t=1742804404;
	bh=CRoX+qm2vj4ArF/cz4+27Me7C0xt0bOrrm/utoSzNPs=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
	b=UOHDG+xHLcIH/f459MP3eN/Zrikukib4ic8vvXO0Aw2NyxQshXT0HVHd8xdKA4dQa
	 xijzxmAdQhirW9qchb9696QB/29X0pf7BIpl4xHpmWSHHX++m/AeLfa3Ncqimi5t/t
	 8OKwngI4BTeDhhyYc+TA+1Y3gEvcHJm3Dbi+FcBOd7Vxdwa6WLllyRpriXHUuichHN
	 20wD8FcaA/YxjSOATF0oC3/cpscJ2HWNDPfWxbGYfRVd2puHA3SiMgvx4W/71VFA7E
	 fzYWYTns0gguMaeMSM0VOZk999t/C5Y7N/QoGomsd1pcd+ffXGWmbggwKr7oS29Zpy
	 gSHIc55zfe+Mg==
From: Geliang Tang <geliang@kernel.org>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: [PATCH mptcp-next v4 8/9] mptcp: pm: add accept_new_subflow()
 interface
Date: Mon, 24 Mar 2025 16:19:42 +0800
Message-ID: 
 <44138a92dbf1965a898c209d70ec32c34f784f9b.1742804266.git.tanggeliang@kylinos.cn>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <cover.1742804266.git.tanggeliang@kylinos.cn>
References: <cover.1742804266.git.tanggeliang@kylinos.cn>
Precedence: bulk
X-Mailing-List: mptcp@lists.linux.dev
List-Id: <mptcp.lists.linux.dev>
List-Subscribe: <mailto:mptcp+subscribe@lists.linux.dev>
List-Unsubscribe: <mailto:mptcp+unsubscribe@lists.linux.dev>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Geliang Tang <tanggeliang@kylinos.cn>

The helper mptcp_pm_is_userspace() is used to distinguish userspace PM
operations from in-kernel PM in mptcp_can_accept_new_subflow(). It seems
reasonable to add a mandatory .accept_new_subflow interface for struct
mptcp_pm_ops.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h      |  1 +
 net/mptcp/pm.c           | 31 +++++++++++--------------------
 net/mptcp/pm_kernel.c    |  6 ++++++
 net/mptcp/pm_userspace.c |  6 ++++++
 net/mptcp/subflow.c      |  4 +---
 5 files changed, 25 insertions(+), 23 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 18d3679a752c..8c1ac7368693 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -133,6 +133,7 @@ struct mptcp_pm_ops {
 	/* required */
 	bool (*add_addr_echo)(struct mptcp_sock *msk,
 			      const struct mptcp_addr_info *addr);
+	bool (*accept_new_subflow)(const struct mptcp_sock *msk);
=20
 	char			name[MPTCP_PM_NAME_MAX];
 	struct module		*owner;
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index d37f89bf0180..ca105bbd03ea 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -454,33 +454,24 @@ bool mptcp_pm_allow_new_subflow(struct mptcp_sock *ms=
k)
 {
 	struct mptcp_pm_data *pm =3D &msk->pm;
 	unsigned int subflows_max;
-	int ret =3D 0;
+	bool ret =3D true;
=20
-	if (mptcp_pm_is_userspace(msk)) {
-		if (mptcp_userspace_pm_active(msk)) {
-			spin_lock_bh(&pm->lock);
-			pm->subflows++;
-			spin_unlock_bh(&pm->lock);
-			return true;
-		}
+	if (!pm->ops->accept_new_subflow(msk))
 		return false;
-	}
-
-	subflows_max =3D mptcp_pm_get_subflows_max(msk);
=20
-	pr_debug("msk=3D%p subflows=3D%d max=3D%d allow=3D%d\n", msk, pm->subflow=
s,
-		 subflows_max, READ_ONCE(pm->accept_subflow));
+	spin_lock_bh(&pm->lock);
+	if (!mptcp_pm_is_userspace(msk) && READ_ONCE(pm->accept_subflow)) {
+		subflows_max =3D mptcp_pm_get_subflows_max(msk);
=20
-	/* try to avoid acquiring the lock below */
-	if (!READ_ONCE(pm->accept_subflow))
-		return false;
+		pr_debug("msk=3D%p subflows=3D%d max=3D%d allow=3D%d\n", msk, pm->subflo=
ws,
+			 subflows_max, READ_ONCE(pm->accept_subflow));
=20
-	spin_lock_bh(&pm->lock);
-	if (READ_ONCE(pm->accept_subflow)) {
 		ret =3D pm->subflows < subflows_max;
-		if (ret && ++pm->subflows =3D=3D subflows_max)
+		if (ret && pm->subflows =3D=3D subflows_max - 1)
 			WRITE_ONCE(pm->accept_subflow, false);
 	}
+	if (ret)
+		pm->subflows++;
 	spin_unlock_bh(&pm->lock);
=20
 	return ret;
@@ -1057,7 +1048,7 @@ struct mptcp_pm_ops *mptcp_pm_find(const char *name)
 int mptcp_pm_validate(struct mptcp_pm_ops *pm_ops)
 {
 	if (!pm_ops->get_local_id || !pm_ops->get_priority ||
-	    !pm_ops->add_addr_echo) {
+	    !pm_ops->add_addr_echo || !pm_ops->accept_new_subflow) {
 		pr_err("%s does not implement required ops\n", pm_ops->name);
 		return -EINVAL;
 	}
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
index 9d159196afe5..7ec8fafeda0e 100644
--- a/net/mptcp/pm_kernel.c
+++ b/net/mptcp/pm_kernel.c
@@ -1404,6 +1404,11 @@ static bool mptcp_pm_kernel_add_addr_echo(struct mpt=
cp_sock *msk,
 	       (addr->id > 0 && !READ_ONCE(msk->pm.accept_addr));
 }
=20
+static bool mptcp_pm_kernel_accept_new_subflow(const struct mptcp_sock *ms=
k)
+{
+	return READ_ONCE(msk->pm.accept_subflow);
+}
+
 static void mptcp_pm_kernel_init(struct mptcp_sock *msk)
 {
 	bool subflows_allowed =3D !!mptcp_pm_get_subflows_max(msk);
@@ -1432,6 +1437,7 @@ struct mptcp_pm_ops mptcp_pm_kernel =3D {
 	.add_addr_received	=3D mptcp_pm_kernel_add_addr_received,
 	.rm_addr_received	=3D mptcp_pm_kernel_rm_addr_received,
 	.add_addr_echo		=3D mptcp_pm_kernel_add_addr_echo,
+	.accept_new_subflow	=3D mptcp_pm_kernel_accept_new_subflow,
 	.init			=3D mptcp_pm_kernel_init,
 	.name			=3D "kernel",
 	.owner			=3D THIS_MODULE,
diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c
index 3f7778ab064b..d6301d809376 100644
--- a/net/mptcp/pm_userspace.c
+++ b/net/mptcp/pm_userspace.c
@@ -689,6 +689,11 @@ static bool mptcp_pm_userspace_add_addr_echo(struct mp=
tcp_sock *msk,
 	return mptcp_userspace_pm_active(msk);
 }
=20
+static bool mptcp_pm_userspace_accept_new_subflow(const struct mptcp_sock =
*msk)
+{
+	return mptcp_userspace_pm_active(msk);
+}
+
 static void mptcp_pm_userspace_release(struct mptcp_sock *msk)
 {
 	mptcp_userspace_pm_free_local_addr_list(msk);
@@ -698,6 +703,7 @@ static struct mptcp_pm_ops mptcp_pm_userspace =3D {
 	.get_local_id		=3D mptcp_pm_userspace_get_local_id,
 	.get_priority		=3D mptcp_pm_userspace_get_priority,
 	.add_addr_echo		=3D mptcp_pm_userspace_add_addr_echo,
+	.accept_new_subflow	=3D mptcp_pm_userspace_accept_new_subflow,
 	.release		=3D mptcp_pm_userspace_release,
 	.name			=3D "userspace",
 	.owner			=3D THIS_MODULE,
diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 409bd415ef1d..be79940da424 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -61,9 +61,7 @@ static void subflow_generate_hmac(u64 key1, u64 key2, u32=
 nonce1, u32 nonce2,
 static bool mptcp_can_accept_new_subflow(const struct mptcp_sock *msk)
 {
 	return mptcp_is_fully_established((void *)msk) &&
-		((mptcp_pm_is_userspace(msk) &&
-		  mptcp_userspace_pm_active(msk)) ||
-		 READ_ONCE(msk->pm.accept_subflow));
+		msk->pm.ops->accept_new_subflow(msk);
 }
=20
 /* validate received token and create truncated hmac and nonce for SYN-ACK=
 */
--=20
2.43.0
From nobody Thu Apr 17 08:17:02 2025
Received: from smtp.kernel.org (aws-us-west-2-korg-mail-1.web.codeaurora.org
 [10.30.226.201])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(No client certificate requested)
	by smtp.subspace.kernel.org (Postfix) with ESMTPS id A53EB25D1F4
	for <mptcp@lists.linux.dev>; Mon, 24 Mar 2025 08:20:06 +0000 (UTC)
Authentication-Results: smtp.subspace.kernel.org;
 arc=none smtp.client-ip=10.30.226.201
ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116;
	t=1742804406; cv=none;
 b=kAngXQACcNeU5e21KESUVmtdVCnLF6pOWL6Ewb46u9PJYprSiS4iBrRuQ7K19KEY6R8dOwg++6hXi6kWTbCqxKKkODHZFQlYMCtFeRndNYe2IyztkwEUtqoPvcTJ9pfEhDp36ZBvXWGJ/j29V0heRY9oSoojrTKl6yQ2dzTbB/g=
ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org;
	s=arc-20240116; t=1742804406; c=relaxed/simple;
	bh=ypWK0g/41W5KkprWUyENDwgY5QquaWvNznN8V8Z0lDY=;
	h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References:
	 MIME-Version;
 b=eUQrReTCrxAIqgz5GT04HrzhPAtxLI8JaovcDnsEEE34KxU6TWHP3GMNDtWjHMM+dgavGpgObnb+JrORyjXDUOFoDCffnMYUqQovhsdC2ZrOgs84A4x6iE53exa06ERrPBNffuhlmKhFOZQkQG8CT85hodVOgjSZ4WPNv0eMSnU=
ARC-Authentication-Results: i=1; smtp.subspace.kernel.org;
 dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b=XfOwzWy0; arc=none smtp.client-ip=10.30.226.201
Authentication-Results: smtp.subspace.kernel.org;
	dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org
 header.b="XfOwzWy0"
Received: by smtp.kernel.org (Postfix) with ESMTPSA id 46932C4CEED;
	Mon, 24 Mar 2025 08:20:05 +0000 (UTC)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org;
	s=k20201202; t=1742804406;
	bh=ypWK0g/41W5KkprWUyENDwgY5QquaWvNznN8V8Z0lDY=;
	h=From:To:Cc:Subject:Date:In-Reply-To:References:From;
	b=XfOwzWy0s5/12AL98kDmNvmA2KUCykii1F7//Q+DT9nCVowFTmwIiSEhGs71YZQHd
	 4F92OnOm8DH5FIgJzhQCpYl/mwRuLZhEdQ4bJiu3UYGsn4rmd548lI4K4xWjksl1sD
	 sEyVexipxn6km+85FrEle9ZTGKN56Vsq7Yx8F/bzTWjVUbKZaJehUA1nu+qh3PcTtR
	 4l6EfQr557wgRHLueXUjxr8ZarItvFj6UM5CQMPdHYn+7zXp1hMuKhTGShOMGWEGgz
	 TyQ/f8TdS9+scujGmDHOQjW9ew5tkE8aviuD2/ojtEk8KyKkKE0Xp6RrYlWJezIfOT
	 ppvUwI9zbZkSQ==
From: Geliang Tang <geliang@kernel.org>
To: mptcp@lists.linux.dev
Cc: Geliang Tang <tanggeliang@kylinos.cn>
Subject: [PATCH mptcp-next v4 9/9] mptcp: pm: add allow_new_subflow()
 interface
Date: Mon, 24 Mar 2025 16:19:43 +0800
Message-ID: 
 <cd3f073e7d78588fa5ece014ff4f929946223aa8.1742804266.git.tanggeliang@kylinos.cn>
X-Mailer: git-send-email 2.43.0
In-Reply-To: <cover.1742804266.git.tanggeliang@kylinos.cn>
References: <cover.1742804266.git.tanggeliang@kylinos.cn>
Precedence: bulk
X-Mailing-List: mptcp@lists.linux.dev
List-Id: <mptcp.lists.linux.dev>
List-Subscribe: <mailto:mptcp+subscribe@lists.linux.dev>
List-Unsubscribe: <mailto:mptcp+unsubscribe@lists.linux.dev>
MIME-Version: 1.0
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset="utf-8"

From: Geliang Tang <tanggeliang@kylinos.cn>

The helper mptcp_pm_is_userspace() is used to distinguish userspace PM
operations from in-kernel PM in mptcp_pm_allow_new_subflow(). It seems
reasonable to add a mandatory .allow_new_subflow interface for struct
mptcp_pm_ops.

Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
---
 include/net/mptcp.h   |  3 +++
 net/mptcp/pm.c        | 13 ++-----------
 net/mptcp/pm_kernel.c | 21 +++++++++++++++++++++
 3 files changed, 26 insertions(+), 11 deletions(-)

diff --git a/include/net/mptcp.h b/include/net/mptcp.h
index 8c1ac7368693..aedabc7f4190 100644
--- a/include/net/mptcp.h
+++ b/include/net/mptcp.h
@@ -135,6 +135,9 @@ struct mptcp_pm_ops {
 			      const struct mptcp_addr_info *addr);
 	bool (*accept_new_subflow)(const struct mptcp_sock *msk);
=20
+	/* optional */
+	bool (*allow_new_subflow)(struct mptcp_sock *msk);
+
 	char			name[MPTCP_PM_NAME_MAX];
 	struct module		*owner;
 	struct list_head	list;
diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c
index ca105bbd03ea..215b3a4d24be 100644
--- a/net/mptcp/pm.c
+++ b/net/mptcp/pm.c
@@ -453,23 +453,14 @@ void mptcp_pm_new_connection(struct mptcp_sock *msk, =
const struct sock *ssk, int
 bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk)
 {
 	struct mptcp_pm_data *pm =3D &msk->pm;
-	unsigned int subflows_max;
 	bool ret =3D true;
=20
 	if (!pm->ops->accept_new_subflow(msk))
 		return false;
=20
 	spin_lock_bh(&pm->lock);
-	if (!mptcp_pm_is_userspace(msk) && READ_ONCE(pm->accept_subflow)) {
-		subflows_max =3D mptcp_pm_get_subflows_max(msk);
-
-		pr_debug("msk=3D%p subflows=3D%d max=3D%d allow=3D%d\n", msk, pm->subflo=
ws,
-			 subflows_max, READ_ONCE(pm->accept_subflow));
-
-		ret =3D pm->subflows < subflows_max;
-		if (ret && pm->subflows =3D=3D subflows_max - 1)
-			WRITE_ONCE(pm->accept_subflow, false);
-	}
+	if (pm->ops->allow_new_subflow)
+		ret =3D pm->ops->allow_new_subflow(msk);
 	if (ret)
 		pm->subflows++;
 	spin_unlock_bh(&pm->lock);
diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c
index 7ec8fafeda0e..5ae64392a316 100644
--- a/net/mptcp/pm_kernel.c
+++ b/net/mptcp/pm_kernel.c
@@ -1409,6 +1409,26 @@ static bool mptcp_pm_kernel_accept_new_subflow(const=
 struct mptcp_sock *msk)
 	return READ_ONCE(msk->pm.accept_subflow);
 }
=20
+static bool mptcp_pm_kernel_allow_new_subflow(struct mptcp_sock *msk)
+{
+	struct mptcp_pm_data *pm =3D &msk->pm;
+	unsigned int subflows_max;
+	bool ret =3D false;
+
+	subflows_max =3D mptcp_pm_get_subflows_max(msk);
+
+	pr_debug("msk=3D%p subflows=3D%d max=3D%d allow=3D%d\n", msk, pm->subflow=
s,
+		 subflows_max, READ_ONCE(pm->accept_subflow));
+
+	if (READ_ONCE(pm->accept_subflow)) {
+		ret =3D pm->subflows < subflows_max;
+		if (ret && pm->subflows =3D=3D subflows_max - 1)
+			WRITE_ONCE(pm->accept_subflow, false);
+	}
+
+	return ret;
+}
+
 static void mptcp_pm_kernel_init(struct mptcp_sock *msk)
 {
 	bool subflows_allowed =3D !!mptcp_pm_get_subflows_max(msk);
@@ -1438,6 +1458,7 @@ struct mptcp_pm_ops mptcp_pm_kernel =3D {
 	.rm_addr_received	=3D mptcp_pm_kernel_rm_addr_received,
 	.add_addr_echo		=3D mptcp_pm_kernel_add_addr_echo,
 	.accept_new_subflow	=3D mptcp_pm_kernel_accept_new_subflow,
+	.allow_new_subflow	=3D mptcp_pm_kernel_allow_new_subflow,
 	.init			=3D mptcp_pm_kernel_init,
 	.name			=3D "kernel",
 	.owner			=3D THIS_MODULE,
--=20
2.43.0