]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
mptcp: ensure the kernel PM does not take action too late
authorPaolo Abeni <pabeni@redhat.com>
Fri, 21 Nov 2025 17:02:06 +0000 (18:02 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 25 Nov 2025 03:49:42 +0000 (19:49 -0800)
The PM hooks can currently take place when the msk is already shutting
down. Subflow creation will fail, thanks to the existing check at join
time, but we can entirely avoid starting the to be failed operations.

Signed-off-by: Paolo Abeni <pabeni@redhat.com>
Reviewed-by: Geliang Tang <geliang@kernel.org>
Tested-by: Geliang Tang <geliang@kernel.org>
Reviewed-by: Mat Martineau <martineau@kernel.org>
Signed-off-by: Matthieu Baerts (NGI0) <matttbe@kernel.org>
Link: https://patch.msgid.link/20251121-net-next-mptcp-memcg-backlog-imp-v1-7-1f34b6c1e0b1@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
net/mptcp/pm.c
net/mptcp/pm_kernel.c

index 9604b91902b8bc3b831547cd693c28a4890aea31..e2040c327af676a37bd1c6f01884f5b340cf7bcb 100644 (file)
@@ -594,6 +594,7 @@ void mptcp_pm_subflow_established(struct mptcp_sock *msk)
 void mptcp_pm_subflow_check_next(struct mptcp_sock *msk,
                                 const struct mptcp_subflow_context *subflow)
 {
+       struct sock *sk = (struct sock *)msk;
        struct mptcp_pm_data *pm = &msk->pm;
        bool update_subflows;
 
@@ -617,7 +618,8 @@ void mptcp_pm_subflow_check_next(struct mptcp_sock *msk,
        /* Even if this subflow is not really established, tell the PM to try
         * to pick the next ones, if possible.
         */
-       if (mptcp_pm_nl_check_work_pending(msk))
+       if (mptcp_is_fully_established(sk) &&
+           mptcp_pm_nl_check_work_pending(msk))
                mptcp_pm_schedule_work(msk, MPTCP_PM_SUBFLOW_ESTABLISHED);
 
        spin_unlock_bh(&pm->lock);
index 5c1dc13efa94e122e4446cbcaf6abbb315e079a8..57570a44e4185370f531047fe97ce9f9fbd1480b 100644 (file)
@@ -337,6 +337,8 @@ static void mptcp_pm_create_subflow_or_signal_addr(struct mptcp_sock *msk)
        struct mptcp_pm_local local;
 
        mptcp_mpc_endpoint_setup(msk);
+       if (!mptcp_is_fully_established(sk))
+               return;
 
        pr_debug("local %d:%d signal %d:%d subflows %d:%d\n",
                 msk->pm.local_addr_used, endp_subflow_max,