Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

SUNRPC: Capture completion of all RPC tasks

RPC tasks on the backchannel never invoke xprt_complete_rqst(), so
there is no way to report their tk_status at completion. Also, any
RPC task that exits via rpc_exit_task() before it is replied to will
also disappear without a trace.

Introduce a trace point that is symmetrical with rpc_task_begin that
captures the termination status of each RPC task.

Sample trace output for callback requests initiated on the server:
kworker/u8:12-448 [003] 127.025240: rpc_task_end: task:50@3 flags=ASYNC|DYNAMIC|SOFT|SOFTCONN|SENT runstate=RUNNING|ACTIVE status=0 action=rpc_exit_task
kworker/u8:12-448 [002] 127.567310: rpc_task_end: task:51@3 flags=ASYNC|DYNAMIC|SOFT|SOFTCONN|SENT runstate=RUNNING|ACTIVE status=0 action=rpc_exit_task
kworker/u8:12-448 [001] 130.506817: rpc_task_end: task:52@3 flags=ASYNC|DYNAMIC|SOFT|SOFTCONN|SENT runstate=RUNNING|ACTIVE status=0 action=rpc_exit_task

Odd, though, that I never see trace_rpc_task_complete, either in the
forward or backchannel. Should it be removed?

Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>

authored by

Chuck Lever and committed by
Trond Myklebust
a264abad e8d70b32

+2
+1
include/trace/events/sunrpc.h
··· 165 165 DEFINE_RPC_RUNNING_EVENT(begin); 166 166 DEFINE_RPC_RUNNING_EVENT(run_action); 167 167 DEFINE_RPC_RUNNING_EVENT(complete); 168 + DEFINE_RPC_RUNNING_EVENT(end); 168 169 169 170 DECLARE_EVENT_CLASS(rpc_task_queued, 170 171
+1
net/sunrpc/sched.c
··· 824 824 */ 825 825 void rpc_exit_task(struct rpc_task *task) 826 826 { 827 + trace_rpc_task_end(task, task->tk_action); 827 828 task->tk_action = NULL; 828 829 if (task->tk_ops->rpc_count_stats) 829 830 task->tk_ops->rpc_count_stats(task, task->tk_calldata);