From patchwork Thu Mar 27 06:04:11 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14030796 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 834E5C8EB for ; Thu, 27 Mar 2025 06:04:32 +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=1743055472; cv=none; b=Wi8DkbQIP2JSIceUNDMeM02Vk+G+R/kUyNtbenO7AUjtNL+vXMmeN04RARvlBlOu7fY/btJOY3sAWvOFOTlHdQ3k2aXg/mc1BwFBc7Z0DFumA/PfaXHiozust6tCsBnSiyiymagOy51MJAxzRBDTvtX3kdZMNgfaRGAfB4+Luu8= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743055472; c=relaxed/simple; bh=YO3YlXqT0t10hlK2/gKcXPeMUu8Dfa5Dqy+7eYZtW/c=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=HLjVMWo541BLlAxrDW5tlnp/gQX79ZY9vAe3gfwbBZulk79vHSMqawjIlNLNVNOnE2n0NlxFopfvsDE4w5o1EQbzoV8bQ0zXkad3WazmBMKKUgOTx2UURtZT7IpO0Z8Pj/+rR/QJsDIq1i00nxrP19AeN4zR8LxW7CuZ9rdioBw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Hpcurtt9; 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="Hpcurtt9" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 45AE1C4CEE4; Thu, 27 Mar 2025 06:04:30 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743055472; bh=YO3YlXqT0t10hlK2/gKcXPeMUu8Dfa5Dqy+7eYZtW/c=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Hpcurtt9F4h3PrtTd6yLEyCxJvYoZapwMun6EATpjK80ZQ7+dn96FKwU/kZAnatgj V6pYdAUSIgt1Wm8ctfjbgeA91mqhGXdNG854qnXLWLuwOOWhR0//KfJ196Hlk2IkgB SjzbrkZ/m8XLyItAqn/l4I3ID2w7X9cHKJMczZBHwsa/8JJt4i0iygnsmrAl9I7+SS YxT+jvwRd7gZi5+8tsxgxWDIi2P5cgMrLv2MT7sXpbTvDznI+3iJp+TUPsUlPQh2DP +1TYNm7E6RLxTav+HsMMxr1cTTjHzXVFQcY9YSoVkg7DvzhsuuVJuZcn3AR+Smoa7a Qpz+2st4UmY3g== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v5 1/7] Squash to "mptcp: pm: add get_local_id() interface" Date: Thu, 27 Mar 2025 14:04:11 +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 From: Geliang Tang Update the comment for get_local_id and get_priority. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/net/mptcp.h b/include/net/mptcp.h index 9f28ef550e10..4cf59e83c1c5 100644 --- a/include/net/mptcp.h +++ b/include/net/mptcp.h @@ -118,7 +118,7 @@ struct mptcp_sched_ops { #define MPTCP_PM_BUF_MAX (MPTCP_PM_NAME_MAX * MPTCP_PM_MAX) struct mptcp_pm_ops { - /* required */ + /* required, call from the subflow context */ int (*get_local_id)(struct mptcp_sock *msk, struct mptcp_pm_addr_entry *skc); bool (*get_priority)(struct mptcp_sock *msk, From patchwork Thu Mar 27 06:04:12 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14030797 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 A27C9C8EB for ; Thu, 27 Mar 2025 06:04:34 +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=1743055474; cv=none; b=WkDq+3d+VEjj4M2pNOnovcIk6o6Gz+0mi16FZo324sFpqCZUw1pLJM+/qi+X6WqxfGDByjbUlWJJ4fvF/vrw5Iet0m9pK1+Bv6mWgJPebODeIy+IUxsSVYb6Q6nPK6KP1pdf88ioR964/R7ZesVNQSPusJ4mwCkrlwwIGZF7Pkc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743055474; c=relaxed/simple; bh=1k/huxBnM1D/03P0mcln7JXj/UhUtsveeAbMIKCgPq8=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=oHHGTnFpGdgjatGK1MCgCZbpHHJJrP887g5LmDiieUvvdaDqA3cICRo3S+ME+DQqVgfAMw1kWcI/Ruc8hONzJ6IffezT82+hqt/hmMxUBLILyo+KxNi+B0NA+3bHBWM1j+YMwbzZKloitkhP039TrJpNLCFEYiga9+6O241Y0Y4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=T6XdoBY+; 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="T6XdoBY+" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 07376C4CEEB; Thu, 27 Mar 2025 06:04:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743055474; bh=1k/huxBnM1D/03P0mcln7JXj/UhUtsveeAbMIKCgPq8=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=T6XdoBY+xpld9HfqsGkw1Mdy704Pl3IekOo5NATwxH0CwQlDXgq3JPfGivFfIG6Vy 8uw1qPoxenUB5ZN/JKVZ6cxSUa6VNC95OUAOJKMgLRBqlSu81aJ21T7lPyapkgnzvS BikZzT+WTVGCHBI+rf85sKo0Ku5QRZjTduJMAUoY9+K/DxEfE00l3UJb8Wv3deEpwM NT2MqzE1Qka1hm09P6yelN6avgHA/eBA9U8KmPgnZM/G6WhoJ6+Y/9Kx8jC8oIxaps 0M1hCWh7DoMl3IICil5LyepSkp7kQuSNJEmXpC8EORtSmv4BGQ/59/woMrj8P24Mys elIGkgB6T4t8w== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v5 2/7] mptcp: pm: add accept_new_subflow() interface Date: Thu, 27 Mar 2025 14:04:12 +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 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(). Signed-off-by: Geliang Tang --- include/net/mptcp.h | 1 + net/mptcp/pm.c | 8 +++++++- net/mptcp/pm_kernel.c | 15 +++++++++++++++ net/mptcp/pm_userspace.c | 7 +++++++ net/mptcp/protocol.h | 1 + net/mptcp/subflow.c | 6 ++---- 6 files changed, 33 insertions(+), 5 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); char name[MPTCP_PM_NAME_MAX]; struct module *owner; diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index be1e27ee393e..1c8395d3baa9 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -453,6 +453,11 @@ void mptcp_pm_new_connection(struct mptcp_sock *msk, const struct sock *ssk, int mptcp_event(MPTCP_EVENT_CREATED, msk, ssk, GFP_ATOMIC); } +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 = &msk->pm; @@ -1050,7 +1055,8 @@ 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) { + 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 7ec81d5195d4..ee3915d33e04 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1399,6 +1399,20 @@ static struct pernet_operations mptcp_pm_pernet_ops = { .size = sizeof(struct pm_nl_pernet), }; +static bool mptcp_pm_kernel_accept_new_subflow(struct mptcp_sock *msk, + bool allow) +{ + struct mptcp_pm_data *pm = &msk->pm; + bool ret = false; + + if (READ_ONCE(pm->accept_subflow)) { + if (allow) + return true; + } + + return ret; +} + static void mptcp_pm_kernel_init(struct mptcp_sock *msk) { bool subflows_allowed = !!mptcp_pm_get_subflows_max(msk); @@ -1422,6 +1436,7 @@ static void mptcp_pm_kernel_init(struct mptcp_sock *msk) struct mptcp_pm_ops mptcp_pm_kernel = { .get_local_id = mptcp_pm_kernel_get_local_id, .get_priority = mptcp_pm_kernel_get_priority, + .accept_new_subflow = mptcp_pm_kernel_accept_new_subflow, .init = mptcp_pm_kernel_init, .name = "kernel", .owner = THIS_MODULE, diff --git a/net/mptcp/pm_userspace.c b/net/mptcp/pm_userspace.c index 7fc19b844384..c6f67c5e2353 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; } +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); @@ -691,6 +697,7 @@ static void mptcp_pm_userspace_release(struct mptcp_sock *msk) static struct mptcp_pm_ops mptcp_pm_userspace = { .get_local_id = mptcp_pm_userspace_get_local_id, .get_priority = mptcp_pm_userspace_get_priority, + .accept_new_subflow = mptcp_pm_userspace_accept_new_subflow, .release = mptcp_pm_userspace_release, .name = "userspace", .owner = THIS_MODULE, diff --git a/net/mptcp/protocol.h b/net/mptcp/protocol.h index 64aa091cb685..6d1d57beb5d3 100644 --- a/net/mptcp/protocol.h +++ b/net/mptcp/protocol.h @@ -1008,6 +1008,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 *ssk, 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); diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c index 409bd415ef1d..b13a679bdf05 100644 --- a/net/mptcp/subflow.c +++ b/net/mptcp/subflow.c @@ -58,12 +58,10 @@ static void subflow_generate_hmac(u64 key1, u64 key2, u32 nonce1, u32 nonce2, mptcp_crypto_hmac_sha(key1, key2, msg, 8, hmac); } -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); } /* validate received token and create truncated hmac and nonce for SYN-ACK */ From patchwork Thu Mar 27 06:04:13 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14030798 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 6278CC8EB for ; Thu, 27 Mar 2025 06:04:36 +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=1743055476; cv=none; b=ttrLbZ1lJQeFIXazJr8iz5hTHOJS0kHWhjX72bNgJYe07xEbk3oaFIO2vGd0N47OkKh7ZDWVw382l9IvLjRbQKFkJxeSHbV0DE7vrUOlktHqVTFtDXGWGLr7HiwsNfcNLe/M5vaAnSYcn1q3ROgM4onfSDNsV6T3BfG8Wg++cnI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743055476; c=relaxed/simple; bh=DTNLKgHaD8BgM9ml80LClI3y5O/zlNbj5kofR4RnwNs=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=EkiOHjvgLTmR+KfJoudNfklhNmnRENjeEQ9MlkZ6/77R8rwRC6hBiGCu4o9knOzh43qqmNS9VrTGyWHqhYMtpnePV723QDLRlP9Eb5F0F4SnOOiBb5KRulgD6rNjZll2HpIj8aaNxuJj80chI8w7K29RV4HoCH/flEcp65S0ITA= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=Q/yhEZAV; 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="Q/yhEZAV" Received: by smtp.kernel.org (Postfix) with ESMTPSA id BB029C4CEDD; Thu, 27 Mar 2025 06:04:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743055475; bh=DTNLKgHaD8BgM9ml80LClI3y5O/zlNbj5kofR4RnwNs=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=Q/yhEZAVo4gwOHw2DyUu7x/URcfHFa0OAE5jzMQQo7hcMIjmHNuI6KDEKDoBfVxIR MVDstjVl2RXWiEwSaIQMmi08aHYB5Nti+CEl8avgWWe98Swgg9veeZPke9W/t5YR2d HmZvHSP3txj5roYtC7j/GRcDFi8nrpCWqT2ta6hLTuQufooGQ++jF0Zy8+GCQlt8Y+ jToKutPA+ctJ3XWe1MRauEfQt+j3u/eZBMvrlf6znkX9gX4+mIsh24p089ezsyhMX0 rfXlZnYCOOGEd80SARH+FCxIdHNa6YzfWnSVCps1F0v6SgcwHfdbM+lsEUHQU1z+W/ fYJXm8qtUwwQg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v5 3/7] mptcp: pm: use accept_new_subflow in allow_new_subflow Date: Thu, 27 Mar 2025 14:04:13 +0800 Message-ID: <4de819beea2e553b61718a3b4c9b6180979961e0.1743054942.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 From: Geliang Tang This patch reduces 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 --- net/mptcp/pm.c | 27 ++++----------------------- net/mptcp/pm_kernel.c | 10 ++++++++++ 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 1c8395d3baa9..c72d2fade555 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -461,34 +461,15 @@ bool mptcp_pm_accept_new_subflow(struct mptcp_sock *msk, bool allow) bool mptcp_pm_allow_new_subflow(struct mptcp_sock *msk) { struct mptcp_pm_data *pm = &msk->pm; - unsigned int subflows_max; int ret = 0; - 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 = mptcp_pm_get_subflows_max(msk); - - pr_debug("msk=%p subflows=%d max=%d allow=%d\n", msk, pm->subflows, - 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; spin_lock_bh(&pm->lock); - if (READ_ONCE(pm->accept_subflow)) { - ret = pm->subflows < subflows_max; - if (ret && ++pm->subflows == subflows_max) - WRITE_ONCE(pm->accept_subflow, false); - } + ret = mptcp_pm_accept_new_subflow(msk, false); + if (ret) + pm->subflows++; spin_unlock_bh(&pm->lock); return ret; diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index ee3915d33e04..5cc35ee122ff 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -1403,11 +1403,21 @@ static bool mptcp_pm_kernel_accept_new_subflow(struct mptcp_sock *msk, bool allow) { struct mptcp_pm_data *pm = &msk->pm; + unsigned int subflows_max; bool ret = false; + subflows_max = mptcp_pm_get_subflows_max(msk); + + pr_debug("msk=%p subflows=%d max=%d allow=%d\n", msk, pm->subflows, + subflows_max, READ_ONCE(pm->accept_subflow)); + if (READ_ONCE(pm->accept_subflow)) { if (allow) return true; + + ret = pm->subflows < subflows_max; + if (ret && pm->subflows == subflows_max - 1) + WRITE_ONCE(pm->accept_subflow, false); } return ret; From patchwork Thu Mar 27 06:04:14 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14030799 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 0E27D262BE for ; Thu, 27 Mar 2025 06:04: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=1743055478; cv=none; b=KNFhd4ZR1pKXVkGDdCAgCyegF6vV2l9nGYx15L2YpVRENON5xp5+qMfCqhqCSZFeEUSrxpBVo2iqlqPJW4OcaRWMsv8TLo95Cy6P2/H2c7IIPUq9diaeR3bqCh7JfexOAd1wPfM9TSyCt8rhawFH+3/ucYB2iQ84VMtMh0I7O90= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743055478; c=relaxed/simple; bh=RorNkz1jeuedwSxqvJwzMrrW6rysVDqoOC6Idp34ifE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=uzJwGzUvh98vHfFfQdWVWrtyGwzzZrQOueNJDLzgDnSS0+czH67PZM58aZkZsN45MLWUxUHfZ0Wu1mRDi8zX1NVgoSIDnuuROhJLjvSeh6I4Qi7804V3iGS2Sn+LqrUT4+rTMC6GwmS9G4qVfF5NZOZ/yD5edK0Lw1iMD6EGl7M= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=aJK9HgHD; 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="aJK9HgHD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 639EDC4CEE4; Thu, 27 Mar 2025 06:04:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743055477; bh=RorNkz1jeuedwSxqvJwzMrrW6rysVDqoOC6Idp34ifE=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=aJK9HgHDOKjCK2PX8yL1zk1a4O3OSGRoPVuPxwxslwxv/4RgexSjAaDaK32ybSsmw VlzqDTS9+u+UIP3/Tiw6c5dBe3KqE17qE2xBK6YNAtSDzq5HwkVQhk4E96HF6Vbuip dCcfaUgXWJqd1AwJRJmDVvNVTtkoG3hN7ingQ0cxMHR/i6SRdowxa4AzbMWoWpjr8q uEzFI1cQF2z2fqfSJW3GgMuLfHXlJkHVDmxuIb5uzZROsP3+1f//2i7D3QkUmsYT6o /Lcwksfd1qvk0EkZLBN2SsGi+PFRKs14BP6fBhXcLKPvRWfjovUU3gN9iC17go6aba JJY1AEVuHjPSw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v5 4/7] mptcp: pm: update pm lock order in mptcp_pm_worker Date: Thu, 27 Mar 2025 14:04:14 +0800 Message-ID: <739e3667698915fa690d08c751c1846bd9442df2.1743054942.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 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 while holding the mptcp pm lock, then read the copy after releasing the lock. For each PM status flag, hold the lock, clear this flag of pm->status, and then call each handling function before or after releasing the lock as needed. Finally, hold the lock before calling __mptcp_pm_kernel_worker() and release it afterwards. Signed-off-by: Geliang Tang --- net/mptcp/pm.c | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index c72d2fade555..1e681acaad7f 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -932,26 +932,33 @@ void mptcp_pm_subflow_chk_stale(const struct mptcp_sock *msk, struct sock *ssk) void mptcp_pm_worker(struct mptcp_sock *msk) { struct mptcp_pm_data *pm = &msk->pm; + u8 status; msk_owned_by_me(msk); if (!(pm->status & MPTCP_PM_WORK_MASK)) return; - spin_lock_bh(&msk->pm.lock); + spin_lock_bh(&pm->lock); + status = READ_ONCE(pm->status); + spin_unlock_bh(&pm->lock); - pr_debug("msk=%p status=%x\n", msk, pm->status); - if (pm->status & BIT(MPTCP_PM_ADD_ADDR_SEND_ACK)) { + pr_debug("msk=%p status=%x\n", msk, status); + if (status & BIT(MPTCP_PM_ADD_ADDR_SEND_ACK)) { + spin_lock_bh(&pm->lock); pm->status &= ~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)) { + if (status & BIT(MPTCP_PM_RM_ADDR_RECEIVED)) { + spin_lock_bh(&pm->lock); pm->status &= ~BIT(MPTCP_PM_RM_ADDR_RECEIVED); mptcp_pm_rm_addr_recv(msk); + spin_unlock_bh(&pm->lock); } + spin_lock_bh(&pm->lock); __mptcp_pm_kernel_worker(msk); - - spin_unlock_bh(&msk->pm.lock); + spin_unlock_bh(&pm->lock); } static void mptcp_pm_ops_init(struct mptcp_sock *msk, From patchwork Thu Mar 27 06:04:15 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14030800 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 B838A262BE for ; Thu, 27 Mar 2025 06:04: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=1743055479; cv=none; b=aUbNr6qLNcU5AsdHjkoezJl0rC3Zu7ikWGQu5/viZCqKyICqPvrLtKPbxFMmcgYGnARzi3uIujb3zGi6Elp/e7xUaXqyFoZNtSSC7y9+2RpAxGZTPWfPCFQ6ioTnGJ6RFEJm7KDdV1ACrDYaFMSPLQ9pmVQ2Vojk6g7ocx8/ZDY= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743055479; c=relaxed/simple; bh=9JQCLPrOL6SQGx6xaiGBbMJZWuKTLkU5AHZ3GHmIi9w=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=JCBbrELZsEPyEq1y0XhG0bUrPCfQ1HNOPmz3QEps9cRTtcqcXAxUSyqwjzrdGoj4rq/8r4J6OxulPIoGVRPhmEkW4AOwabeKqpxvrQWb0RkTPaPzJqxFoHxp0jWltO3aHabpmbgLulhPkx4JkRIzb4Uwl6Bsy6irXcjBG2uxpps= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=i2kim7dD; 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="i2kim7dD" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 2378AC4CEDD; Thu, 27 Mar 2025 06:04:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743055479; bh=9JQCLPrOL6SQGx6xaiGBbMJZWuKTLkU5AHZ3GHmIi9w=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=i2kim7dDLm+FP9Vzf1LpSb6RXqMx2eBD5ihm7pQskXu9TJPikpbDLl+QAsnsANIPu nl/PfWyk2kxD0VYWmj3irV+h6wBDdm6CBuh5QR6nx+snXd0/EEY8BUnVi4BGO9Rh4+ tWJWgq5CruYQh1/bHQmJ7FgX3liAVcY4Li6OslwGUjbJPnKKhjBtpFo6eADKASA/ud JBoQLeFTcoTL3RtOFJ8qyoFQnmCw3nsQ9CjcNiqB3wQAEnAaX9kYDbMhJBcGfrWEDA PzLfvMS1V7b1oTriCJiMKi0RoJtfjqGcyAOTtHo02c1ZCqnOG3yDyMfp6jRF3Zb/PI ZmJfMybCc/TKg== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v5 5/7] mptcp: pm: add established() interface Date: Thu, 27 Mar 2025 14:04:15 +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 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(). Add a helper to call mptcp_pm_create_subflow_or_signal_addr() while holding mptcp pm lock, and rename the original one with "__" prefix. Signed-off-by: Geliang Tang --- include/net/mptcp.h | 3 +++ net/mptcp/pm.c | 9 ++++++++- net/mptcp/pm_kernel.c | 22 +++++++++++++--------- 3 files changed, 24 insertions(+), 10 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); + /* 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 1e681acaad7f..8dcf61a77b7d 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -505,7 +505,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); if ((pm->status & BIT(MPTCP_PM_ALREADY_ESTABLISHED)) == 0) @@ -956,6 +957,12 @@ 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)) { + spin_lock_bh(&pm->lock); + pm->status &= ~BIT(MPTCP_PM_ESTABLISHED); + spin_unlock_bh(&pm->lock); + pm->ops->established(msk); + } spin_lock_bh(&pm->lock); __mptcp_pm_kernel_worker(msk); spin_unlock_bh(&pm->lock); diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 5cc35ee122ff..5444565c8cf2 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -253,7 +253,7 @@ __lookup_addr(struct pm_nl_pernet *pernet, const struct mptcp_addr_info *info) return NULL; } -static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) +static void __mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) { struct sock *sk = (struct sock *)msk; unsigned int add_addr_signal_max; @@ -367,14 +367,21 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) mptcp_pm_nl_check_work_pending(msk); } -static void mptcp_pm_nl_fully_established(struct mptcp_sock *msk) +static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk) +{ + spin_lock_bh(&msk->pm.lock); + __mptcp_pm_create_subflow_or_signal_addr(msk); + spin_unlock_bh(&msk->pm.lock); +} + +static void mptcp_pm_kernel_established(struct mptcp_sock *msk) { mptcp_pm_create_subflow_or_signal_addr(msk); } static void mptcp_pm_nl_subflow_established(struct mptcp_sock *msk) { - mptcp_pm_create_subflow_or_signal_addr(msk); + __mptcp_pm_create_subflow_or_signal_addr(msk); } /* Fill all the local addresses into the array addrs[], @@ -758,7 +765,7 @@ static int mptcp_nl_add_subflow_or_signal_addr(struct net *net, spin_lock_bh(&msk->pm.lock); if (mptcp_addresses_equal(addr, &mpc_addr, addr->port)) msk->mpc_endpoint_id = addr->id; - mptcp_pm_create_subflow_or_signal_addr(msk); + __mptcp_pm_create_subflow_or_signal_addr(msk); spin_unlock_bh(&msk->pm.lock); release_sock(sk); @@ -1243,7 +1250,7 @@ static void mptcp_pm_nl_fullmesh(struct mptcp_sock *msk, 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); + __mptcp_pm_create_subflow_or_signal_addr(msk); spin_unlock_bh(&msk->pm.lock); } @@ -1348,10 +1355,6 @@ void __mptcp_pm_kernel_worker(struct mptcp_sock *msk) pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED); mptcp_pm_nl_add_addr_received(msk); } - if (pm->status & BIT(MPTCP_PM_ESTABLISHED)) { - pm->status &= ~BIT(MPTCP_PM_ESTABLISHED); - mptcp_pm_nl_fully_established(msk); - } if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) { pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED); mptcp_pm_nl_subflow_established(msk); @@ -1447,6 +1450,7 @@ struct mptcp_pm_ops mptcp_pm_kernel = { .get_local_id = mptcp_pm_kernel_get_local_id, .get_priority = mptcp_pm_kernel_get_priority, .accept_new_subflow = mptcp_pm_kernel_accept_new_subflow, + .established = mptcp_pm_kernel_established, .init = mptcp_pm_kernel_init, .name = "kernel", .owner = THIS_MODULE, From patchwork Thu Mar 27 06:04:16 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14030801 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 B41E1C8EB for ; Thu, 27 Mar 2025 06:04: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=1743055480; cv=none; b=uuAagDifEQ7l0XxyCWsNTpdmB3/CY4klzKgBNyLktjgo0uKSvWqbr3m4fT4tZgcvxidhQ+M32Doo5PHq2sUUcyTKv0mmhbOqbmZD8aqrSI0si1s685/9fqZbbcD1TGDLuoCUHrKfb8KmalEGQ0m2ujlE8XqHdSRB+6uTT760PKw= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743055480; c=relaxed/simple; bh=PezlIydqHMyKTzPj0fB3iJjZXGhf6KD6xD9msyWxk4g=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=M3pEt11/r3S5a1k4JmtEHYLRWyaLCXTwmX/gnCzRQZnPNAmnKdOl6KGrCrLK35Wnt8ljThCh4njlBjuXr52ZSQq1HZZCKpFDimWTOOy01iL+7kjjbg+Bmn6eaYkwDV5WGkXoJh9bRyHc9p+L8EbWUo56niuOttmEEgH9cQzQrPw= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=ZG9MTSao; 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="ZG9MTSao" Received: by smtp.kernel.org (Postfix) with ESMTPSA id C69C3C4CEE4; Thu, 27 Mar 2025 06:04:39 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743055480; bh=PezlIydqHMyKTzPj0fB3iJjZXGhf6KD6xD9msyWxk4g=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=ZG9MTSaoDXJ15I3LthrucQaKoO1HRnsBMGEZhosdcVj9eD9kY+BT32ijOPDioeYq1 mY4mn37/AQzLUfS0qVG2kpbzftpdYi+59hlgGCbvmE1hRGnp5M5z9Swb3BAVkwQmrZ Z11fxoOJOVCRu0s0XtQveRRsVQWeFXekLgyqco91/nFA9DTf0l7Qs6CDJqFOh91JJK PbkTkAokOEokzc+isHYRWUeZqnW+zakKe/820q4ZiNlWe0yQWZckEZnLfzdAHz7OSh 2psBF1sOeUPz6ddl7DXypmq3NU3yLNSpo/CryYv/W2GLx+iq9xKZm6uH6O5iAL7JbH ppD8W95lazRZw== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v5 6/7] mptcp: pm: add subflow_established() interface Date: Thu, 27 Mar 2025 14:04:16 +0800 Message-ID: <5374c3b1640ce62ed454e5650ee166ae41134216.1743054942.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 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 | 13 ++++++++++--- net/mptcp/pm_kernel.c | 9 +++------ 3 files changed, 14 insertions(+), 9 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 { /* optional, call from the msk context */ void (*established)(struct mptcp_sock *msk); + void (*subflow_established)(struct mptcp_sock *msk); char name[MPTCP_PM_NAME_MAX]; struct module *owner; diff --git a/net/mptcp/pm.c b/net/mptcp/pm.c index 8dcf61a77b7d..39842f7786db 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -533,7 +533,7 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk) pr_debug("msk=%p\n", msk); - if (!READ_ONCE(pm->work_pending)) + if (!READ_ONCE(pm->work_pending) || !pm->ops->subflow_established) return; spin_lock_bh(&pm->lock); @@ -560,7 +560,8 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, return; } - if (!READ_ONCE(pm->work_pending) && !update_subflows) + if (!pm->ops->subflow_established || + (!READ_ONCE(pm->work_pending) && !update_subflows)) return; spin_lock_bh(&pm->lock); @@ -618,7 +619,7 @@ void mptcp_pm_add_addr_echoed(struct mptcp_sock *msk, pr_debug("msk=%p\n", msk); - if (!READ_ONCE(pm->work_pending)) + if (!READ_ONCE(pm->work_pending) || !pm->ops->subflow_established) return; spin_lock_bh(&pm->lock); @@ -963,6 +964,12 @@ void mptcp_pm_worker(struct mptcp_sock *msk) spin_unlock_bh(&pm->lock); pm->ops->established(msk); } + if (status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) { + spin_lock_bh(&pm->lock); + pm->status &= ~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(&pm->lock); diff --git a/net/mptcp/pm_kernel.c b/net/mptcp/pm_kernel.c index 5444565c8cf2..e37cee9d38d7 100644 --- a/net/mptcp/pm_kernel.c +++ b/net/mptcp/pm_kernel.c @@ -379,9 +379,9 @@ static void mptcp_pm_kernel_established(struct mptcp_sock *msk) mptcp_pm_create_subflow_or_signal_addr(msk); } -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); + mptcp_pm_create_subflow_or_signal_addr(msk); } /* Fill all the local addresses into the array addrs[], @@ -1355,10 +1355,6 @@ void __mptcp_pm_kernel_worker(struct mptcp_sock *msk) pm->status &= ~BIT(MPTCP_PM_ADD_ADDR_RECEIVED); mptcp_pm_nl_add_addr_received(msk); } - if (pm->status & BIT(MPTCP_PM_SUBFLOW_ESTABLISHED)) { - pm->status &= ~BIT(MPTCP_PM_SUBFLOW_ESTABLISHED); - mptcp_pm_nl_subflow_established(msk); - } } static int __net_init pm_nl_init_net(struct net *net) @@ -1451,6 +1447,7 @@ struct mptcp_pm_ops mptcp_pm_kernel = { .get_priority = mptcp_pm_kernel_get_priority, .accept_new_subflow = mptcp_pm_kernel_accept_new_subflow, .established = mptcp_pm_kernel_established, + .subflow_established = mptcp_pm_kernel_subflow_established, .init = mptcp_pm_kernel_init, .name = "kernel", .owner = THIS_MODULE, From patchwork Thu Mar 27 06:04:17 2025 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Geliang Tang X-Patchwork-Id: 14030802 X-Patchwork-Delegate: matthieu.baerts@tessares.net 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 5E6C6C8EB for ; Thu, 27 Mar 2025 06:04:42 +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=1743055483; cv=none; b=DHr9UsLfdubwgS1iiI44NCR3B1kcZwZrmK8rEWqJVlzcsCxgNjylwhsjPW8DHBukI3Y3FTo5aEkt4oBP9VIRPdlmS5pZwBXwdOZM1rytm1ZYruxB8U1i89WroZD7sTZeyaT27T6DKnw0iYKCI59giHKIw+TVjU8HM1dLHho9i0M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1743055483; c=relaxed/simple; bh=flxUMCaDQvsIeqU3OiohAQzS2lNpiMGYLE4TLlJZLaI=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=BPPnISexrmR9IVBul/EYA1maqV3fa384YVfudmukBQnQ5Z9GaRHb2vj9UxZ4B1F9EbVhglioAOlJ9yuIcAjbZZV2dQGBcuEjmoxnbN6BiBmKTTpSJg34qijX9YP5KsAuNFxKnyzc0BC4xLZ8Z4iRiVhbE19T46RYQDSIjIdaHeQ= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=kernel.org header.i=@kernel.org header.b=l7wl/Dzq; 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="l7wl/Dzq" Received: by smtp.kernel.org (Postfix) with ESMTPSA id 1D6A1C4CEDD; Thu, 27 Mar 2025 06:04:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1743055481; bh=flxUMCaDQvsIeqU3OiohAQzS2lNpiMGYLE4TLlJZLaI=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=l7wl/DzqPH7sduQh6DnFNus1YsaW65yUreYxDh9RISQzOpvWzV5VJV9oTQHwTUXkK FFAQFIC2Feia5TizjQsDTF32WJRRk8hqA7qElfymArNADLnO0kuUJSm05gKzGRobYR nOX2Qr6jz2jX8H+rxgQJvFann61MYMVl0IuJQUqNran3ogC66N0+Btsv+2B1s+IANB nAszqI8b2vhr2/p2X8GXP9GBiu81bLMO2Dnr03mcykxLFbu47pC+QJlWzli+L3GE0T noQi0zzpbq30eCALA45dTQe21OSxJM8AraxucFGaCZWeBm5hY2UCDs+YDwGBVTEoJR 0ADNxyyv49dEQ== From: Geliang Tang To: mptcp@lists.linux.dev Cc: Geliang Tang Subject: [PATCH mptcp-next v5 7/7] mptcp: pm: drop is_userspace in subflow_check_next Date: Thu, 27 Mar 2025 14:04:17 +0800 Message-ID: <50605945cc7a54b820b1a934b454b4a5fef031e1.1743054942.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 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 39842f7786db..9904fb71d596 100644 --- a/net/mptcp/pm.c +++ b/net/mptcp/pm.c @@ -551,22 +551,14 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk, bool update_subflows; update_subflows = 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); if (!pm->ops->subflow_established || - (!READ_ONCE(pm->work_pending) && !update_subflows)) + !READ_ONCE(pm->work_pending)) return; spin_lock_bh(&pm->lock); - if (update_subflows) - __mptcp_pm_close_subflow(msk); /* Even if this subflow is not really established, tell the PM to try * to pick the next ones, if possible.