[PATCH] RPC: kick off socket connect operations faster
authorChuck Lever <cel@netapp.com>
Wed, 22 Jun 2005 17:16:28 +0000 (17:16 +0000)
committerTrond Myklebust <Trond.Myklebust@netapp.com>
Wed, 22 Jun 2005 20:07:32 +0000 (16:07 -0400)
 Make the socket transport kick the event queue to start socket connects
 immediately.  This should improve responsiveness of applications that are
 sensitive to slow mount operations (like automounters).

 We are now also careful to cancel the connect worker before destroying
 the xprt.  This eliminates a race where xprt_destroy can finish before
 the connect worker is even allowed to run.

 Test-plan:
 Destructive testing (unplugging the network temporarily).  Connectathon
 with UDP and TCP.  Hard-code impossibly small connect timeout.

 Version: Fri, 29 Apr 2005 15:32:01 -0400

Signed-off-by: Chuck Lever <cel@netapp.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
net/sunrpc/xprt.c

index 2b8789cf8db1dcbd27fe5668db5a74ed8210c444..eca92405948fbfd69222f5494c40801efe99a78b 100644 (file)
@@ -569,8 +569,11 @@ void xprt_connect(struct rpc_task *task)
                if (xprt->sock != NULL)
                        schedule_delayed_work(&xprt->sock_connect,
                                        RPC_REESTABLISH_TIMEOUT);
-               else
+               else {
                        schedule_work(&xprt->sock_connect);
+                       if (!RPC_IS_ASYNC(task))
+                               flush_scheduled_work();
+               }
        }
        return;
  out_write:
@@ -1685,6 +1688,10 @@ xprt_shutdown(struct rpc_xprt *xprt)
        rpc_wake_up(&xprt->backlog);
        wake_up(&xprt->cong_wait);
        del_timer_sync(&xprt->timer);
+
+       /* synchronously wait for connect worker to finish */
+       cancel_delayed_work(&xprt->sock_connect);
+       flush_scheduled_work();
 }
 
 /*