2530 lines · 60.0 KB · C
RawDownload
/* SPDX-License-Identifier: GPL-2.0 */#undef TRACE_SYSTEM#define TRACE_SYSTEM sunrpc #if !defined(_TRACE_SUNRPC_H) || defined(TRACE_HEADER_MULTI_READ)#define _TRACE_SUNRPC_H #include <linux/sunrpc/sched.h>#include <linux/sunrpc/clnt.h>#include <linux/sunrpc/svc.h>#include <linux/sunrpc/xprtsock.h>#include <linux/sunrpc/svc_xprt.h>#include <net/tcp_states.h>#include <linux/net.h>#include <linux/tracepoint.h> #include <trace/misc/sunrpc.h> TRACE_DEFINE_ENUM(SOCK_STREAM);TRACE_DEFINE_ENUM(SOCK_DGRAM);TRACE_DEFINE_ENUM(SOCK_RAW);TRACE_DEFINE_ENUM(SOCK_RDM);TRACE_DEFINE_ENUM(SOCK_SEQPACKET);TRACE_DEFINE_ENUM(SOCK_PACKET); #define show_socket_type(type)					\	__print_symbolic(type,					\		{ SOCK_STREAM,		"STREAM" },		\		{ SOCK_DGRAM,		"DGRAM" },		\		{ SOCK_RAW,		"RAW" },		\		{ SOCK_RDM,		"RDM" },		\		{ SOCK_SEQPACKET,	"SEQPACKET" },		\		{ SOCK_PACKET,		"PACKET" }) /* This list is known to be incomplete, add new enums as needed. */TRACE_DEFINE_ENUM(AF_UNSPEC);TRACE_DEFINE_ENUM(AF_UNIX);TRACE_DEFINE_ENUM(AF_LOCAL);TRACE_DEFINE_ENUM(AF_INET);TRACE_DEFINE_ENUM(AF_INET6); #define rpc_show_address_family(family)				\	__print_symbolic(family,				\		{ AF_UNSPEC,		"AF_UNSPEC" },		\		{ AF_UNIX,		"AF_UNIX" },		\		{ AF_LOCAL,		"AF_LOCAL" },		\		{ AF_INET,		"AF_INET" },		\		{ AF_INET6,		"AF_INET6" }) DECLARE_EVENT_CLASS(rpc_xdr_buf_class,	TP_PROTO(		const struct rpc_task *task,		const struct xdr_buf *xdr	), 	TP_ARGS(task, xdr), 	TP_STRUCT__entry(		__field(unsigned int, task_id)		__field(unsigned int, client_id)		__field(const void *, head_base)		__field(size_t, head_len)		__field(const void *, tail_base)		__field(size_t, tail_len)		__field(unsigned int, page_base)		__field(unsigned int, page_len)		__field(unsigned int, msg_len)	), 	TP_fast_assign(		__entry->task_id = task->tk_pid;		__entry->client_id = task->tk_client ?				     task->tk_client->cl_clid : -1;		__entry->head_base = xdr->head[0].iov_base;		__entry->head_len = xdr->head[0].iov_len;		__entry->tail_base = xdr->tail[0].iov_base;		__entry->tail_len = xdr->tail[0].iov_len;		__entry->page_base = xdr->page_base;		__entry->page_len = xdr->page_len;		__entry->msg_len = xdr->len;	), 	TP_printk(SUNRPC_TRACE_TASK_SPECIFIER		  " head=[%p,%zu] page=%u(%u) tail=[%p,%zu] len=%u",		__entry->task_id, __entry->client_id,		__entry->head_base, __entry->head_len,		__entry->page_len, __entry->page_base,		__entry->tail_base, __entry->tail_len,		__entry->msg_len	)); #define DEFINE_RPCXDRBUF_EVENT(name)					\		DEFINE_EVENT(rpc_xdr_buf_class,				\				rpc_xdr_##name,				\				TP_PROTO(				\					const struct rpc_task *task,	\					const struct xdr_buf *xdr	\				),					\				TP_ARGS(task, xdr)) DEFINE_RPCXDRBUF_EVENT(sendto);DEFINE_RPCXDRBUF_EVENT(recvfrom);DEFINE_RPCXDRBUF_EVENT(reply_pages);  DECLARE_EVENT_CLASS(rpc_clnt_class,	TP_PROTO(		const struct rpc_clnt *clnt	), 	TP_ARGS(clnt), 	TP_STRUCT__entry(		__field(unsigned int, client_id)	), 	TP_fast_assign(		__entry->client_id = clnt->cl_clid;	), 	TP_printk("client=" SUNRPC_TRACE_CLID_SPECIFIER, __entry->client_id)); #define DEFINE_RPC_CLNT_EVENT(name)					\		DEFINE_EVENT(rpc_clnt_class,				\				rpc_clnt_##name,			\				TP_PROTO(				\					const struct rpc_clnt *clnt	\				),					\				TP_ARGS(clnt)) DEFINE_RPC_CLNT_EVENT(free);DEFINE_RPC_CLNT_EVENT(killall);DEFINE_RPC_CLNT_EVENT(shutdown);DEFINE_RPC_CLNT_EVENT(release);DEFINE_RPC_CLNT_EVENT(replace_xprt);DEFINE_RPC_CLNT_EVENT(replace_xprt_err); TRACE_DEFINE_ENUM(RPC_XPRTSEC_NONE);TRACE_DEFINE_ENUM(RPC_XPRTSEC_TLS_X509); #define rpc_show_xprtsec_policy(policy)					\	__print_symbolic(policy,					\		{ RPC_XPRTSEC_NONE,		"none" },		\		{ RPC_XPRTSEC_TLS_ANON,		"tls-anon" },		\		{ RPC_XPRTSEC_TLS_X509,		"tls-x509" }) #define rpc_show_create_flags(flags)					\	__print_flags(flags, "|",					\		{ RPC_CLNT_CREATE_HARDRTRY,	"HARDRTRY" },		\		{ RPC_CLNT_CREATE_AUTOBIND,	"AUTOBIND" },		\		{ RPC_CLNT_CREATE_NONPRIVPORT,	"NONPRIVPORT" },	\		{ RPC_CLNT_CREATE_NOPING,	"NOPING" },		\		{ RPC_CLNT_CREATE_DISCRTRY,	"DISCRTRY" },		\		{ RPC_CLNT_CREATE_QUIET,	"QUIET" },		\		{ RPC_CLNT_CREATE_INFINITE_SLOTS,			\						"INFINITE_SLOTS" },	\		{ RPC_CLNT_CREATE_NO_IDLE_TIMEOUT,			\						"NO_IDLE_TIMEOUT" },	\		{ RPC_CLNT_CREATE_NO_RETRANS_TIMEOUT,			\						"NO_RETRANS_TIMEOUT" },	\		{ RPC_CLNT_CREATE_SOFTERR,	"SOFTERR" },		\		{ RPC_CLNT_CREATE_REUSEPORT,	"REUSEPORT" }) TRACE_EVENT(rpc_clnt_new,	TP_PROTO(		const struct rpc_clnt *clnt,		const struct rpc_xprt *xprt,		const struct rpc_create_args *args	), 	TP_ARGS(clnt, xprt, args), 	TP_STRUCT__entry(		__field(unsigned int, client_id)		__field(unsigned long, xprtsec)		__field(unsigned long, flags)		__string(program, clnt->cl_program->name)		__string(server, xprt->servername)		__string(addr, xprt->address_strings[RPC_DISPLAY_ADDR])		__string(port, xprt->address_strings[RPC_DISPLAY_PORT])	), 	TP_fast_assign(		__entry->client_id = clnt->cl_clid;		__entry->xprtsec = args->xprtsec.policy;		__entry->flags = args->flags;		__assign_str(program);		__assign_str(server);		__assign_str(addr);		__assign_str(port);	), 	TP_printk("client=" SUNRPC_TRACE_CLID_SPECIFIER " peer=[%s]:%s"		" program=%s server=%s xprtsec=%s flags=%s",		__entry->client_id, __get_str(addr), __get_str(port),		__get_str(program), __get_str(server),		rpc_show_xprtsec_policy(__entry->xprtsec),		rpc_show_create_flags(__entry->flags)	)); TRACE_EVENT(rpc_clnt_new_err,	TP_PROTO(		const char *program,		const char *server,		int error	), 	TP_ARGS(program, server, error), 	TP_STRUCT__entry(		__field(int, error)		__string(program, program)		__string(server, server)	), 	TP_fast_assign(		__entry->error = error;		__assign_str(program);		__assign_str(server);	), 	TP_printk("program=%s server=%s error=%d",		__get_str(program), __get_str(server), __entry->error)); TRACE_EVENT(rpc_clnt_clone_err,	TP_PROTO(		const struct rpc_clnt *clnt,		int error	), 	TP_ARGS(clnt, error), 	TP_STRUCT__entry(		__field(unsigned int, client_id)		__field(int, error)	), 	TP_fast_assign(		__entry->client_id = clnt->cl_clid;		__entry->error = error;	), 	TP_printk("client=" SUNRPC_TRACE_CLID_SPECIFIER " error=%d",		__entry->client_id, __entry->error));  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), 	TP_ARGS(task), 	TP_STRUCT__entry(		__field(unsigned int, task_id)		__field(unsigned int, client_id)		__field(int, status)	), 	TP_fast_assign(		__entry->task_id = task->tk_pid;		__entry->client_id = task->tk_client->cl_clid;		__entry->status = task->tk_status;	), 	TP_printk(SUNRPC_TRACE_TASK_SPECIFIER " status=%d",		__entry->task_id, __entry->client_id,		__entry->status));#define DEFINE_RPC_STATUS_EVENT(name) \	DEFINE_EVENT(rpc_task_status, rpc_##name##_status, \			TP_PROTO( \				const struct rpc_task *task \			), \			TP_ARGS(task)) DEFINE_RPC_STATUS_EVENT(call);DEFINE_RPC_STATUS_EVENT(connect);DEFINE_RPC_STATUS_EVENT(timeout);DEFINE_RPC_STATUS_EVENT(retry_refresh);DEFINE_RPC_STATUS_EVENT(refresh); TRACE_EVENT(rpc_request,	TP_PROTO(const struct rpc_task *task), 	TP_ARGS(task), 	TP_STRUCT__entry(		__field(unsigned int, task_id)		__field(unsigned int, client_id)		__field(int, version)		__field(bool, async)		__string(progname, task->tk_client->cl_program->name)		__string(procname, rpc_proc_name(task))	), 	TP_fast_assign(		__entry->task_id = task->tk_pid;		__entry->client_id = task->tk_client->cl_clid;		__entry->version = task->tk_client->cl_vers;		__entry->async = RPC_IS_ASYNC(task);		__assign_str(progname);		__assign_str(procname);	), 	TP_printk(SUNRPC_TRACE_TASK_SPECIFIER " %sv%d %s (%ssync)",		__entry->task_id, __entry->client_id,		__get_str(progname), __entry->version,		__get_str(procname), __entry->async ? "a": ""		)); #define rpc_show_task_flags(flags)					\	__print_flags(flags, "|",					\		{ RPC_TASK_ASYNC, "ASYNC" },				\		{ RPC_TASK_SWAPPER, "SWAPPER" },			\		{ RPC_TASK_MOVEABLE, "MOVEABLE" },			\		{ RPC_TASK_NULLCREDS, "NULLCREDS" },			\		{ RPC_CALL_MAJORSEEN, "MAJORSEEN" },			\		{ RPC_TASK_NETUNREACH_FATAL, "NETUNREACH_FATAL"},	\		{ RPC_TASK_DYNAMIC, "DYNAMIC" },			\		{ RPC_TASK_NO_ROUND_ROBIN, "NO_ROUND_ROBIN" },		\		{ RPC_TASK_SOFT, "SOFT" },				\		{ RPC_TASK_SOFTCONN, "SOFTCONN" },			\		{ RPC_TASK_SENT, "SENT" },				\		{ RPC_TASK_TIMEOUT, "TIMEOUT" },			\		{ RPC_TASK_NOCONNECT, "NOCONNECT" },			\		{ RPC_TASK_NO_RETRANS_TIMEOUT, "NORTO" },		\		{ RPC_TASK_CRED_NOREF, "CRED_NOREF" }) #define rpc_show_runstate(flags)					\	__print_flags(flags, "|",					\		{ (1UL << RPC_TASK_RUNNING), "RUNNING" },		\		{ (1UL << RPC_TASK_QUEUED), "QUEUED" },			\		{ (1UL << RPC_TASK_ACTIVE), "ACTIVE" },			\		{ (1UL << RPC_TASK_NEED_XMIT), "NEED_XMIT" },		\		{ (1UL << RPC_TASK_NEED_RECV), "NEED_RECV" },		\		{ (1UL << RPC_TASK_MSG_PIN_WAIT), "MSG_PIN_WAIT" }) DECLARE_EVENT_CLASS(rpc_task_running, 	TP_PROTO(const struct rpc_task *task, const void *action), 	TP_ARGS(task, action), 	TP_STRUCT__entry(		__field(unsigned int, task_id)		__field(unsigned int, client_id)		__field(const void *, action)		__field(unsigned long, runstate)		__field(int, status)		__field(unsigned short, flags)		), 	TP_fast_assign(		__entry->client_id = task->tk_client ?				     task->tk_client->cl_clid : -1;		__entry->task_id = task->tk_pid;		__entry->action = action;		__entry->runstate = task->tk_runstate;		__entry->status = task->tk_status;		__entry->flags = task->tk_flags;		), 	TP_printk(SUNRPC_TRACE_TASK_SPECIFIER		  " flags=%s runstate=%s status=%d action=%ps",		__entry->task_id, __entry->client_id,		rpc_show_task_flags(__entry->flags),		rpc_show_runstate(__entry->runstate),		__entry->status,		__entry->action		));#define DEFINE_RPC_RUNNING_EVENT(name) \	DEFINE_EVENT(rpc_task_running, rpc_task_##name, \			TP_PROTO( \				const struct rpc_task *task, \				const void *action \			), \			TP_ARGS(task, action)) DEFINE_RPC_RUNNING_EVENT(begin);DEFINE_RPC_RUNNING_EVENT(run_action);DEFINE_RPC_RUNNING_EVENT(sync_sleep);DEFINE_RPC_RUNNING_EVENT(sync_wake);DEFINE_RPC_RUNNING_EVENT(complete);DEFINE_RPC_RUNNING_EVENT(timeout);DEFINE_RPC_RUNNING_EVENT(signalled);DEFINE_RPC_RUNNING_EVENT(end);DEFINE_RPC_RUNNING_EVENT(call_done); DECLARE_EVENT_CLASS(rpc_task_queued, 	TP_PROTO(const struct rpc_task *task, const struct rpc_wait_queue *q), 	TP_ARGS(task, q), 	TP_STRUCT__entry(		__field(unsigned int, task_id)		__field(unsigned int, client_id)		__field(unsigned long, timeout)		__field(unsigned long, runstate)		__field(int, status)		__field(unsigned short, flags)		__string(q_name, rpc_qname(q))		), 	TP_fast_assign(		__entry->client_id = task->tk_client ?				     task->tk_client->cl_clid : -1;		__entry->task_id = task->tk_pid;		__entry->timeout = rpc_task_timeout(task);		__entry->runstate = task->tk_runstate;		__entry->status = task->tk_status;		__entry->flags = task->tk_flags;		__assign_str(q_name);		), 	TP_printk(SUNRPC_TRACE_TASK_SPECIFIER		  " flags=%s runstate=%s status=%d timeout=%lu queue=%s",		__entry->task_id, __entry->client_id,		rpc_show_task_flags(__entry->flags),		rpc_show_runstate(__entry->runstate),		__entry->status,		__entry->timeout,		__get_str(q_name)		));#define DEFINE_RPC_QUEUED_EVENT(name) \	DEFINE_EVENT(rpc_task_queued, rpc_task_##name, \			TP_PROTO( \				const struct rpc_task *task, \				const struct rpc_wait_queue *q \			), \			TP_ARGS(task, q)) DEFINE_RPC_QUEUED_EVENT(sleep);DEFINE_RPC_QUEUED_EVENT(wakeup); DECLARE_EVENT_CLASS(rpc_failure, 	TP_PROTO(const struct rpc_task *task), 	TP_ARGS(task), 	TP_STRUCT__entry(		__field(unsigned int, task_id)		__field(unsigned int, client_id)	), 	TP_fast_assign(		__entry->task_id = task->tk_pid;		__entry->client_id = task->tk_client->cl_clid;	), 	TP_printk(SUNRPC_TRACE_TASK_SPECIFIER,		__entry->task_id, __entry->client_id)); #define DEFINE_RPC_FAILURE(name)					\	DEFINE_EVENT(rpc_failure, rpc_bad_##name,			\			TP_PROTO(					\				const struct rpc_task *task		\			),						\			TP_ARGS(task)) DEFINE_RPC_FAILURE(callhdr);DEFINE_RPC_FAILURE(verifier); DECLARE_EVENT_CLASS(rpc_reply_event, 	TP_PROTO(		const struct rpc_task *task	), 	TP_ARGS(task),

Lines 1–500 of 2530.