mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
SUNRPC: avoid soft lockup when transmitting UDP to reachable server.
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: ed7dc973bd
("SUNRPC: Prevent thundering herd when the socket is not connected")
Signed-off-by: NeilBrown <neilb@suse.de>
Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:
parent
0e13dd9ea8
commit
6258cf25d5
@ -2326,12 +2326,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,
|
||||
|
Loading…
Reference in New Issue
Block a user