xref: /openbmc/linux/include/trace/events/rpcrdma.h (revision 1c443eff)
1e48f083eSChuck Lever /* SPDX-License-Identifier: GPL-2.0 */
2e48f083eSChuck Lever /*
3e48f083eSChuck Lever  * Copyright (c) 2017 Oracle.  All rights reserved.
4e48f083eSChuck Lever  */
5e48f083eSChuck Lever #undef TRACE_SYSTEM
6e48f083eSChuck Lever #define TRACE_SYSTEM rpcrdma
7e48f083eSChuck Lever 
8e48f083eSChuck Lever #if !defined(_TRACE_RPCRDMA_H) || defined(TRACE_HEADER_MULTI_READ)
9e48f083eSChuck Lever #define _TRACE_RPCRDMA_H
10e48f083eSChuck Lever 
11e48f083eSChuck Lever #include <linux/tracepoint.h>
12e48f083eSChuck Lever #include <trace/events/rdma.h>
13e48f083eSChuck Lever 
14ab03eff5SChuck Lever /**
15b4a7f91cSChuck Lever  ** Event classes
16b4a7f91cSChuck Lever  **/
17b4a7f91cSChuck Lever 
18b4a7f91cSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_reply_event,
19b4a7f91cSChuck Lever 	TP_PROTO(
20b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep
21b4a7f91cSChuck Lever 	),
22b4a7f91cSChuck Lever 
23b4a7f91cSChuck Lever 	TP_ARGS(rep),
24b4a7f91cSChuck Lever 
25b4a7f91cSChuck Lever 	TP_STRUCT__entry(
26b4a7f91cSChuck Lever 		__field(const void *, rep)
27b4a7f91cSChuck Lever 		__field(const void *, r_xprt)
28b4a7f91cSChuck Lever 		__field(u32, xid)
29b4a7f91cSChuck Lever 		__field(u32, version)
30b4a7f91cSChuck Lever 		__field(u32, proc)
31b4a7f91cSChuck Lever 	),
32b4a7f91cSChuck Lever 
33b4a7f91cSChuck Lever 	TP_fast_assign(
34b4a7f91cSChuck Lever 		__entry->rep = rep;
35b4a7f91cSChuck Lever 		__entry->r_xprt = rep->rr_rxprt;
36b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
37b4a7f91cSChuck Lever 		__entry->version = be32_to_cpu(rep->rr_vers);
38b4a7f91cSChuck Lever 		__entry->proc = be32_to_cpu(rep->rr_proc);
39b4a7f91cSChuck Lever 	),
40b4a7f91cSChuck Lever 
41b4a7f91cSChuck Lever 	TP_printk("rxprt %p xid=0x%08x rep=%p: version %u proc %u",
42b4a7f91cSChuck Lever 		__entry->r_xprt, __entry->xid, __entry->rep,
43b4a7f91cSChuck Lever 		__entry->version, __entry->proc
44b4a7f91cSChuck Lever 	)
45b4a7f91cSChuck Lever );
46b4a7f91cSChuck Lever 
47b4a7f91cSChuck Lever #define DEFINE_REPLY_EVENT(name)					\
48b4a7f91cSChuck Lever 		DEFINE_EVENT(xprtrdma_reply_event, name,		\
49b4a7f91cSChuck Lever 				TP_PROTO(				\
50b4a7f91cSChuck Lever 					const struct rpcrdma_rep *rep	\
51b4a7f91cSChuck Lever 				),					\
52b4a7f91cSChuck Lever 				TP_ARGS(rep))
53b4a7f91cSChuck Lever 
541c443effSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_rxprt,
551c443effSChuck Lever 	TP_PROTO(
561c443effSChuck Lever 		const struct rpcrdma_xprt *r_xprt
571c443effSChuck Lever 	),
581c443effSChuck Lever 
591c443effSChuck Lever 	TP_ARGS(r_xprt),
601c443effSChuck Lever 
611c443effSChuck Lever 	TP_STRUCT__entry(
621c443effSChuck Lever 		__field(const void *, r_xprt)
631c443effSChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
641c443effSChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
651c443effSChuck Lever 	),
661c443effSChuck Lever 
671c443effSChuck Lever 	TP_fast_assign(
681c443effSChuck Lever 		__entry->r_xprt = r_xprt;
691c443effSChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
701c443effSChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
711c443effSChuck Lever 	),
721c443effSChuck Lever 
731c443effSChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p",
741c443effSChuck Lever 		__get_str(addr), __get_str(port), __entry->r_xprt
751c443effSChuck Lever 	)
761c443effSChuck Lever );
771c443effSChuck Lever 
781c443effSChuck Lever #define DEFINE_RXPRT_EVENT(name)					\
791c443effSChuck Lever 		DEFINE_EVENT(xprtrdma_rxprt, name,			\
801c443effSChuck Lever 				TP_PROTO(				\
811c443effSChuck Lever 					const struct rpcrdma_xprt *r_xprt \
821c443effSChuck Lever 				),					\
831c443effSChuck Lever 				TP_ARGS(r_xprt))
841c443effSChuck Lever 
8558f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_rdch_event,
8658f10ad4SChuck Lever 	TP_PROTO(
8758f10ad4SChuck Lever 		const struct rpc_task *task,
8858f10ad4SChuck Lever 		unsigned int pos,
8958f10ad4SChuck Lever 		struct rpcrdma_mr *mr,
9058f10ad4SChuck Lever 		int nsegs
9158f10ad4SChuck Lever 	),
9258f10ad4SChuck Lever 
9358f10ad4SChuck Lever 	TP_ARGS(task, pos, mr, nsegs),
9458f10ad4SChuck Lever 
9558f10ad4SChuck Lever 	TP_STRUCT__entry(
9658f10ad4SChuck Lever 		__field(unsigned int, task_id)
9758f10ad4SChuck Lever 		__field(unsigned int, client_id)
9858f10ad4SChuck Lever 		__field(const void *, mr)
9958f10ad4SChuck Lever 		__field(unsigned int, pos)
10058f10ad4SChuck Lever 		__field(int, nents)
10158f10ad4SChuck Lever 		__field(u32, handle)
10258f10ad4SChuck Lever 		__field(u32, length)
10358f10ad4SChuck Lever 		__field(u64, offset)
10458f10ad4SChuck Lever 		__field(int, nsegs)
10558f10ad4SChuck Lever 	),
10658f10ad4SChuck Lever 
10758f10ad4SChuck Lever 	TP_fast_assign(
10858f10ad4SChuck Lever 		__entry->task_id = task->tk_pid;
10958f10ad4SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
11058f10ad4SChuck Lever 		__entry->mr = mr;
11158f10ad4SChuck Lever 		__entry->pos = pos;
11258f10ad4SChuck Lever 		__entry->nents = mr->mr_nents;
11358f10ad4SChuck Lever 		__entry->handle = mr->mr_handle;
11458f10ad4SChuck Lever 		__entry->length = mr->mr_length;
11558f10ad4SChuck Lever 		__entry->offset = mr->mr_offset;
11658f10ad4SChuck Lever 		__entry->nsegs = nsegs;
11758f10ad4SChuck Lever 	),
11858f10ad4SChuck Lever 
11958f10ad4SChuck Lever 	TP_printk("task:%u@%u mr=%p pos=%u %u@0x%016llx:0x%08x (%s)",
12058f10ad4SChuck Lever 		__entry->task_id, __entry->client_id, __entry->mr,
12158f10ad4SChuck Lever 		__entry->pos, __entry->length,
12258f10ad4SChuck Lever 		(unsigned long long)__entry->offset, __entry->handle,
12358f10ad4SChuck Lever 		__entry->nents < __entry->nsegs ? "more" : "last"
12458f10ad4SChuck Lever 	)
12558f10ad4SChuck Lever );
12658f10ad4SChuck Lever 
12758f10ad4SChuck Lever #define DEFINE_RDCH_EVENT(name)						\
12858f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_rdch_event, name,			\
12958f10ad4SChuck Lever 				TP_PROTO(				\
13058f10ad4SChuck Lever 					const struct rpc_task *task,	\
13158f10ad4SChuck Lever 					unsigned int pos,		\
13258f10ad4SChuck Lever 					struct rpcrdma_mr *mr,		\
13358f10ad4SChuck Lever 					int nsegs			\
13458f10ad4SChuck Lever 				),					\
13558f10ad4SChuck Lever 				TP_ARGS(task, pos, mr, nsegs))
13658f10ad4SChuck Lever 
13758f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_wrch_event,
13858f10ad4SChuck Lever 	TP_PROTO(
13958f10ad4SChuck Lever 		const struct rpc_task *task,
14058f10ad4SChuck Lever 		struct rpcrdma_mr *mr,
14158f10ad4SChuck Lever 		int nsegs
14258f10ad4SChuck Lever 	),
14358f10ad4SChuck Lever 
14458f10ad4SChuck Lever 	TP_ARGS(task, mr, nsegs),
14558f10ad4SChuck Lever 
14658f10ad4SChuck Lever 	TP_STRUCT__entry(
14758f10ad4SChuck Lever 		__field(unsigned int, task_id)
14858f10ad4SChuck Lever 		__field(unsigned int, client_id)
14958f10ad4SChuck Lever 		__field(const void *, mr)
15058f10ad4SChuck Lever 		__field(int, nents)
15158f10ad4SChuck Lever 		__field(u32, handle)
15258f10ad4SChuck Lever 		__field(u32, length)
15358f10ad4SChuck Lever 		__field(u64, offset)
15458f10ad4SChuck Lever 		__field(int, nsegs)
15558f10ad4SChuck Lever 	),
15658f10ad4SChuck Lever 
15758f10ad4SChuck Lever 	TP_fast_assign(
15858f10ad4SChuck Lever 		__entry->task_id = task->tk_pid;
15958f10ad4SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
16058f10ad4SChuck Lever 		__entry->mr = mr;
16158f10ad4SChuck Lever 		__entry->nents = mr->mr_nents;
16258f10ad4SChuck Lever 		__entry->handle = mr->mr_handle;
16358f10ad4SChuck Lever 		__entry->length = mr->mr_length;
16458f10ad4SChuck Lever 		__entry->offset = mr->mr_offset;
16558f10ad4SChuck Lever 		__entry->nsegs = nsegs;
16658f10ad4SChuck Lever 	),
16758f10ad4SChuck Lever 
16858f10ad4SChuck Lever 	TP_printk("task:%u@%u mr=%p %u@0x%016llx:0x%08x (%s)",
16958f10ad4SChuck Lever 		__entry->task_id, __entry->client_id, __entry->mr,
17058f10ad4SChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
17158f10ad4SChuck Lever 		__entry->handle,
17258f10ad4SChuck Lever 		__entry->nents < __entry->nsegs ? "more" : "last"
17358f10ad4SChuck Lever 	)
17458f10ad4SChuck Lever );
17558f10ad4SChuck Lever 
17658f10ad4SChuck Lever #define DEFINE_WRCH_EVENT(name)						\
17758f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_wrch_event, name,			\
17858f10ad4SChuck Lever 				TP_PROTO(				\
17958f10ad4SChuck Lever 					const struct rpc_task *task,	\
18058f10ad4SChuck Lever 					struct rpcrdma_mr *mr,		\
18158f10ad4SChuck Lever 					int nsegs			\
18258f10ad4SChuck Lever 				),					\
18358f10ad4SChuck Lever 				TP_ARGS(task, mr, nsegs))
18458f10ad4SChuck Lever 
18558f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_INVALID);
18658f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_VALID);
18758f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_FR);
18858f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_LI);
18958f10ad4SChuck Lever 
19058f10ad4SChuck Lever #define xprtrdma_show_frwr_state(x)					\
19158f10ad4SChuck Lever 		__print_symbolic(x,					\
19258f10ad4SChuck Lever 				{ FRWR_IS_INVALID, "INVALID" },		\
19358f10ad4SChuck Lever 				{ FRWR_IS_VALID, "VALID" },		\
19458f10ad4SChuck Lever 				{ FRWR_FLUSHED_FR, "FLUSHED_FR" },	\
19558f10ad4SChuck Lever 				{ FRWR_FLUSHED_LI, "FLUSHED_LI" })
19658f10ad4SChuck Lever 
19758f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_frwr_done,
19858f10ad4SChuck Lever 	TP_PROTO(
19958f10ad4SChuck Lever 		const struct ib_wc *wc,
20058f10ad4SChuck Lever 		const struct rpcrdma_frwr *frwr
20158f10ad4SChuck Lever 	),
20258f10ad4SChuck Lever 
20358f10ad4SChuck Lever 	TP_ARGS(wc, frwr),
20458f10ad4SChuck Lever 
20558f10ad4SChuck Lever 	TP_STRUCT__entry(
20658f10ad4SChuck Lever 		__field(const void *, mr)
20758f10ad4SChuck Lever 		__field(unsigned int, state)
20858f10ad4SChuck Lever 		__field(unsigned int, status)
20958f10ad4SChuck Lever 		__field(unsigned int, vendor_err)
21058f10ad4SChuck Lever 	),
21158f10ad4SChuck Lever 
21258f10ad4SChuck Lever 	TP_fast_assign(
21358f10ad4SChuck Lever 		__entry->mr = container_of(frwr, struct rpcrdma_mr, frwr);
21458f10ad4SChuck Lever 		__entry->state = frwr->fr_state;
21558f10ad4SChuck Lever 		__entry->status = wc->status;
21658f10ad4SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
21758f10ad4SChuck Lever 	),
21858f10ad4SChuck Lever 
21958f10ad4SChuck Lever 	TP_printk(
22058f10ad4SChuck Lever 		"mr=%p state=%s: %s (%u/0x%x)",
22158f10ad4SChuck Lever 		__entry->mr, xprtrdma_show_frwr_state(__entry->state),
22258f10ad4SChuck Lever 		rdma_show_wc_status(__entry->status),
22358f10ad4SChuck Lever 		__entry->status, __entry->vendor_err
22458f10ad4SChuck Lever 	)
22558f10ad4SChuck Lever );
22658f10ad4SChuck Lever 
22758f10ad4SChuck Lever #define DEFINE_FRWR_DONE_EVENT(name)					\
22858f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_frwr_done, name,			\
22958f10ad4SChuck Lever 				TP_PROTO(				\
23058f10ad4SChuck Lever 					const struct ib_wc *wc,		\
23158f10ad4SChuck Lever 					const struct rpcrdma_frwr *frwr	\
23258f10ad4SChuck Lever 				),					\
23358f10ad4SChuck Lever 				TP_ARGS(wc, frwr))
23458f10ad4SChuck Lever 
2352937fedeSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_mr,
2362937fedeSChuck Lever 	TP_PROTO(
2372937fedeSChuck Lever 		const struct rpcrdma_mr *mr
2382937fedeSChuck Lever 	),
2392937fedeSChuck Lever 
2402937fedeSChuck Lever 	TP_ARGS(mr),
2412937fedeSChuck Lever 
2422937fedeSChuck Lever 	TP_STRUCT__entry(
2432937fedeSChuck Lever 		__field(const void *, mr)
2442937fedeSChuck Lever 		__field(u32, handle)
2452937fedeSChuck Lever 		__field(u32, length)
2462937fedeSChuck Lever 		__field(u64, offset)
2472937fedeSChuck Lever 	),
2482937fedeSChuck Lever 
2492937fedeSChuck Lever 	TP_fast_assign(
2502937fedeSChuck Lever 		__entry->mr = mr;
2512937fedeSChuck Lever 		__entry->handle = mr->mr_handle;
2522937fedeSChuck Lever 		__entry->length = mr->mr_length;
2532937fedeSChuck Lever 		__entry->offset = mr->mr_offset;
2542937fedeSChuck Lever 	),
2552937fedeSChuck Lever 
2562937fedeSChuck Lever 	TP_printk("mr=%p %u@0x%016llx:0x%08x",
2572937fedeSChuck Lever 		__entry->mr, __entry->length,
2582937fedeSChuck Lever 		(unsigned long long)__entry->offset,
2592937fedeSChuck Lever 		__entry->handle
2602937fedeSChuck Lever 	)
2612937fedeSChuck Lever );
2622937fedeSChuck Lever 
2632937fedeSChuck Lever #define DEFINE_MR_EVENT(name) \
2642937fedeSChuck Lever 		DEFINE_EVENT(xprtrdma_mr, name, \
2652937fedeSChuck Lever 				TP_PROTO( \
2662937fedeSChuck Lever 					const struct rpcrdma_mr *mr \
2672937fedeSChuck Lever 				), \
2682937fedeSChuck Lever 				TP_ARGS(mr))
2692937fedeSChuck Lever 
270b4a7f91cSChuck Lever /**
271ab03eff5SChuck Lever  ** Call events
272ab03eff5SChuck Lever  **/
273ab03eff5SChuck Lever 
2741c443effSChuck Lever TRACE_EVENT(xprtrdma_createmrs,
2751c443effSChuck Lever 	TP_PROTO(
2761c443effSChuck Lever 		const struct rpcrdma_xprt *r_xprt,
2771c443effSChuck Lever 		unsigned int count
2781c443effSChuck Lever 	),
2791c443effSChuck Lever 
2801c443effSChuck Lever 	TP_ARGS(r_xprt, count),
2811c443effSChuck Lever 
2821c443effSChuck Lever 	TP_STRUCT__entry(
2831c443effSChuck Lever 		__field(const void *, r_xprt)
2841c443effSChuck Lever 		__field(unsigned int, count)
2851c443effSChuck Lever 	),
2861c443effSChuck Lever 
2871c443effSChuck Lever 	TP_fast_assign(
2881c443effSChuck Lever 		__entry->r_xprt = r_xprt;
2891c443effSChuck Lever 		__entry->count = count;
2901c443effSChuck Lever 	),
2911c443effSChuck Lever 
2921c443effSChuck Lever 	TP_printk("r_xprt=%p: created %u MRs",
2931c443effSChuck Lever 		__entry->r_xprt, __entry->count
2941c443effSChuck Lever 	)
2951c443effSChuck Lever );
2961c443effSChuck Lever 
2971c443effSChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_nomrs);
2981c443effSChuck Lever 
29958f10ad4SChuck Lever DEFINE_RDCH_EVENT(xprtrdma_read_chunk);
30058f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_write_chunk);
30158f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_reply_chunk);
30258f10ad4SChuck Lever 
303ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_noch);
304ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_readch);
305ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_areadch);
306ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_writech);
307ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_replych);
308ab03eff5SChuck Lever 
309ab03eff5SChuck Lever #define xprtrdma_show_chunktype(x)					\
310ab03eff5SChuck Lever 		__print_symbolic(x,					\
311ab03eff5SChuck Lever 				{ rpcrdma_noch, "inline" },		\
312ab03eff5SChuck Lever 				{ rpcrdma_readch, "read list" },	\
313ab03eff5SChuck Lever 				{ rpcrdma_areadch, "*read list" },	\
314ab03eff5SChuck Lever 				{ rpcrdma_writech, "write list" },	\
315ab03eff5SChuck Lever 				{ rpcrdma_replych, "reply chunk" })
316ab03eff5SChuck Lever 
317ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_marshal,
318ab03eff5SChuck Lever 	TP_PROTO(
319ab03eff5SChuck Lever 		const struct rpc_rqst *rqst,
320ab03eff5SChuck Lever 		unsigned int hdrlen,
321ab03eff5SChuck Lever 		unsigned int rtype,
322ab03eff5SChuck Lever 		unsigned int wtype
323ab03eff5SChuck Lever 	),
324ab03eff5SChuck Lever 
325ab03eff5SChuck Lever 	TP_ARGS(rqst, hdrlen, rtype, wtype),
326ab03eff5SChuck Lever 
327ab03eff5SChuck Lever 	TP_STRUCT__entry(
328ab03eff5SChuck Lever 		__field(unsigned int, task_id)
329ab03eff5SChuck Lever 		__field(unsigned int, client_id)
330ab03eff5SChuck Lever 		__field(u32, xid)
331ab03eff5SChuck Lever 		__field(unsigned int, hdrlen)
332ab03eff5SChuck Lever 		__field(unsigned int, headlen)
333ab03eff5SChuck Lever 		__field(unsigned int, pagelen)
334ab03eff5SChuck Lever 		__field(unsigned int, taillen)
335ab03eff5SChuck Lever 		__field(unsigned int, rtype)
336ab03eff5SChuck Lever 		__field(unsigned int, wtype)
337ab03eff5SChuck Lever 	),
338ab03eff5SChuck Lever 
339ab03eff5SChuck Lever 	TP_fast_assign(
340ab03eff5SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
341ab03eff5SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
342ab03eff5SChuck Lever 		__entry->xid = be32_to_cpu(rqst->rq_xid);
343ab03eff5SChuck Lever 		__entry->hdrlen = hdrlen;
344ab03eff5SChuck Lever 		__entry->headlen = rqst->rq_snd_buf.head[0].iov_len;
345ab03eff5SChuck Lever 		__entry->pagelen = rqst->rq_snd_buf.page_len;
346ab03eff5SChuck Lever 		__entry->taillen = rqst->rq_snd_buf.tail[0].iov_len;
347ab03eff5SChuck Lever 		__entry->rtype = rtype;
348ab03eff5SChuck Lever 		__entry->wtype = wtype;
349ab03eff5SChuck Lever 	),
350ab03eff5SChuck Lever 
351ab03eff5SChuck Lever 	TP_printk("task:%u@%u xid=0x%08x: hdr=%u xdr=%u/%u/%u %s/%s",
352ab03eff5SChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
353ab03eff5SChuck Lever 		__entry->hdrlen,
354ab03eff5SChuck Lever 		__entry->headlen, __entry->pagelen, __entry->taillen,
355ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->rtype),
356ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->wtype)
357ab03eff5SChuck Lever 	)
358ab03eff5SChuck Lever );
359ab03eff5SChuck Lever 
360ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_post_send,
361ab03eff5SChuck Lever 	TP_PROTO(
362ab03eff5SChuck Lever 		const struct rpcrdma_req *req,
363ab03eff5SChuck Lever 		int status
364ab03eff5SChuck Lever 	),
365ab03eff5SChuck Lever 
366ab03eff5SChuck Lever 	TP_ARGS(req, status),
367ab03eff5SChuck Lever 
368ab03eff5SChuck Lever 	TP_STRUCT__entry(
369ab03eff5SChuck Lever 		__field(const void *, req)
370ab03eff5SChuck Lever 		__field(int, num_sge)
371ab03eff5SChuck Lever 		__field(bool, signaled)
372ab03eff5SChuck Lever 		__field(int, status)
373ab03eff5SChuck Lever 	),
374ab03eff5SChuck Lever 
375ab03eff5SChuck Lever 	TP_fast_assign(
376ab03eff5SChuck Lever 		__entry->req = req;
377ab03eff5SChuck Lever 		__entry->num_sge = req->rl_sendctx->sc_wr.num_sge;
378ab03eff5SChuck Lever 		__entry->signaled = req->rl_sendctx->sc_wr.send_flags &
379ab03eff5SChuck Lever 				    IB_SEND_SIGNALED;
380ab03eff5SChuck Lever 		__entry->status = status;
381ab03eff5SChuck Lever 	),
382ab03eff5SChuck Lever 
383ab03eff5SChuck Lever 	TP_printk("req=%p, %d SGEs%s, status=%d",
384ab03eff5SChuck Lever 		__entry->req, __entry->num_sge,
385ab03eff5SChuck Lever 		(__entry->signaled ? ", signaled" : ""),
386ab03eff5SChuck Lever 		__entry->status
387ab03eff5SChuck Lever 	)
388ab03eff5SChuck Lever );
389ab03eff5SChuck Lever 
390b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_post_recv,
391b4a7f91cSChuck Lever 	TP_PROTO(
392b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
393b4a7f91cSChuck Lever 		int status
394b4a7f91cSChuck Lever 	),
395b4a7f91cSChuck Lever 
396b4a7f91cSChuck Lever 	TP_ARGS(rep, status),
397b4a7f91cSChuck Lever 
398b4a7f91cSChuck Lever 	TP_STRUCT__entry(
399b4a7f91cSChuck Lever 		__field(const void *, rep)
400b4a7f91cSChuck Lever 		__field(int, status)
401b4a7f91cSChuck Lever 	),
402b4a7f91cSChuck Lever 
403b4a7f91cSChuck Lever 	TP_fast_assign(
404b4a7f91cSChuck Lever 		__entry->rep = rep;
405b4a7f91cSChuck Lever 		__entry->status = status;
406b4a7f91cSChuck Lever 	),
407b4a7f91cSChuck Lever 
408b4a7f91cSChuck Lever 	TP_printk("rep=%p status=%d",
409b4a7f91cSChuck Lever 		__entry->rep, __entry->status
410b4a7f91cSChuck Lever 	)
411b4a7f91cSChuck Lever );
412b4a7f91cSChuck Lever 
413ab03eff5SChuck Lever /**
414ab03eff5SChuck Lever  ** Completion events
415ab03eff5SChuck Lever  **/
416ab03eff5SChuck Lever 
417ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_wc_send,
418ab03eff5SChuck Lever 	TP_PROTO(
419ab03eff5SChuck Lever 		const struct rpcrdma_sendctx *sc,
420ab03eff5SChuck Lever 		const struct ib_wc *wc
421ab03eff5SChuck Lever 	),
422ab03eff5SChuck Lever 
423ab03eff5SChuck Lever 	TP_ARGS(sc, wc),
424ab03eff5SChuck Lever 
425ab03eff5SChuck Lever 	TP_STRUCT__entry(
426ab03eff5SChuck Lever 		__field(const void *, req)
427ab03eff5SChuck Lever 		__field(unsigned int, unmap_count)
428ab03eff5SChuck Lever 		__field(unsigned int, status)
429ab03eff5SChuck Lever 		__field(unsigned int, vendor_err)
430ab03eff5SChuck Lever 	),
431ab03eff5SChuck Lever 
432ab03eff5SChuck Lever 	TP_fast_assign(
433ab03eff5SChuck Lever 		__entry->req = sc->sc_req;
434ab03eff5SChuck Lever 		__entry->unmap_count = sc->sc_unmap_count;
435ab03eff5SChuck Lever 		__entry->status = wc->status;
436ab03eff5SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
437ab03eff5SChuck Lever 	),
438ab03eff5SChuck Lever 
439ab03eff5SChuck Lever 	TP_printk("req=%p, unmapped %u pages: %s (%u/0x%x)",
440ab03eff5SChuck Lever 		__entry->req, __entry->unmap_count,
441ab03eff5SChuck Lever 		rdma_show_wc_status(__entry->status),
442ab03eff5SChuck Lever 		__entry->status, __entry->vendor_err
443ab03eff5SChuck Lever 	)
444ab03eff5SChuck Lever );
445ab03eff5SChuck Lever 
446b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_wc_receive,
447b4a7f91cSChuck Lever 	TP_PROTO(
448b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
449b4a7f91cSChuck Lever 		const struct ib_wc *wc
450b4a7f91cSChuck Lever 	),
451b4a7f91cSChuck Lever 
452b4a7f91cSChuck Lever 	TP_ARGS(rep, wc),
453b4a7f91cSChuck Lever 
454b4a7f91cSChuck Lever 	TP_STRUCT__entry(
455b4a7f91cSChuck Lever 		__field(const void *, rep)
456b4a7f91cSChuck Lever 		__field(unsigned int, byte_len)
457b4a7f91cSChuck Lever 		__field(unsigned int, status)
458b4a7f91cSChuck Lever 		__field(unsigned int, vendor_err)
459b4a7f91cSChuck Lever 	),
460b4a7f91cSChuck Lever 
461b4a7f91cSChuck Lever 	TP_fast_assign(
462b4a7f91cSChuck Lever 		__entry->rep = rep;
463b4a7f91cSChuck Lever 		__entry->byte_len = wc->byte_len;
464b4a7f91cSChuck Lever 		__entry->status = wc->status;
465b4a7f91cSChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
466b4a7f91cSChuck Lever 	),
467b4a7f91cSChuck Lever 
468b4a7f91cSChuck Lever 	TP_printk("rep=%p, %u bytes: %s (%u/0x%x)",
469b4a7f91cSChuck Lever 		__entry->rep, __entry->byte_len,
470b4a7f91cSChuck Lever 		rdma_show_wc_status(__entry->status),
471b4a7f91cSChuck Lever 		__entry->status, __entry->vendor_err
472b4a7f91cSChuck Lever 	)
473b4a7f91cSChuck Lever );
474b4a7f91cSChuck Lever 
47558f10ad4SChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_fastreg);
4762937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li);
4772937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li_wake);
4782937fedeSChuck Lever 
4792937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_localinv);
4802937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_dma_unmap);
4812937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_remoteinv);
4821c443effSChuck Lever DEFINE_MR_EVENT(xprtrdma_recover_mr);
48358f10ad4SChuck Lever 
484b4a7f91cSChuck Lever /**
485b4a7f91cSChuck Lever  ** Reply events
486b4a7f91cSChuck Lever  **/
487b4a7f91cSChuck Lever 
488b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_reply,
489b4a7f91cSChuck Lever 	TP_PROTO(
490b4a7f91cSChuck Lever 		const struct rpc_task *task,
491b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
492b4a7f91cSChuck Lever 		const struct rpcrdma_req *req,
493b4a7f91cSChuck Lever 		unsigned int credits
494b4a7f91cSChuck Lever 	),
495b4a7f91cSChuck Lever 
496b4a7f91cSChuck Lever 	TP_ARGS(task, rep, req, credits),
497b4a7f91cSChuck Lever 
498b4a7f91cSChuck Lever 	TP_STRUCT__entry(
499b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
500b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
501b4a7f91cSChuck Lever 		__field(const void *, rep)
502b4a7f91cSChuck Lever 		__field(const void *, req)
503b4a7f91cSChuck Lever 		__field(u32, xid)
504b4a7f91cSChuck Lever 		__field(unsigned int, credits)
505b4a7f91cSChuck Lever 	),
506b4a7f91cSChuck Lever 
507b4a7f91cSChuck Lever 	TP_fast_assign(
508b4a7f91cSChuck Lever 		__entry->task_id = task->tk_pid;
509b4a7f91cSChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
510b4a7f91cSChuck Lever 		__entry->rep = rep;
511b4a7f91cSChuck Lever 		__entry->req = req;
512b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
513b4a7f91cSChuck Lever 		__entry->credits = credits;
514b4a7f91cSChuck Lever 	),
515b4a7f91cSChuck Lever 
516b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x, %u credits, rep=%p -> req=%p",
517b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
518b4a7f91cSChuck Lever 		__entry->credits, __entry->rep, __entry->req
519b4a7f91cSChuck Lever 	)
520b4a7f91cSChuck Lever );
521b4a7f91cSChuck Lever 
522b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_defer_cmp,
523b4a7f91cSChuck Lever 	TP_PROTO(
524b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep
525b4a7f91cSChuck Lever 	),
526b4a7f91cSChuck Lever 
527b4a7f91cSChuck Lever 	TP_ARGS(rep),
528b4a7f91cSChuck Lever 
529b4a7f91cSChuck Lever 	TP_STRUCT__entry(
530b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
531b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
532b4a7f91cSChuck Lever 		__field(const void *, rep)
533b4a7f91cSChuck Lever 		__field(u32, xid)
534b4a7f91cSChuck Lever 	),
535b4a7f91cSChuck Lever 
536b4a7f91cSChuck Lever 	TP_fast_assign(
537b4a7f91cSChuck Lever 		__entry->task_id = rep->rr_rqst->rq_task->tk_pid;
538b4a7f91cSChuck Lever 		__entry->client_id = rep->rr_rqst->rq_task->tk_client->cl_clid;
539b4a7f91cSChuck Lever 		__entry->rep = rep;
540b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
541b4a7f91cSChuck Lever 	),
542b4a7f91cSChuck Lever 
543b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x rep=%p",
544b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
545b4a7f91cSChuck Lever 		__entry->rep
546b4a7f91cSChuck Lever 	)
547b4a7f91cSChuck Lever );
548b4a7f91cSChuck Lever 
549b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_vers);
550b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_rqst);
551b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_short);
552b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_hdr);
553b4a7f91cSChuck Lever 
554e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup,
555e11b7c96SChuck Lever 	TP_PROTO(
556e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
557e11b7c96SChuck Lever 		int len,
558e11b7c96SChuck Lever 		int hdrlen
559e11b7c96SChuck Lever 	),
560e11b7c96SChuck Lever 
561e11b7c96SChuck Lever 	TP_ARGS(rqst, len, hdrlen),
562e11b7c96SChuck Lever 
563e11b7c96SChuck Lever 	TP_STRUCT__entry(
564e11b7c96SChuck Lever 		__field(unsigned int, task_id)
565e11b7c96SChuck Lever 		__field(unsigned int, client_id)
566e11b7c96SChuck Lever 		__field(const void *, base)
567e11b7c96SChuck Lever 		__field(int, len)
568e11b7c96SChuck Lever 		__field(int, hdrlen)
569e11b7c96SChuck Lever 	),
570e11b7c96SChuck Lever 
571e11b7c96SChuck Lever 	TP_fast_assign(
572e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
573e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
574e11b7c96SChuck Lever 		__entry->base = rqst->rq_rcv_buf.head[0].iov_base;
575e11b7c96SChuck Lever 		__entry->len = len;
576e11b7c96SChuck Lever 		__entry->hdrlen = hdrlen;
577e11b7c96SChuck Lever 	),
578e11b7c96SChuck Lever 
579e11b7c96SChuck Lever 	TP_printk("task:%u@%u base=%p len=%d hdrlen=%d",
580e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
581e11b7c96SChuck Lever 		__entry->base, __entry->len, __entry->hdrlen
582e11b7c96SChuck Lever 	)
583e11b7c96SChuck Lever );
584e11b7c96SChuck Lever 
585e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup_pg,
586e11b7c96SChuck Lever 	TP_PROTO(
587e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
588e11b7c96SChuck Lever 		int pageno,
589e11b7c96SChuck Lever 		const void *pos,
590e11b7c96SChuck Lever 		int len,
591e11b7c96SChuck Lever 		int curlen
592e11b7c96SChuck Lever 	),
593e11b7c96SChuck Lever 
594e11b7c96SChuck Lever 	TP_ARGS(rqst, pageno, pos, len, curlen),
595e11b7c96SChuck Lever 
596e11b7c96SChuck Lever 	TP_STRUCT__entry(
597e11b7c96SChuck Lever 		__field(unsigned int, task_id)
598e11b7c96SChuck Lever 		__field(unsigned int, client_id)
599e11b7c96SChuck Lever 		__field(const void *, pos)
600e11b7c96SChuck Lever 		__field(int, pageno)
601e11b7c96SChuck Lever 		__field(int, len)
602e11b7c96SChuck Lever 		__field(int, curlen)
603e11b7c96SChuck Lever 	),
604e11b7c96SChuck Lever 
605e11b7c96SChuck Lever 	TP_fast_assign(
606e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
607e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
608e11b7c96SChuck Lever 		__entry->pos = pos;
609e11b7c96SChuck Lever 		__entry->pageno = pageno;
610e11b7c96SChuck Lever 		__entry->len = len;
611e11b7c96SChuck Lever 		__entry->curlen = curlen;
612e11b7c96SChuck Lever 	),
613e11b7c96SChuck Lever 
614e11b7c96SChuck Lever 	TP_printk("task:%u@%u pageno=%d pos=%p len=%d curlen=%d",
615e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
616e11b7c96SChuck Lever 		__entry->pageno, __entry->pos, __entry->len, __entry->curlen
617e11b7c96SChuck Lever 	)
618e11b7c96SChuck Lever );
619e11b7c96SChuck Lever 
620e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_decode_seg,
621e11b7c96SChuck Lever 	TP_PROTO(
622e11b7c96SChuck Lever 		u32 handle,
623e11b7c96SChuck Lever 		u32 length,
624e11b7c96SChuck Lever 		u64 offset
625e11b7c96SChuck Lever 	),
626e11b7c96SChuck Lever 
627e11b7c96SChuck Lever 	TP_ARGS(handle, length, offset),
628e11b7c96SChuck Lever 
629e11b7c96SChuck Lever 	TP_STRUCT__entry(
630e11b7c96SChuck Lever 		__field(u32, handle)
631e11b7c96SChuck Lever 		__field(u32, length)
632e11b7c96SChuck Lever 		__field(u64, offset)
633e11b7c96SChuck Lever 	),
634e11b7c96SChuck Lever 
635e11b7c96SChuck Lever 	TP_fast_assign(
636e11b7c96SChuck Lever 		__entry->handle = handle;
637e11b7c96SChuck Lever 		__entry->length = length;
638e11b7c96SChuck Lever 		__entry->offset = offset;
639e11b7c96SChuck Lever 	),
640e11b7c96SChuck Lever 
641e11b7c96SChuck Lever 	TP_printk("%u@0x%016llx:0x%08x",
642e11b7c96SChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
643e11b7c96SChuck Lever 		__entry->handle
644e11b7c96SChuck Lever 	)
645e11b7c96SChuck Lever );
646e11b7c96SChuck Lever 
647e48f083eSChuck Lever #endif /* _TRACE_RPCRDMA_H */
648e48f083eSChuck Lever 
649e48f083eSChuck Lever #include <trace/define_trace.h>
650