Merge tag 'nfsd-5.5' of git://linux-nfs.org/~bfields/linux
[linux-2.6-microblaze.git] / include / trace / events / sunrpc.h
index ffa3c51..8c73ffb 100644 (file)
 #include <linux/net.h>
 #include <linux/tracepoint.h>
 
+TRACE_DEFINE_ENUM(RPC_AUTH_OK);
+TRACE_DEFINE_ENUM(RPC_AUTH_BADCRED);
+TRACE_DEFINE_ENUM(RPC_AUTH_REJECTEDCRED);
+TRACE_DEFINE_ENUM(RPC_AUTH_BADVERF);
+TRACE_DEFINE_ENUM(RPC_AUTH_REJECTEDVERF);
+TRACE_DEFINE_ENUM(RPC_AUTH_TOOWEAK);
+TRACE_DEFINE_ENUM(RPCSEC_GSS_CREDPROBLEM);
+TRACE_DEFINE_ENUM(RPCSEC_GSS_CTXPROBLEM);
+
+#define rpc_show_auth_stat(status)                                     \
+       __print_symbolic(status,                                        \
+               { RPC_AUTH_OK,                  "AUTH_OK" },            \
+               { RPC_AUTH_BADCRED,             "BADCRED" },            \
+               { RPC_AUTH_REJECTEDCRED,        "REJECTEDCRED" },       \
+               { RPC_AUTH_BADVERF,             "BADVERF" },            \
+               { RPC_AUTH_REJECTEDVERF,        "REJECTEDVERF" },       \
+               { RPC_AUTH_TOOWEAK,             "TOOWEAK" },            \
+               { RPCSEC_GSS_CREDPROBLEM,       "GSS_CREDPROBLEM" },    \
+               { RPCSEC_GSS_CTXPROBLEM,        "GSS_CTXPROBLEM" })     \
+
 DECLARE_EVENT_CLASS(rpc_task_status,
 
        TP_PROTO(const struct rpc_task *task),
@@ -165,6 +185,7 @@ DECLARE_EVENT_CLASS(rpc_task_running,
 DEFINE_RPC_RUNNING_EVENT(begin);
 DEFINE_RPC_RUNNING_EVENT(run_action);
 DEFINE_RPC_RUNNING_EVENT(complete);
+DEFINE_RPC_RUNNING_EVENT(end);
 
 DECLARE_EVENT_CLASS(rpc_task_queued,
 
@@ -777,6 +798,99 @@ TRACE_EVENT(xprt_ping,
                        __get_str(addr), __get_str(port), __entry->status)
 );
 
+DECLARE_EVENT_CLASS(xprt_writelock_event,
+       TP_PROTO(
+               const struct rpc_xprt *xprt, const struct rpc_task *task
+       ),
+
+       TP_ARGS(xprt, task),
+
+       TP_STRUCT__entry(
+               __field(unsigned int, task_id)
+               __field(unsigned int, client_id)
+               __field(unsigned int, snd_task_id)
+       ),
+
+       TP_fast_assign(
+               if (task) {
+                       __entry->task_id = task->tk_pid;
+                       __entry->client_id = task->tk_client ?
+                                            task->tk_client->cl_clid : -1;
+               } else {
+                       __entry->task_id = -1;
+                       __entry->client_id = -1;
+               }
+               __entry->snd_task_id = xprt->snd_task ?
+                                       xprt->snd_task->tk_pid : -1;
+       ),
+
+       TP_printk("task:%u@%u snd_task:%u",
+                       __entry->task_id, __entry->client_id,
+                       __entry->snd_task_id)
+);
+
+#define DEFINE_WRITELOCK_EVENT(name) \
+       DEFINE_EVENT(xprt_writelock_event, xprt_##name, \
+                       TP_PROTO( \
+                               const struct rpc_xprt *xprt, \
+                               const struct rpc_task *task \
+                       ), \
+                       TP_ARGS(xprt, task))
+
+DEFINE_WRITELOCK_EVENT(reserve_xprt);
+DEFINE_WRITELOCK_EVENT(release_xprt);
+
+DECLARE_EVENT_CLASS(xprt_cong_event,
+       TP_PROTO(
+               const struct rpc_xprt *xprt, const struct rpc_task *task
+       ),
+
+       TP_ARGS(xprt, task),
+
+       TP_STRUCT__entry(
+               __field(unsigned int, task_id)
+               __field(unsigned int, client_id)
+               __field(unsigned int, snd_task_id)
+               __field(unsigned long, cong)
+               __field(unsigned long, cwnd)
+               __field(bool, wait)
+       ),
+
+       TP_fast_assign(
+               if (task) {
+                       __entry->task_id = task->tk_pid;
+                       __entry->client_id = task->tk_client ?
+                                            task->tk_client->cl_clid : -1;
+               } else {
+                       __entry->task_id = -1;
+                       __entry->client_id = -1;
+               }
+               __entry->snd_task_id = xprt->snd_task ?
+                                       xprt->snd_task->tk_pid : -1;
+               __entry->cong = xprt->cong;
+               __entry->cwnd = xprt->cwnd;
+               __entry->wait = test_bit(XPRT_CWND_WAIT, &xprt->state);
+       ),
+
+       TP_printk("task:%u@%u snd_task:%u cong=%lu cwnd=%lu%s",
+                       __entry->task_id, __entry->client_id,
+                       __entry->snd_task_id, __entry->cong, __entry->cwnd,
+                       __entry->wait ? " (wait)" : "")
+);
+
+#define DEFINE_CONG_EVENT(name) \
+       DEFINE_EVENT(xprt_cong_event, xprt_##name, \
+                       TP_PROTO( \
+                               const struct rpc_xprt *xprt, \
+                               const struct rpc_task *task \
+                       ), \
+                       TP_ARGS(xprt, task))
+
+DEFINE_CONG_EVENT(reserve_cong);
+DEFINE_CONG_EVENT(release_cong);
+DEFINE_CONG_EVENT(get_cong);
+DEFINE_CONG_EVENT(put_cong);
+
 TRACE_EVENT(xs_stream_read_data,
        TP_PROTO(struct rpc_xprt *xprt, ssize_t err, size_t total),
 
@@ -866,6 +980,41 @@ TRACE_EVENT(svc_recv,
                        show_rqstp_flags(__entry->flags))
 );
 
+#define svc_show_status(status)                                \
+       __print_symbolic(status,                        \
+               { SVC_GARBAGE,  "SVC_GARBAGE" },        \
+               { SVC_SYSERR,   "SVC_SYSERR" },         \
+               { SVC_VALID,    "SVC_VALID" },          \
+               { SVC_NEGATIVE, "SVC_NEGATIVE" },       \
+               { SVC_OK,       "SVC_OK" },             \
+               { SVC_DROP,     "SVC_DROP" },           \
+               { SVC_CLOSE,    "SVC_CLOSE" },          \
+               { SVC_DENIED,   "SVC_DENIED" },         \
+               { SVC_PENDING,  "SVC_PENDING" },        \
+               { SVC_COMPLETE, "SVC_COMPLETE" })
+
+TRACE_EVENT(svc_authenticate,
+       TP_PROTO(const struct svc_rqst *rqst, int auth_res, __be32 auth_stat),
+
+       TP_ARGS(rqst, auth_res, auth_stat),
+
+       TP_STRUCT__entry(
+               __field(u32, xid)
+               __field(unsigned long, svc_status)
+               __field(unsigned long, auth_stat)
+       ),
+
+       TP_fast_assign(
+               __entry->xid = be32_to_cpu(rqst->rq_xid);
+               __entry->svc_status = auth_res;
+               __entry->auth_stat = be32_to_cpu(auth_stat);
+       ),
+
+       TP_printk("xid=0x%08x auth_res=%s auth_stat=%s",
+                       __entry->xid, svc_show_status(__entry->svc_status),
+                       rpc_show_auth_stat(__entry->auth_stat))
+);
+
 TRACE_EVENT(svc_process,
        TP_PROTO(const struct svc_rqst *rqst, const char *name),