From nobody Sun Feb 8 08:52:09 2026 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 4B0F11C84C5 for ; Tue, 6 May 2025 08:55:33 +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=1746521736; cv=none; b=scYpvf7ZzFp54S9rOHtBBp1J9EPaQYvSFUjkvWq4OgfymEN5jWHe/VV0sMTZNKcsD2CmjN9k9equ3YaduOngQtrnxicHFM9XKaNxGIDMpIS+3iuQTD7BMs3nwAg8vhmo6gvX85fBUE0Gszqwgodv8Iyiz/uu9D5ok6ShJ+AzZzY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746521736; c=relaxed/simple; bh=Qo1a5Xd+hREOGdBrgNJy6XK7vsGEq6SLq1fYGi9vTTE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=C+eZhPP5FY+laccmnv8SFNnl+1ZvUQsPANsa0fT6gXqSwcH4cYIpQ46vtkS+pg9Fg39F039XcX+hKsddLxIM6yNP7DlRubu5Ja5otyqecMyhn2uizIY7/JxnTyEdrxEttKyQRQ4sgcsIJjtARrosdrCUNNpzndOb148rWlx4lZI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=k1Vu5R2o; 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="k1Vu5R2o" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 88D8EC4CEE4; Tue, 6 May 2025 08:55:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746521733; bh=Qo1a5Xd+hREOGdBrgNJy6XK7vsGEq6SLq1fYGi9vTTE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=k1Vu5R2oOrf7iIPJs7Fef/RHBiV9UjC8PvP4WQ4uxuhQiusz7yPgbweSxTqDn75mb Es52cwpyRUyJ2yr66qbL79doW9swEr+HSJnMlT94ExERAp4NXCJynvAeWV2iLEpJ7g 72o5Rzz1zF8tomjyQyFlKlcXE4/pJ93LqN+jeUYa+2IFIxV/oklFx+sp6n9uGvF0MY bYnbGooO3snAV7iFuUjtA1eftQp+nU6dAiWlDJci/pOxa4hwGj1y/Jg8ePdL9LsPZw man3R8G1DymlqdYRo+2BPv5jOycwZcDfX08844TPte+y4P9Q9OeSRNwDZIrrdSMuOC i4Ze9isGPcl0A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 1/5] mptcp: pm: call pm worker handler without pm lock Date: Tue, 6 May 2025 16:55:22 +0800 Message-ID: <9bc0479546c550c4ec7a9e000e6a19a8d74939ac.1746521233.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang Later functions that cannot hold the mptcp pm lock will be called from the PM worker, so this patch modifies the order of holding the lock at the beginning of this function and releasing the lock at the end. The new order is to obtain a copy of pm->status and clear the flags of pm->status while holding the mptcp pm lock, then read the copy after releasing the lock. For each PM status flag, call each handling function without locks. Finally, hold the lock before calling __mptcp_pm_kernel_worker() and release it afterwards. Signed-off-by: Geliang Tang --- net/mptcp/pm.c | 21 ++++++++++++++------- net/mptcp/pm_kernel.c | 16 ++++------------ net/mptcp/protocol.h | 2 +- 3 files changed, 19 insertions(+), 20 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index dfca70d361e1..448ac6c42880 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -946,24 +946,31 @@ void mptcp_pm_subflow_chk_stale(const struct mptcp_so= ck *msk, struct sock *ssk) void mptcp_pm_worker(struct mptcp_sock *msk) { struct mptcp_pm_data *pm =3D &msk->pm; + u8 status; =20 msk_owned_by_me(msk); =20 if (!(pm->status & MPTCP_PM_WORK_MASK)) return; =20 - spin_lock_bh(&msk->pm.lock); + spin_lock_bh(&pm->lock); + status =3D pm->status; + pm->status &=3D ~MPTCP_PM_WORK_MASK; + spin_unlock_bh(&pm->lock); =20 - pr_debug("msk=3D%p status=3D%x\n", msk, pm->status); - if (pm->status & BIT(MPTCP_PM_ADD_ADDR_SEND_ACK)) { - pm->status &=3D ~BIT(MPTCP_PM_ADD_ADDR_SEND_ACK); + pr_debug("msk=3D%p status=3D%x\n", msk, status); + if (status & BIT(MPTCP_PM_ADD_ADDR_SEND_ACK)) { + spin_lock_bh(&pm->lock); mptcp_pm_addr_send_ack(msk); + spin_unlock_bh(&pm->lock); } - if (pm->status & BIT(MPTCP_PM_RM_ADDR_RECEIVED)) { - pm->status &=3D ~BIT(MPTCP_PM_RM_ADDR_RECEIVED); + if (status & BIT(MPTCP_PM_RM_ADDR_RECEIVED)) { + spin_lock_bh(&pm->lock); mptcp_pm_rm_addr_recv(msk); + spin_unlock_bh(&pm->lock); } - __mptcp_pm_kernel_worker(msk); + spin_lock_bh(&msk->pm.lock); + __mptcp_pm_kernel_worker(msk, status); =20 spin_unlock_bh(&msk->pm.lock); } diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 7ec81d5195d4..61b457a6b7a8 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1340,22 +1340,14 @@ bool mptcp_pm_nl_check_work_pending(struct mptcp_so= ck *msk) } =20 /* Called under PM lock */ -void __mptcp_pm_kernel_worker(struct mptcp_sock *msk) +void __mptcp_pm_kernel_worker(struct mptcp_sock *msk, u8 status) { - 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); + if (status & 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); + if (status & 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); + if (status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) mptcp_pm_nl_subflow_established(msk); - } } =20 static int __net_init pm_nl_init_net(struct net *net) diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 91aaed17fe56..b2ee751ce4c9 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1165,7 +1165,7 @@ 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); +void __mptcp_pm_kernel_worker(struct mptcp_sock *msk, u8 status); 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 Sun Feb 8 08:52:09 2026 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 7F8AE21B9E1 for ; Tue, 6 May 2025 08:55:35 +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=1746521735; cv=none; b=s/dYr3r7o1p2Zw5ySwVXytHFvH4FRNaG8gnfK/aO68cvQ9ETNvZ3yr/vgyNu23N00Ohe9KcvfQhcA/pa7rx+soS4AIphzDeVMK47kN9n88w0D+8nLGZYnPpbh0zzQQogitrX3QNtMoGCeES4QyvuNMVN0ZNxKogsqBEfjzzXALQ= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746521735; c=relaxed/simple; bh=aohSAAx++SR7aJC5DnKRcFR7m6KlhJnbrv8dtMgVw5o=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=NH+da3ZxzqHKCHdZioQOGX1sqTvgCJ5KSC+cTQnSLiwviRsHnEAPGz+3zyCeJ1hx3mxW57bBRgqZHANZay31TzOXLTJO0ztZJye5cN80lyvzPZ/lLFiVxtyuuTu53q6b51I/bLQGiF91ALiI4Vil7N/GLfhM5pvFweSXuEKjvQQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=DeVJ9BT7; 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="DeVJ9BT7" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 53F05C4CEED; Tue, 6 May 2025 08:55:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746521735; bh=aohSAAx++SR7aJC5DnKRcFR7m6KlhJnbrv8dtMgVw5o=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=DeVJ9BT7EgmHGa6I7KGXDlXSIjXSlvDGT3j8FznE9dunbtGJKCNcE8AsgJbhXM+ez 1yNpnLco2EFV0ezgL2t/R20VgNw//Mf8vZaFPQ2sbpYWehIregB0rzvXIinje4J528 Ae93FBWRZK4cMZVlYW41zY/UeGcy8GovGS0GRQgeGq9NvrhW4ZWeA7vt03ygEFHyj1 KwB4ctpl7mS8Zmg+soq+VGm2zVkt/3dBTw4/Caukordx06OD/JhdPkgC4xh1rXqiGt jQspT3YzrTv6A2LgV8qtDKUhNxeucWlUACs3Xx5rAvMFD1hcyNX471PgnnThkbPxUo 01MZ2lo1rQu+A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 2/5] mptcp: pm: add accept_new_subflow() interface Date: Tue, 6 May 2025 16:55:23 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang 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. The boolean type 'allow' parameter is used to control whether to allow new subflow unconditionally. A new helper mptcp_pm_accept_new_subflow() is added in pm.c to ensure that pm->ops is only used in pm.c. This interface of the in-kernel PM is implemented as a wrapper of READ_ONCE(pm->accept_subflow), and this interface of the userspace PM is implemented as a wrapper of mptcp_userspace_pm_active(). To reduce the dependency on mptcp_pm_is_userspace() to identify userspace PM from in-kernel PM by using mptcp_pm_accept_new_subflow() helper in mptcp_pm_allow_new_subflow(). Signed-off-by: Geliang Tang --- include/net/mptcp.h | 1 + net/mptcp/pm.c | 38 +++++++++++++------------------------- net/mptcp/pm_kernel.c | 16 ++++++++++++++++ net/mptcp/pm_userspace.c | 7 +++++++ net/mptcp/protocol.h | 25 +++++++++++++++++++++++++ net/mptcp/subflow.c | 6 ++---- 6 files changed, 64 insertions(+), 29 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 4cf59e83c1c5..549b8075cc86 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -123,6 +123,7 @@ struct mptcp_pm_ops { struct mptcp_pm_addr_entry *skc); bool (*get_priority)(struct mptcp_sock *msk, struct mptcp_addr_info *skc); + bool (*accept_new_subflow)(struct mptcp_sock *msk, bool allow); =20 char name[MPTCP_PM_NAME_MAX]; struct module *owner; diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 448ac6c42880..1abe3a3a86f2 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -453,38 +453,25 @@ void mptcp_pm_new_connection(struct mptcp_sock *msk, = const struct sock *ssk, int mptcp_event(MPTCP_EVENT_CREATED, msk, ssk, GFP_ATOMIC); } =20 +bool mptcp_pm_accept_new_subflow(struct mptcp_sock *msk, bool allow) +{ + return msk->pm.ops->accept_new_subflow(msk, allow); +} + bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk) { struct mptcp_pm_data *pm =3D &msk->pm; - unsigned int subflows_max; int ret =3D 0; =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; - } - return 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)); - - /* try to avoid acquiring the lock below */ - if (!READ_ONCE(pm->accept_subflow)) + if (!mptcp_pm_accept_new_subflow(msk, true)) return false; =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) - WRITE_ONCE(pm->accept_subflow, false); + ret =3D mptcp_pm_accept_new_subflow(msk, false); + if (ret) { + spin_lock_bh(&pm->lock); + pm->subflows++; + spin_unlock_bh(&pm->lock); } - spin_unlock_bh(&pm->lock); =20 return ret; } @@ -1057,7 +1044,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->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 61b457a6b7a8..a1c5dabb6e56 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1391,6 +1391,21 @@ static struct pernet_operations mptcp_pm_pernet_ops = =3D { .size =3D sizeof(struct pm_nl_pernet), }; =20 +static bool mptcp_pm_kernel_accept_new_subflow(struct mptcp_sock *msk, + bool allow) +{ + bool ret =3D false; + + if (READ_ONCE(msk->pm.accept_subflow)) { + if (allow) + return true; + + ret =3D mptcp_pm_accept_subflow(msk); + } + + return ret; +} + static void mptcp_pm_kernel_init(struct mptcp_sock *msk) { bool subflows_allowed =3D !!mptcp_pm_get_subflows_max(msk); @@ -1414,6 +1429,7 @@ 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, + .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 1911fe1799fa..5e259cef8975 100644 --- a/net/mptcp/pm_userspace.c +++ b/net/mptcp/pm_userspace.c @@ -687,6 +687,12 @@ int mptcp_userspace_pm_get_addr(u8 id, struct mptcp_pm= _addr_entry *addr, return ret; } =20 +static bool mptcp_pm_userspace_accept_new_subflow(struct mptcp_sock *msk, + bool allow) +{ + return mptcp_userspace_pm_active(msk); +} + static void mptcp_pm_userspace_release(struct mptcp_sock *msk) { mptcp_userspace_pm_free_local_addr_list(msk); @@ -695,6 +701,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, + .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/protocol.h b/net/mptcp/protocol.h index b2ee751ce4c9..d006ef042a15 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1009,6 +1009,7 @@ bool mptcp_pm_addr_families_match(const struct sock *= sk, void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock = *ssk); void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ss= k, int server_side); void mptcp_pm_fully_established(struct mptcp_sock *msk, const struct sock = *ssk); +bool mptcp_pm_accept_new_subflow(struct mptcp_sock *msk, bool allow); bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk); void mptcp_pm_connection_closed(struct mptcp_sock *msk); void mptcp_pm_subflow_established(struct mptcp_sock *msk); @@ -1185,6 +1186,30 @@ static inline void mptcp_pm_close_subflow(struct mpt= cp_sock *msk) spin_unlock_bh(&msk->pm.lock); } =20 +static inline bool __mptcp_pm_accept_subflow(struct mptcp_sock *msk) +{ + unsigned int subflows_max =3D mptcp_pm_get_subflows_max(msk); + struct mptcp_pm_data *pm =3D &msk->pm; + bool ret; + + ret =3D pm->subflows < subflows_max; + if (ret && pm->subflows + 1 =3D=3D subflows_max) + WRITE_ONCE(pm->accept_subflow, false); + + return ret; +} + +static inline bool mptcp_pm_accept_subflow(struct mptcp_sock *msk) +{ + bool ret; + + spin_lock_bh(&msk->pm.lock); + ret =3D __mptcp_pm_accept_subflow(msk); + spin_unlock_bh(&msk->pm.lock); + + return ret; +} + void mptcp_sockopt_sync_locked(struct mptcp_sock *msk, struct sock *ssk); =20 static inline struct mptcp_ext *mptcp_get_ext(const struct sk_buff *skb) diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 15613d691bfe..c842684eb85a 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -58,12 +58,10 @@ static void subflow_generate_hmac(u64 key1, u64 key2, u= 32 nonce1, u32 nonce2, mptcp_crypto_hmac_sha(key1, key2, msg, 8, hmac); } =20 -static bool mptcp_can_accept_new_subflow(const struct mptcp_sock *msk) +static bool mptcp_can_accept_new_subflow(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)); + mptcp_pm_accept_new_subflow(msk, true); } =20 /* validate received token and create truncated hmac and nonce for SYN-ACK= */ --=20 2.43.0 From nobody Sun Feb 8 08:52:09 2026 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 B63A2264A7C for ; Tue, 6 May 2025 08:55:37 +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=1746521737; cv=none; b=uzhYd7nNWes5jAN+00BMXUp3bDzA/tokrva77TzeaKpOFsm3IGUM5UKJyA7fK4ceVwUSTKyCGv/dYik7O7MTp25Z33hM0K+jTTA/neBrt6Jcmc5y9aQVY5sk12L3tLMuWZ9cnUwmMlBx3pN+S+rQxDmg8L8Saiu+QflFCsTLS7I= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746521737; c=relaxed/simple; bh=w0qiJ10IGQHqO6YKC0Go7J6o9D1hT81Jssm9Q7Q8HD8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=m5JnF0M2BMqRAA3apyOoOVbd33LLs6nJEA5ck5zWCwXkWGJ7K75zYHrHnNu5J4UBh/safqfdck9jsFJB7OO+33B54YC3bbu8y6x/olrLXB+ltsccFo6iMMvzzJirwSv7oNZVaeLkTlTy3MXWxZGzfsKxz8cquTDFu/tQ9HgzS20= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Ss18NGy6; 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="Ss18NGy6" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 0A236C4CEF0; Tue, 6 May 2025 08:55:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746521737; bh=w0qiJ10IGQHqO6YKC0Go7J6o9D1hT81Jssm9Q7Q8HD8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Ss18NGy6Rkdt3xIgDrsaS/I2bruVyzFnaSUKmo4mdAR1O6jS2jPyzd3FKO+jdeQMx KzrrahZESJ6Toj4TERgpsFVuU7Za7r8AdSxiFgtwyyKKKg6sPeV4wTIzPMWnVYyPR/ jVnTdWVJQsMowg5qohprLp49d/MWnGAYu8Zd8tzo7u0qo0rF0bL5yQ+NUO2sDEQSxp GHog5aYft/cPYvlTjeBS2BPTDb6YgRuuwYmJk9Y+X29dNXH7z1odGS7W6K67DPuv6z RV+H9gA+by40v1FLJ1/qmXVZOVVp2HqmqMsNNVq1gFibHSQ+xLv6lnR0ysyURCT+EI wPYAFoS9i3m6A== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 3/5] mptcp: pm: add established() interface Date: Tue, 6 May 2025 16:55:24 +0800 Message-ID: <3f7f9167519e283a638f43fee0d5b72a1c18b893.1746521233.git.tanggeliang@kylinos.cn> X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang This patch adds a .established interface for struct mptcp_pm_ops, and calls pm->ops->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() interface 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(). Signed-off-by: Geliang Tang --- include/net/mptcp.h | 3 +++ net/mptcp/pm.c | 5 ++++- net/mptcp/pm_kernel.c | 7 ++++--- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 549b8075cc86..97a237c9bfe0 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -125,6 +125,9 @@ struct mptcp_pm_ops { struct mptcp_addr_info *skc); bool (*accept_new_subflow)(struct mptcp_sock *msk, bool allow); =20 + /* optional, call from the msk context */ + void (*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 1abe3a3a86f2..cf2d5918b6ba 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -506,7 +506,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) @@ -956,6 +957,8 @@ void mptcp_pm_worker(struct mptcp_sock *msk) mptcp_pm_rm_addr_recv(msk); spin_unlock_bh(&pm->lock); } + if (status & BIT(MPTCP_PM_ESTABLISHED)) + pm->ops->established(msk); spin_lock_bh(&msk->pm.lock); __mptcp_pm_kernel_worker(msk, status); =20 diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index a1c5dabb6e56..45a4ae1852ff 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -367,9 +367,11 @@ static void mptcp_pm_create_subflow_or_signal_addr(str= uct mptcp_sock *msk) mptcp_pm_nl_check_work_pending(msk); } =20 -static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) +static void mptcp_pm_kernel_established(struct mptcp_sock *msk) { + spin_lock_bh(&msk->pm.lock); mptcp_pm_create_subflow_or_signal_addr(msk); + spin_unlock_bh(&msk->pm.lock); } =20 static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk) @@ -1344,8 +1346,6 @@ void __mptcp_pm_kernel_worker(struct mptcp_sock *msk,= u8 status) { if (status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED)) mptcp_pm_nl_add_addr_received(msk); - if (status & BIT(MPTCP_PM_ESTABLISHED)) - mptcp_pm_nl_fully_established(msk); if (status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) mptcp_pm_nl_subflow_established(msk); } @@ -1430,6 +1430,7 @@ 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, .accept_new_subflow =3D mptcp_pm_kernel_accept_new_subflow, + .established =3D mptcp_pm_kernel_established, .init =3D mptcp_pm_kernel_init, .name =3D "kernel", .owner =3D THIS_MODULE, --=20 2.43.0 From nobody Sun Feb 8 08:52:09 2026 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 1013A26562A for ; Tue, 6 May 2025 08:55:39 +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=1746521739; cv=none; b=J4cQZamkbkVTuyRofVurhEz04/KK3bOyxM3j8X2i1FQwco0wvcjR7bbai64RYOS8xdmnCJfiPrUIyMCo3dzm22bvTGpwrjT58magiIpsBWRRGojokfegZSubFBwoys6HriWgcN2E6UoiBx0i6GW7NrpXO3hACgdvTkD87HTVaBI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746521739; c=relaxed/simple; bh=mwJp8zwsoUmbjfUj6wSiW2q6wZT2CCkw+s0NBs4ua8Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=Y+zvnSeGt10a6vGaVvXQi94RQP0X+52YHt3I701mImOcEtec9kE1ZuK7wpccFv4d7mpoY70nsHFoMr7owlSZRQqMEVsY3mRNus/ONwQHeL6kmh4IFU+Q4Es+eIxLh5vycYuNXKuEW1fcLvPLRLFAptNUY0IFK85ROPxXY/j4/o0= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=WqV9Prof; 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="WqV9Prof" Received: by smtp.kernel.org (Postfix) with ESMTPSA id D8A27C4CEED; Tue, 6 May 2025 08:55:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746521738; bh=mwJp8zwsoUmbjfUj6wSiW2q6wZT2CCkw+s0NBs4ua8Y=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=WqV9ProfozPPi27NQIykpUNxXEwNfRbGSYaThJyxEk6aPLb8anOtmGat1NAtMsgCi 1PTiBxcz5ZXKZZ0qfQcB2GosZ3dFtPRtmq9YGkxjP9Ek5KImkXuPe6E6LsaOjKlwec 5U/yXkOB6oN9UzCxkRVfhhzePdDeDRNj7LIBkRvO3vB4OulwzNbb099DOh3R64kgfy 3/yI5Vq/ChaVK/KLaZPWaEhWBjKX34A4nqsURkFw6EFOzlRBbNk65HTFytDCudxd6y FCpRE2kAQVWetF833/2AXPMW1NQUAts4A6PWR94bXI26J4MOCQ79Cn6HdUkhyslu9g HJOUdGZJwZ96Q== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 4/5] mptcp: pm: add subflow_established() interface Date: Tue, 6 May 2025 16:55:25 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang This patch adds a .subflow_established interface for struct mptcp_pm_ops, and calls pm->ops->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(), .subflow_established() interface 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_subflow_established(). Signed-off-by: Geliang Tang --- include/net/mptcp.h | 1 + net/mptcp/pm.c | 9 ++++++--- net/mptcp/pm_kernel.c | 7 ++++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 97a237c9bfe0..1eae68c9e662 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -127,6 +127,7 @@ struct mptcp_pm_ops { =20 /* optional, call from the msk context */ void (*established)(struct mptcp_sock *msk); + void (*subflow_established)(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 cf2d5918b6ba..7d67789fd09d 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -534,7 +534,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); @@ -561,7 +561,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); @@ -619,7 +620,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); @@ -959,6 +960,8 @@ void mptcp_pm_worker(struct mptcp_sock *msk) } if (status & BIT(MPTCP_PM_ESTABLISHED)) pm->ops->established(msk); + if (status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) + pm->ops->subflow_established(msk); spin_lock_bh(&msk->pm.lock); __mptcp_pm_kernel_worker(msk, status); =20 diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 45a4ae1852ff..782642718429 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -374,9 +374,11 @@ static void mptcp_pm_kernel_established(struct mptcp_s= ock *msk) spin_unlock_bh(&msk->pm.lock); } =20 -static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk) +static void mptcp_pm_kernel_subflow_established(struct mptcp_sock *msk) { + spin_lock_bh(&msk->pm.lock); mptcp_pm_create_subflow_or_signal_addr(msk); + spin_unlock_bh(&msk->pm.lock); } =20 /* Fill all the local addresses into the array addrs[], @@ -1346,8 +1348,6 @@ void __mptcp_pm_kernel_worker(struct mptcp_sock *msk,= u8 status) { if (status & BIT(MPTCP_PM_ADD_ADDR_RECEIVED)) mptcp_pm_nl_add_addr_received(msk); - if (status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) - mptcp_pm_nl_subflow_established(msk); } =20 static int __net_init pm_nl_init_net(struct net *net) @@ -1431,6 +1431,7 @@ struct mptcp_pm_ops mptcp_pm_kernel =3D { .get_priority =3D mptcp_pm_kernel_get_priority, .accept_new_subflow =3D mptcp_pm_kernel_accept_new_subflow, .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 Sun Feb 8 08:52:09 2026 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 37582262804 for ; Tue, 6 May 2025 08:55:40 +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=1746521741; cv=none; b=WYsUBJbP2keuSvNnlPl+PLnjn5pQCeTzRCGFz7SOMjZfhjx68Mcr7ZXh/Zjcdm3a0mJwKtESo0uwt5m4lMSZT6gHQBjCJVm52d8f0oToLxutqjatdvsAQ9Vtkv/gIj4ehki88pFd3Jr1qVmmsEfUmvUZZIE4iyrFioeDaAgw3H0= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1746521741; c=relaxed/simple; bh=IvC5k2k5C9gQfi4qxCchZ9B9XPj5fojm71qXmKfkc3U=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=iEkg0BptN/I/qZv9FsUcitqjdoIygiNkzf7Ytgj6QuU94kQtnZfzup+teS3WDfRdeIILpDXqH87wkwDzOCbGerrzWqhaot4j5zkcrJxLB4D/1wd67+Mf17OR1pDUKmgG5XRYmH0zarH/JAHoB49UwWG1nxjw2ZJ4xkhchWME/zY= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=P7T+S7UB; 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="P7T+S7UB" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 71A68C4CEF1; Tue, 6 May 2025 08:55:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1746521740; bh=IvC5k2k5C9gQfi4qxCchZ9B9XPj5fojm71qXmKfkc3U=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=P7T+S7UBj4kR0XGU79X2hYobz3keuGVumbXHiQnt6uW6VHz74zls0Kh6Tzl5B7T44 /nTbgAJGFmMi+pDiUGJFA0pEUwtnOj52znR4whvwqFPWZdCLlzDe58SKtUpgLly4mC /9XvMHNIo2A9vuuV+WDHeBykxNzY44e7QqETfowY5Y3t4JOj3vGllQzW+jxy3SLQBu VHDVmTN0pdMmeXcXTUAG4s4DNLvV0FfadIlpfmtMysS056OxHJNx2Ef6E6x/w8F3i6 cBXJ7z6533+rFeyP1zOxqWeNhxHKZrRalYGS19MAtpmrGOOnc6tW/bFoBkj1ZJnsBA rfj8oQWHJHSfw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v7 5/5] mptcp: pm: drop is_userspace in subflow_check_next Date: Tue, 6 May 2025 16:55:26 +0800 Message-ID: X-Mailer: git-send-email 2.43.0 In-Reply-To: References: Precedence: bulk X-Mailing-List: mptcp@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: Geliang Tang 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 --- net/mptcp/pm.c | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 7d67789fd09d..cfa1e0ebc87f 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -552,22 +552,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)) + !READ_ONCE(pm->work_pending)) 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