SUNRPC: Trace transport lifetime events
Refactor: Hoist create/destroy/disconnect tracepoints out of xprtrdma and into the generic RPC client. Some benefits include: - Enable tracing of xprt lifetime events for the socket transport types - Expose the different types of disconnect to help run down issues with lingering connections Signed-off-by: Chuck Lever <chuck.lever@oracle.com> Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
This commit is contained in:

committed by
Anna Schumaker

parent
c509f15a58
commit
911813d7a1
@@ -663,6 +663,7 @@ static void xprt_autoclose(struct work_struct *work)
|
||||
container_of(work, struct rpc_xprt, task_cleanup);
|
||||
unsigned int pflags = memalloc_nofs_save();
|
||||
|
||||
trace_xprt_disconnect_auto(xprt);
|
||||
clear_bit(XPRT_CLOSE_WAIT, &xprt->state);
|
||||
xprt->ops->close(xprt);
|
||||
xprt_release_write(xprt, NULL);
|
||||
@@ -677,7 +678,7 @@ static void xprt_autoclose(struct work_struct *work)
|
||||
*/
|
||||
void xprt_disconnect_done(struct rpc_xprt *xprt)
|
||||
{
|
||||
dprintk("RPC: disconnected transport %p\n", xprt);
|
||||
trace_xprt_disconnect_done(xprt);
|
||||
spin_lock(&xprt->transport_lock);
|
||||
xprt_clear_connected(xprt);
|
||||
xprt_clear_write_space_locked(xprt);
|
||||
@@ -694,6 +695,8 @@ EXPORT_SYMBOL_GPL(xprt_disconnect_done);
|
||||
*/
|
||||
void xprt_force_disconnect(struct rpc_xprt *xprt)
|
||||
{
|
||||
trace_xprt_disconnect_force(xprt);
|
||||
|
||||
/* Don't race with the test_bit() in xprt_clear_locked() */
|
||||
spin_lock(&xprt->transport_lock);
|
||||
set_bit(XPRT_CLOSE_WAIT, &xprt->state);
|
||||
@@ -832,8 +835,10 @@ void xprt_connect(struct rpc_task *task)
|
||||
if (!xprt_lock_write(xprt, task))
|
||||
return;
|
||||
|
||||
if (test_and_clear_bit(XPRT_CLOSE_WAIT, &xprt->state))
|
||||
if (test_and_clear_bit(XPRT_CLOSE_WAIT, &xprt->state)) {
|
||||
trace_xprt_disconnect_cleanup(xprt);
|
||||
xprt->ops->close(xprt);
|
||||
}
|
||||
|
||||
if (!xprt_connected(xprt)) {
|
||||
task->tk_rqstp->rq_connect_cookie = xprt->connect_cookie;
|
||||
@@ -1903,11 +1908,8 @@ struct rpc_xprt *xprt_create_transport(struct xprt_create *args)
|
||||
|
||||
found:
|
||||
xprt = t->setup(args);
|
||||
if (IS_ERR(xprt)) {
|
||||
dprintk("RPC: xprt_create_transport: failed, %ld\n",
|
||||
-PTR_ERR(xprt));
|
||||
if (IS_ERR(xprt))
|
||||
goto out;
|
||||
}
|
||||
if (args->flags & XPRT_CREATE_NO_IDLE_TIMEOUT)
|
||||
xprt->idle_timeout = 0;
|
||||
INIT_WORK(&xprt->task_cleanup, xprt_autoclose);
|
||||
@@ -1928,8 +1930,7 @@ found:
|
||||
|
||||
rpc_xprt_debugfs_register(xprt);
|
||||
|
||||
dprintk("RPC: created transport %p with %u slots\n", xprt,
|
||||
xprt->max_reqs);
|
||||
trace_xprt_create(xprt);
|
||||
out:
|
||||
return xprt;
|
||||
}
|
||||
@@ -1939,6 +1940,8 @@ static void xprt_destroy_cb(struct work_struct *work)
|
||||
struct rpc_xprt *xprt =
|
||||
container_of(work, struct rpc_xprt, task_cleanup);
|
||||
|
||||
trace_xprt_destroy(xprt);
|
||||
|
||||
rpc_xprt_debugfs_unregister(xprt);
|
||||
rpc_destroy_wait_queue(&xprt->binding);
|
||||
rpc_destroy_wait_queue(&xprt->pending);
|
||||
@@ -1963,8 +1966,6 @@ static void xprt_destroy_cb(struct work_struct *work)
|
||||
*/
|
||||
static void xprt_destroy(struct rpc_xprt *xprt)
|
||||
{
|
||||
dprintk("RPC: destroying transport %p\n", xprt);
|
||||
|
||||
/*
|
||||
* Exclude transport connect/disconnect handlers and autoclose
|
||||
*/
|
||||
|
Reference in New Issue
Block a user