Patch "net/smc: Prevent smc_release() from long blocking" has been added to the 5.4-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

    net/smc: Prevent smc_release() from long blocking

to the 5.4-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:
     net-smc-prevent-smc_release-from-long-blocking.patch
and it can be found in the queue-5.4 subdirectory.

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



commit 4f74f2327c0800885bbbe3253a86dac33ddf47a5
Author: D. Wythe <alibuda@xxxxxxxxxxxxxxxxx>
Date:   Wed Dec 15 20:29:21 2021 +0800

    net/smc: Prevent smc_release() from long blocking
    
    [ Upstream commit 5c15b3123f65f8fbb1b445d9a7e8812e0e435df2 ]
    
    In nginx/wrk benchmark, there's a hung problem with high probability
    on case likes that: (client will last several minutes to exit)
    
    server: smc_run nginx
    
    client: smc_run wrk -c 10000 -t 1 http://server
    
    Client hangs with the following backtrace:
    
    0 [ffffa7ce8Of3bbf8] __schedule at ffffffff9f9eOd5f
    1 [ffffa7ce8Of3bc88] schedule at ffffffff9f9eløe6
    2 [ffffa7ce8Of3bcaO] schedule_timeout at ffffffff9f9e3f3c
    3 [ffffa7ce8Of3bd2O] wait_for_common at ffffffff9f9el9de
    4 [ffffa7ce8Of3bd8O] __flush_work at ffffffff9fOfeOl3
    5 [ffffa7ce8øf3bdfO] smc_release at ffffffffcO697d24 [smc]
    6 [ffffa7ce8Of3be2O] __sock_release at ffffffff9f8O2e2d
    7 [ffffa7ce8Of3be4ø] sock_close at ffffffff9f8ø2ebl
    8 [ffffa7ce8øf3be48] __fput at ffffffff9f334f93
    9 [ffffa7ce8Of3be78] task_work_run at ffffffff9flOlff5
    10 [ffffa7ce8Of3beaO] do_exit at ffffffff9fOe5Ol2
    11 [ffffa7ce8Of3bflO] do_group_exit at ffffffff9fOe592a
    12 [ffffa7ce8Of3bf38] __x64_sys_exit_group at ffffffff9fOe5994
    13 [ffffa7ce8Of3bf4O] do_syscall_64 at ffffffff9f9d4373
    14 [ffffa7ce8Of3bfsO] entry_SYSCALL_64_after_hwframe at ffffffff9fa0007c
    
    This issue dues to flush_work(), which is used to wait for
    smc_connect_work() to finish in smc_release(). Once lots of
    smc_connect_work() was pending or all executing work dangling,
    smc_release() has to block until one worker comes to free, which
    is equivalent to wait another smc_connnect_work() to finish.
    
    In order to fix this, There are two changes:
    
    1. For those idle smc_connect_work(), cancel it from the workqueue; for
       executing smc_connect_work(), waiting for it to finish. For that
       purpose, replace flush_work() with cancel_work_sync().
    
    2. Since smc_connect() hold a reference for passive closing, if
       smc_connect_work() has been cancelled, release the reference.
    
    Fixes: 24ac3a08e658 ("net/smc: rebuild nonblocking connect")
    Reported-by: Tony Lu <tonylu@xxxxxxxxxxxxxxxxx>
    Tested-by: Dust Li <dust.li@xxxxxxxxxxxxxxxxx>
    Reviewed-by: Dust Li <dust.li@xxxxxxxxxxxxxxxxx>
    Reviewed-by: Tony Lu <tonylu@xxxxxxxxxxxxxxxxx>
    Signed-off-by: D. Wythe <alibuda@xxxxxxxxxxxxxxxxx>
    Acked-by: Karsten Graul <kgraul@xxxxxxxxxxxxx>
    Link: https://lore.kernel.org/r/1639571361-101128-1-git-send-email-alibuda@xxxxxxxxxxxxxxxxx
    Signed-off-by: Jakub Kicinski <kuba@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/smc/af_smc.c b/net/smc/af_smc.c
index fa3b20e5f4608..06684ac346abd 100644
--- a/net/smc/af_smc.c
+++ b/net/smc/af_smc.c
@@ -183,7 +183,9 @@ static int smc_release(struct socket *sock)
 	/* cleanup for a dangling non-blocking connect */
 	if (smc->connect_nonblock && sk->sk_state == SMC_INIT)
 		tcp_abort(smc->clcsock->sk, ECONNABORTED);
-	flush_work(&smc->connect_work);
+
+	if (cancel_work_sync(&smc->connect_work))
+		sock_put(&smc->sk); /* sock_hold in smc_connect for passive closing */
 
 	if (sk->sk_state == SMC_LISTEN)
 		/* smc_close_non_accepted() is called and acquires



[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