forked from Minki/linux
SUNRPC: Avoid an unnecessary task reschedule on ENOTCONN
If the socket is unconnected, and xprt_transmit() returns ENOTCONN, we currently give up the lock on the transport channel. Doing so means that the lock automatically gets assigned to the next task in the xprt->sending queue, and so that task needs to be woken up to do the actual connect. The following patch aims to avoid that unnecessary task switch. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
This commit is contained in:
parent
a67d18f89f
commit
15f081ca8d
@ -1105,15 +1105,25 @@ static void
|
|||||||
call_transmit_status(struct rpc_task *task)
|
call_transmit_status(struct rpc_task *task)
|
||||||
{
|
{
|
||||||
task->tk_action = call_status;
|
task->tk_action = call_status;
|
||||||
/*
|
switch (task->tk_status) {
|
||||||
* Special case: if we've been waiting on the socket's write_space()
|
case -EAGAIN:
|
||||||
* callback, then don't call xprt_end_transmit().
|
break;
|
||||||
*/
|
default:
|
||||||
if (task->tk_status == -EAGAIN)
|
|
||||||
return;
|
|
||||||
xprt_end_transmit(task);
|
xprt_end_transmit(task);
|
||||||
|
/*
|
||||||
|
* Special cases: if we've been waiting on the
|
||||||
|
* socket's write_space() callback, or if the
|
||||||
|
* socket just returned a connection error,
|
||||||
|
* then hold onto the transport lock.
|
||||||
|
*/
|
||||||
|
case -ECONNREFUSED:
|
||||||
|
case -ENOTCONN:
|
||||||
|
case -EHOSTDOWN:
|
||||||
|
case -EHOSTUNREACH:
|
||||||
|
case -ENETUNREACH:
|
||||||
rpc_task_force_reencode(task);
|
rpc_task_force_reencode(task);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* 6. Sort out the RPC call status
|
* 6. Sort out the RPC call status
|
||||||
|
Loading…
Reference in New Issue
Block a user