Patch "SUNRPC: avoid soft lockup when transmitting UDP to reachable server." has been added to the 5.15-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

    SUNRPC: avoid soft lockup when transmitting UDP to reachable server.

to the 5.15-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:
     sunrpc-avoid-soft-lockup-when-transmitting-udp-to-re.patch
and it can be found in the queue-5.15 subdirectory.

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



commit 0ef3626a452a8a5a0a26ad359f488c34bb15c6b3
Author: NeilBrown <neilb@xxxxxxx>
Date:   Wed Jun 19 11:05:13 2024 +1000

    SUNRPC: avoid soft lockup when transmitting UDP to reachable server.
    
    [ Upstream commit 6258cf25d5e3155c3219ab5a79b970eef7996356 ]
    
    Prior to the commit identified below, call_transmit_status() would
    handle -EPERM and other errors related to an unreachable server by
    falling through to call_status() which added a 3-second delay and
    handled the failure as a timeout.
    
    Since that commit, call_transmit_status() falls through to
    handle_bind().  For UDP this moves straight on to handle_connect() and
    handle_transmit() so we immediately retransmit - and likely get the same
    error.
    
    This results in an indefinite loop in __rpc_execute() which triggers a
    soft-lockup warning.
    
    For the errors that indicate an unreachable server,
    call_transmit_status() should fall back to call_status() as it did
    before.  This cannot cause the thundering herd that the previous patch
    was avoiding, as the call_status() will insert a delay.
    
    Fixes: ed7dc973bd91 ("SUNRPC: Prevent thundering herd when the socket is not connected")
    Signed-off-by: NeilBrown <neilb@xxxxxxx>
    Signed-off-by: Anna Schumaker <Anna.Schumaker@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
index f73d4593625cd..38071a6780211 100644
--- a/net/sunrpc/clnt.c
+++ b/net/sunrpc/clnt.c
@@ -2226,12 +2226,13 @@ call_transmit_status(struct rpc_task *task)
 		task->tk_action = call_transmit;
 		task->tk_status = 0;
 		break;
-	case -ECONNREFUSED:
 	case -EHOSTDOWN:
 	case -ENETDOWN:
 	case -EHOSTUNREACH:
 	case -ENETUNREACH:
 	case -EPERM:
+		break;
+	case -ECONNREFUSED:
 		if (RPC_IS_SOFTCONN(task)) {
 			if (!task->tk_msg.rpc_proc->p_proc)
 				trace_xprt_ping(task->tk_xprt,




[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