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:
Trond Myklebust 2009-03-11 14:37:57 -04:00
parent a67d18f89f
commit 15f081ca8d

View File

@ -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