Patch "mptcp: fix sleep in atomic at close time" has been added to the 6.0-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    mptcp: fix sleep in atomic at close time

to the 6.0-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     mptcp-fix-sleep-in-atomic-at-close-time.patch
and it can be found in the queue-6.0 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit 6ae13ed2327aecb5600c45ce7e842e3a85686458
Author: Paolo Abeni <pabeni@xxxxxxxxxx>
Date:   Mon Nov 28 16:42:38 2022 +0100

    mptcp: fix sleep in atomic at close time
    
    [ Upstream commit b4f166651d03b5484fa179817ba8ad4899a5a6ac ]
    
    Matt reported a splat at msk close time:
    
        BUG: sleeping function called from invalid context at net/mptcp/protocol.c:2877
        in_atomic(): 1, irqs_disabled(): 0, non_block: 0, pid: 155, name: packetdrill
        preempt_count: 201, expected: 0
        RCU nest depth: 0, expected: 0
        4 locks held by packetdrill/155:
        #0: ffff888001536990 (&sb->s_type->i_mutex_key#6){+.+.}-{3:3}, at: __sock_release (net/socket.c:650)
        #1: ffff88800b498130 (sk_lock-AF_INET){+.+.}-{0:0}, at: mptcp_close (net/mptcp/protocol.c:2973)
        #2: ffff88800b49a130 (sk_lock-AF_INET/1){+.+.}-{0:0}, at: __mptcp_close_ssk (net/mptcp/protocol.c:2363)
        #3: ffff88800b49a0b0 (slock-AF_INET){+...}-{2:2}, at: __lock_sock_fast (include/net/sock.h:1820)
        Preemption disabled at:
        0x0
        CPU: 1 PID: 155 Comm: packetdrill Not tainted 6.1.0-rc5 #365
        Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.15.0-1 04/01/2014
        Call Trace:
        <TASK>
        dump_stack_lvl (lib/dump_stack.c:107 (discriminator 4))
        __might_resched.cold (kernel/sched/core.c:9891)
        __mptcp_destroy_sock (include/linux/kernel.h:110)
        __mptcp_close (net/mptcp/protocol.c:2959)
        mptcp_subflow_queue_clean (include/net/sock.h:1777)
        __mptcp_close_ssk (net/mptcp/protocol.c:2363)
        mptcp_destroy_common (net/mptcp/protocol.c:3170)
        mptcp_destroy (include/net/sock.h:1495)
        __mptcp_destroy_sock (net/mptcp/protocol.c:2886)
        __mptcp_close (net/mptcp/protocol.c:2959)
        mptcp_close (net/mptcp/protocol.c:2974)
        inet_release (net/ipv4/af_inet.c:432)
        __sock_release (net/socket.c:651)
        sock_close (net/socket.c:1367)
        __fput (fs/file_table.c:320)
        task_work_run (kernel/task_work.c:181 (discriminator 1))
        exit_to_user_mode_prepare (include/linux/resume_user_mode.h:49)
        syscall_exit_to_user_mode (kernel/entry/common.c:130)
        do_syscall_64 (arch/x86/entry/common.c:87)
        entry_SYSCALL_64_after_hwframe (arch/x86/entry/entry_64.S:120)
    
    We can't call mptcp_close under the 'fast' socket lock variant, replace
    it with a sock_lock_nested() as the relevant code is already under the
    listening msk socket lock protection.
    
    Reported-by: Matthieu Baerts <matthieu.baerts@xxxxxxxxxxxx>
    Closes: https://github.com/multipath-tcp/mptcp_net-next/issues/316
    Fixes: 30e51b923e43 ("mptcp: fix unreleased socket in accept queue")
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Reviewed-by: Matthieu Baerts <matthieu.baerts@xxxxxxxxxxxx>
    Signed-off-by: Matthieu Baerts <matthieu.baerts@xxxxxxxxxxxx>
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/mptcp/subflow.c b/net/mptcp/subflow.c
index 02a54d59697b..2159b5f9988f 100644
--- a/net/mptcp/subflow.c
+++ b/net/mptcp/subflow.c
@@ -1745,16 +1745,16 @@ void mptcp_subflow_queue_clean(struct sock *listener_ssk)
 
 	for (msk = head; msk; msk = next) {
 		struct sock *sk = (struct sock *)msk;
-		bool slow, do_cancel_work;
+		bool do_cancel_work;
 
 		sock_hold(sk);
-		slow = lock_sock_fast_nested(sk);
+		lock_sock_nested(sk, SINGLE_DEPTH_NESTING);
 		next = msk->dl_next;
 		msk->first = NULL;
 		msk->dl_next = NULL;
 
 		do_cancel_work = __mptcp_close(sk, 0);
-		unlock_sock_fast(sk, slow);
+		release_sock(sk);
 		if (do_cancel_work)
 			mptcp_cancel_work(sk);
 		sock_put(sk);



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux