xref: /openbmc/linux/include/trace/events/rpcrdma.h (revision bd2abef3)
1e48f083eSChuck Lever /* SPDX-License-Identifier: GPL-2.0 */
2e48f083eSChuck Lever /*
398895edbSChuck Lever  * Copyright (c) 2017, 2018 Oracle.  All rights reserved.
498895edbSChuck Lever  *
598895edbSChuck Lever  * Trace point definitions for the "rpcrdma" subsystem.
6e48f083eSChuck Lever  */
7e48f083eSChuck Lever #undef TRACE_SYSTEM
8e48f083eSChuck Lever #define TRACE_SYSTEM rpcrdma
9e48f083eSChuck Lever 
10e48f083eSChuck Lever #if !defined(_TRACE_RPCRDMA_H) || defined(TRACE_HEADER_MULTI_READ)
11e48f083eSChuck Lever #define _TRACE_RPCRDMA_H
12e48f083eSChuck Lever 
13e48f083eSChuck Lever #include <linux/tracepoint.h>
14e48f083eSChuck Lever #include <trace/events/rdma.h>
15e48f083eSChuck Lever 
16ab03eff5SChuck Lever /**
17b4a7f91cSChuck Lever  ** Event classes
18b4a7f91cSChuck Lever  **/
19b4a7f91cSChuck Lever 
20b4a7f91cSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_reply_event,
21b4a7f91cSChuck Lever 	TP_PROTO(
22b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep
23b4a7f91cSChuck Lever 	),
24b4a7f91cSChuck Lever 
25b4a7f91cSChuck Lever 	TP_ARGS(rep),
26b4a7f91cSChuck Lever 
27b4a7f91cSChuck Lever 	TP_STRUCT__entry(
28b4a7f91cSChuck Lever 		__field(const void *, rep)
29b4a7f91cSChuck Lever 		__field(const void *, r_xprt)
30b4a7f91cSChuck Lever 		__field(u32, xid)
31b4a7f91cSChuck Lever 		__field(u32, version)
32b4a7f91cSChuck Lever 		__field(u32, proc)
33b4a7f91cSChuck Lever 	),
34b4a7f91cSChuck Lever 
35b4a7f91cSChuck Lever 	TP_fast_assign(
36b4a7f91cSChuck Lever 		__entry->rep = rep;
37b4a7f91cSChuck Lever 		__entry->r_xprt = rep->rr_rxprt;
38b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
39b4a7f91cSChuck Lever 		__entry->version = be32_to_cpu(rep->rr_vers);
40b4a7f91cSChuck Lever 		__entry->proc = be32_to_cpu(rep->rr_proc);
41b4a7f91cSChuck Lever 	),
42b4a7f91cSChuck Lever 
43b4a7f91cSChuck Lever 	TP_printk("rxprt %p xid=0x%08x rep=%p: version %u proc %u",
44b4a7f91cSChuck Lever 		__entry->r_xprt, __entry->xid, __entry->rep,
45b4a7f91cSChuck Lever 		__entry->version, __entry->proc
46b4a7f91cSChuck Lever 	)
47b4a7f91cSChuck Lever );
48b4a7f91cSChuck Lever 
49b4a7f91cSChuck Lever #define DEFINE_REPLY_EVENT(name)					\
50b4a7f91cSChuck Lever 		DEFINE_EVENT(xprtrdma_reply_event, name,		\
51b4a7f91cSChuck Lever 				TP_PROTO(				\
52b4a7f91cSChuck Lever 					const struct rpcrdma_rep *rep	\
53b4a7f91cSChuck Lever 				),					\
54b4a7f91cSChuck Lever 				TP_ARGS(rep))
55b4a7f91cSChuck Lever 
561c443effSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_rxprt,
571c443effSChuck Lever 	TP_PROTO(
581c443effSChuck Lever 		const struct rpcrdma_xprt *r_xprt
591c443effSChuck Lever 	),
601c443effSChuck Lever 
611c443effSChuck Lever 	TP_ARGS(r_xprt),
621c443effSChuck Lever 
631c443effSChuck Lever 	TP_STRUCT__entry(
641c443effSChuck Lever 		__field(const void *, r_xprt)
651c443effSChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
661c443effSChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
671c443effSChuck Lever 	),
681c443effSChuck Lever 
691c443effSChuck Lever 	TP_fast_assign(
701c443effSChuck Lever 		__entry->r_xprt = r_xprt;
711c443effSChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
721c443effSChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
731c443effSChuck Lever 	),
741c443effSChuck Lever 
751c443effSChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p",
761c443effSChuck Lever 		__get_str(addr), __get_str(port), __entry->r_xprt
771c443effSChuck Lever 	)
781c443effSChuck Lever );
791c443effSChuck Lever 
801c443effSChuck Lever #define DEFINE_RXPRT_EVENT(name)					\
811c443effSChuck Lever 		DEFINE_EVENT(xprtrdma_rxprt, name,			\
821c443effSChuck Lever 				TP_PROTO(				\
831c443effSChuck Lever 					const struct rpcrdma_xprt *r_xprt \
841c443effSChuck Lever 				),					\
851c443effSChuck Lever 				TP_ARGS(r_xprt))
861c443effSChuck Lever 
8758f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_rdch_event,
8858f10ad4SChuck Lever 	TP_PROTO(
8958f10ad4SChuck Lever 		const struct rpc_task *task,
9058f10ad4SChuck Lever 		unsigned int pos,
9158f10ad4SChuck Lever 		struct rpcrdma_mr *mr,
9258f10ad4SChuck Lever 		int nsegs
9358f10ad4SChuck Lever 	),
9458f10ad4SChuck Lever 
9558f10ad4SChuck Lever 	TP_ARGS(task, pos, mr, nsegs),
9658f10ad4SChuck Lever 
9758f10ad4SChuck Lever 	TP_STRUCT__entry(
9858f10ad4SChuck Lever 		__field(unsigned int, task_id)
9958f10ad4SChuck Lever 		__field(unsigned int, client_id)
10058f10ad4SChuck Lever 		__field(const void *, mr)
10158f10ad4SChuck Lever 		__field(unsigned int, pos)
10258f10ad4SChuck Lever 		__field(int, nents)
10358f10ad4SChuck Lever 		__field(u32, handle)
10458f10ad4SChuck Lever 		__field(u32, length)
10558f10ad4SChuck Lever 		__field(u64, offset)
10658f10ad4SChuck Lever 		__field(int, nsegs)
10758f10ad4SChuck Lever 	),
10858f10ad4SChuck Lever 
10958f10ad4SChuck Lever 	TP_fast_assign(
11058f10ad4SChuck Lever 		__entry->task_id = task->tk_pid;
11158f10ad4SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
11258f10ad4SChuck Lever 		__entry->mr = mr;
11358f10ad4SChuck Lever 		__entry->pos = pos;
11458f10ad4SChuck Lever 		__entry->nents = mr->mr_nents;
11558f10ad4SChuck Lever 		__entry->handle = mr->mr_handle;
11658f10ad4SChuck Lever 		__entry->length = mr->mr_length;
11758f10ad4SChuck Lever 		__entry->offset = mr->mr_offset;
11858f10ad4SChuck Lever 		__entry->nsegs = nsegs;
11958f10ad4SChuck Lever 	),
12058f10ad4SChuck Lever 
12158f10ad4SChuck Lever 	TP_printk("task:%u@%u mr=%p pos=%u %u@0x%016llx:0x%08x (%s)",
12258f10ad4SChuck Lever 		__entry->task_id, __entry->client_id, __entry->mr,
12358f10ad4SChuck Lever 		__entry->pos, __entry->length,
12458f10ad4SChuck Lever 		(unsigned long long)__entry->offset, __entry->handle,
12558f10ad4SChuck Lever 		__entry->nents < __entry->nsegs ? "more" : "last"
12658f10ad4SChuck Lever 	)
12758f10ad4SChuck Lever );
12858f10ad4SChuck Lever 
12958f10ad4SChuck Lever #define DEFINE_RDCH_EVENT(name)						\
13058f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_rdch_event, name,			\
13158f10ad4SChuck Lever 				TP_PROTO(				\
13258f10ad4SChuck Lever 					const struct rpc_task *task,	\
13358f10ad4SChuck Lever 					unsigned int pos,		\
13458f10ad4SChuck Lever 					struct rpcrdma_mr *mr,		\
13558f10ad4SChuck Lever 					int nsegs			\
13658f10ad4SChuck Lever 				),					\
13758f10ad4SChuck Lever 				TP_ARGS(task, pos, mr, nsegs))
13858f10ad4SChuck Lever 
13958f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_wrch_event,
14058f10ad4SChuck Lever 	TP_PROTO(
14158f10ad4SChuck Lever 		const struct rpc_task *task,
14258f10ad4SChuck Lever 		struct rpcrdma_mr *mr,
14358f10ad4SChuck Lever 		int nsegs
14458f10ad4SChuck Lever 	),
14558f10ad4SChuck Lever 
14658f10ad4SChuck Lever 	TP_ARGS(task, mr, nsegs),
14758f10ad4SChuck Lever 
14858f10ad4SChuck Lever 	TP_STRUCT__entry(
14958f10ad4SChuck Lever 		__field(unsigned int, task_id)
15058f10ad4SChuck Lever 		__field(unsigned int, client_id)
15158f10ad4SChuck Lever 		__field(const void *, mr)
15258f10ad4SChuck Lever 		__field(int, nents)
15358f10ad4SChuck Lever 		__field(u32, handle)
15458f10ad4SChuck Lever 		__field(u32, length)
15558f10ad4SChuck Lever 		__field(u64, offset)
15658f10ad4SChuck Lever 		__field(int, nsegs)
15758f10ad4SChuck Lever 	),
15858f10ad4SChuck Lever 
15958f10ad4SChuck Lever 	TP_fast_assign(
16058f10ad4SChuck Lever 		__entry->task_id = task->tk_pid;
16158f10ad4SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
16258f10ad4SChuck Lever 		__entry->mr = mr;
16358f10ad4SChuck Lever 		__entry->nents = mr->mr_nents;
16458f10ad4SChuck Lever 		__entry->handle = mr->mr_handle;
16558f10ad4SChuck Lever 		__entry->length = mr->mr_length;
16658f10ad4SChuck Lever 		__entry->offset = mr->mr_offset;
16758f10ad4SChuck Lever 		__entry->nsegs = nsegs;
16858f10ad4SChuck Lever 	),
16958f10ad4SChuck Lever 
17058f10ad4SChuck Lever 	TP_printk("task:%u@%u mr=%p %u@0x%016llx:0x%08x (%s)",
17158f10ad4SChuck Lever 		__entry->task_id, __entry->client_id, __entry->mr,
17258f10ad4SChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
17358f10ad4SChuck Lever 		__entry->handle,
17458f10ad4SChuck Lever 		__entry->nents < __entry->nsegs ? "more" : "last"
17558f10ad4SChuck Lever 	)
17658f10ad4SChuck Lever );
17758f10ad4SChuck Lever 
17858f10ad4SChuck Lever #define DEFINE_WRCH_EVENT(name)						\
17958f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_wrch_event, name,			\
18058f10ad4SChuck Lever 				TP_PROTO(				\
18158f10ad4SChuck Lever 					const struct rpc_task *task,	\
18258f10ad4SChuck Lever 					struct rpcrdma_mr *mr,		\
18358f10ad4SChuck Lever 					int nsegs			\
18458f10ad4SChuck Lever 				),					\
18558f10ad4SChuck Lever 				TP_ARGS(task, mr, nsegs))
18658f10ad4SChuck Lever 
18758f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_INVALID);
18858f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_VALID);
18958f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_FR);
19058f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_LI);
19158f10ad4SChuck Lever 
19258f10ad4SChuck Lever #define xprtrdma_show_frwr_state(x)					\
19358f10ad4SChuck Lever 		__print_symbolic(x,					\
19458f10ad4SChuck Lever 				{ FRWR_IS_INVALID, "INVALID" },		\
19558f10ad4SChuck Lever 				{ FRWR_IS_VALID, "VALID" },		\
19658f10ad4SChuck Lever 				{ FRWR_FLUSHED_FR, "FLUSHED_FR" },	\
19758f10ad4SChuck Lever 				{ FRWR_FLUSHED_LI, "FLUSHED_LI" })
19858f10ad4SChuck Lever 
19958f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_frwr_done,
20058f10ad4SChuck Lever 	TP_PROTO(
20158f10ad4SChuck Lever 		const struct ib_wc *wc,
20258f10ad4SChuck Lever 		const struct rpcrdma_frwr *frwr
20358f10ad4SChuck Lever 	),
20458f10ad4SChuck Lever 
20558f10ad4SChuck Lever 	TP_ARGS(wc, frwr),
20658f10ad4SChuck Lever 
20758f10ad4SChuck Lever 	TP_STRUCT__entry(
20858f10ad4SChuck Lever 		__field(const void *, mr)
20958f10ad4SChuck Lever 		__field(unsigned int, state)
21058f10ad4SChuck Lever 		__field(unsigned int, status)
21158f10ad4SChuck Lever 		__field(unsigned int, vendor_err)
21258f10ad4SChuck Lever 	),
21358f10ad4SChuck Lever 
21458f10ad4SChuck Lever 	TP_fast_assign(
21558f10ad4SChuck Lever 		__entry->mr = container_of(frwr, struct rpcrdma_mr, frwr);
21658f10ad4SChuck Lever 		__entry->state = frwr->fr_state;
21758f10ad4SChuck Lever 		__entry->status = wc->status;
21858f10ad4SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
21958f10ad4SChuck Lever 	),
22058f10ad4SChuck Lever 
22158f10ad4SChuck Lever 	TP_printk(
22258f10ad4SChuck Lever 		"mr=%p state=%s: %s (%u/0x%x)",
22358f10ad4SChuck Lever 		__entry->mr, xprtrdma_show_frwr_state(__entry->state),
22458f10ad4SChuck Lever 		rdma_show_wc_status(__entry->status),
22558f10ad4SChuck Lever 		__entry->status, __entry->vendor_err
22658f10ad4SChuck Lever 	)
22758f10ad4SChuck Lever );
22858f10ad4SChuck Lever 
22958f10ad4SChuck Lever #define DEFINE_FRWR_DONE_EVENT(name)					\
23058f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_frwr_done, name,			\
23158f10ad4SChuck Lever 				TP_PROTO(				\
23258f10ad4SChuck Lever 					const struct ib_wc *wc,		\
23358f10ad4SChuck Lever 					const struct rpcrdma_frwr *frwr	\
23458f10ad4SChuck Lever 				),					\
23558f10ad4SChuck Lever 				TP_ARGS(wc, frwr))
23658f10ad4SChuck Lever 
2372937fedeSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_mr,
2382937fedeSChuck Lever 	TP_PROTO(
2392937fedeSChuck Lever 		const struct rpcrdma_mr *mr
2402937fedeSChuck Lever 	),
2412937fedeSChuck Lever 
2422937fedeSChuck Lever 	TP_ARGS(mr),
2432937fedeSChuck Lever 
2442937fedeSChuck Lever 	TP_STRUCT__entry(
2452937fedeSChuck Lever 		__field(const void *, mr)
2462937fedeSChuck Lever 		__field(u32, handle)
2472937fedeSChuck Lever 		__field(u32, length)
2482937fedeSChuck Lever 		__field(u64, offset)
2492937fedeSChuck Lever 	),
2502937fedeSChuck Lever 
2512937fedeSChuck Lever 	TP_fast_assign(
2522937fedeSChuck Lever 		__entry->mr = mr;
2532937fedeSChuck Lever 		__entry->handle = mr->mr_handle;
2542937fedeSChuck Lever 		__entry->length = mr->mr_length;
2552937fedeSChuck Lever 		__entry->offset = mr->mr_offset;
2562937fedeSChuck Lever 	),
2572937fedeSChuck Lever 
2582937fedeSChuck Lever 	TP_printk("mr=%p %u@0x%016llx:0x%08x",
2592937fedeSChuck Lever 		__entry->mr, __entry->length,
2602937fedeSChuck Lever 		(unsigned long long)__entry->offset,
2612937fedeSChuck Lever 		__entry->handle
2622937fedeSChuck Lever 	)
2632937fedeSChuck Lever );
2642937fedeSChuck Lever 
2652937fedeSChuck Lever #define DEFINE_MR_EVENT(name) \
2662937fedeSChuck Lever 		DEFINE_EVENT(xprtrdma_mr, name, \
2672937fedeSChuck Lever 				TP_PROTO( \
2682937fedeSChuck Lever 					const struct rpcrdma_mr *mr \
2692937fedeSChuck Lever 				), \
2702937fedeSChuck Lever 				TP_ARGS(mr))
2712937fedeSChuck Lever 
272fc1eb807SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_cb_event,
273fc1eb807SChuck Lever 	TP_PROTO(
274fc1eb807SChuck Lever 		const struct rpc_rqst *rqst
275fc1eb807SChuck Lever 	),
276fc1eb807SChuck Lever 
277fc1eb807SChuck Lever 	TP_ARGS(rqst),
278fc1eb807SChuck Lever 
279fc1eb807SChuck Lever 	TP_STRUCT__entry(
280fc1eb807SChuck Lever 		__field(const void *, rqst)
281fc1eb807SChuck Lever 		__field(const void *, rep)
282fc1eb807SChuck Lever 		__field(const void *, req)
283fc1eb807SChuck Lever 		__field(u32, xid)
284fc1eb807SChuck Lever 	),
285fc1eb807SChuck Lever 
286fc1eb807SChuck Lever 	TP_fast_assign(
287fc1eb807SChuck Lever 		__entry->rqst = rqst;
288fc1eb807SChuck Lever 		__entry->req = rpcr_to_rdmar(rqst);
289fc1eb807SChuck Lever 		__entry->rep = rpcr_to_rdmar(rqst)->rl_reply;
290fc1eb807SChuck Lever 		__entry->xid = be32_to_cpu(rqst->rq_xid);
291fc1eb807SChuck Lever 	),
292fc1eb807SChuck Lever 
293fc1eb807SChuck Lever 	TP_printk("xid=0x%08x, rqst=%p req=%p rep=%p",
294fc1eb807SChuck Lever 		__entry->xid, __entry->rqst, __entry->req, __entry->rep
295fc1eb807SChuck Lever 	)
296fc1eb807SChuck Lever );
297fc1eb807SChuck Lever 
298fc1eb807SChuck Lever #define DEFINE_CB_EVENT(name)						\
299fc1eb807SChuck Lever 		DEFINE_EVENT(xprtrdma_cb_event, name,			\
300fc1eb807SChuck Lever 				TP_PROTO(				\
301fc1eb807SChuck Lever 					const struct rpc_rqst *rqst	\
302fc1eb807SChuck Lever 				),					\
303fc1eb807SChuck Lever 				TP_ARGS(rqst))
304fc1eb807SChuck Lever 
305b4a7f91cSChuck Lever /**
306b4744e00SChuck Lever  ** Connection events
307b4744e00SChuck Lever  **/
308b4744e00SChuck Lever 
309b4744e00SChuck Lever TRACE_EVENT(xprtrdma_conn_upcall,
310b4744e00SChuck Lever 	TP_PROTO(
311b4744e00SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
312b4744e00SChuck Lever 		struct rdma_cm_event *event
313b4744e00SChuck Lever 	),
314b4744e00SChuck Lever 
315b4744e00SChuck Lever 	TP_ARGS(r_xprt, event),
316b4744e00SChuck Lever 
317b4744e00SChuck Lever 	TP_STRUCT__entry(
318b4744e00SChuck Lever 		__field(const void *, r_xprt)
319b4744e00SChuck Lever 		__field(unsigned int, event)
320b4744e00SChuck Lever 		__field(int, status)
321b4744e00SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
322b4744e00SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
323b4744e00SChuck Lever 	),
324b4744e00SChuck Lever 
325b4744e00SChuck Lever 	TP_fast_assign(
326b4744e00SChuck Lever 		__entry->r_xprt = r_xprt;
327b4744e00SChuck Lever 		__entry->event = event->event;
328b4744e00SChuck Lever 		__entry->status = event->status;
329b4744e00SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
330b4744e00SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
331b4744e00SChuck Lever 	),
332b4744e00SChuck Lever 
333b4744e00SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: %s (%u/%d)",
334b4744e00SChuck Lever 		__get_str(addr), __get_str(port),
335b4744e00SChuck Lever 		__entry->r_xprt, rdma_show_cm_event(__entry->event),
336b4744e00SChuck Lever 		__entry->event, __entry->status
337b4744e00SChuck Lever 	)
338b4744e00SChuck Lever );
339b4744e00SChuck Lever 
340b4744e00SChuck Lever TRACE_EVENT(xprtrdma_disconnect,
341b4744e00SChuck Lever 	TP_PROTO(
342b4744e00SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
343b4744e00SChuck Lever 		int status
344b4744e00SChuck Lever 	),
345b4744e00SChuck Lever 
346b4744e00SChuck Lever 	TP_ARGS(r_xprt, status),
347b4744e00SChuck Lever 
348b4744e00SChuck Lever 	TP_STRUCT__entry(
349b4744e00SChuck Lever 		__field(const void *, r_xprt)
350b4744e00SChuck Lever 		__field(int, status)
351b4744e00SChuck Lever 		__field(int, connected)
352b4744e00SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
353b4744e00SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
354b4744e00SChuck Lever 	),
355b4744e00SChuck Lever 
356b4744e00SChuck Lever 	TP_fast_assign(
357b4744e00SChuck Lever 		__entry->r_xprt = r_xprt;
358b4744e00SChuck Lever 		__entry->status = status;
359b4744e00SChuck Lever 		__entry->connected = r_xprt->rx_ep.rep_connected;
360b4744e00SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
361b4744e00SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
362b4744e00SChuck Lever 	),
363b4744e00SChuck Lever 
364b4744e00SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: status=%d %sconnected",
365b4744e00SChuck Lever 		__get_str(addr), __get_str(port),
366b4744e00SChuck Lever 		__entry->r_xprt, __entry->status,
367b4744e00SChuck Lever 		__entry->connected == 1 ? "still " : "dis"
368b4744e00SChuck Lever 	)
369b4744e00SChuck Lever );
370b4744e00SChuck Lever 
371b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_conn_start);
372b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_conn_tout);
373b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_create);
374b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_destroy);
375b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_remove);
376b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_reinsert);
377b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_reconnect);
378b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_inject_dsc);
379b4744e00SChuck Lever 
380643cf323SChuck Lever TRACE_EVENT(xprtrdma_qp_error,
381643cf323SChuck Lever 	TP_PROTO(
382643cf323SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
383643cf323SChuck Lever 		const struct ib_event *event
384643cf323SChuck Lever 	),
385643cf323SChuck Lever 
386643cf323SChuck Lever 	TP_ARGS(r_xprt, event),
387643cf323SChuck Lever 
388643cf323SChuck Lever 	TP_STRUCT__entry(
389643cf323SChuck Lever 		__field(const void *, r_xprt)
390643cf323SChuck Lever 		__field(unsigned int, event)
391643cf323SChuck Lever 		__string(name, event->device->name)
392643cf323SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
393643cf323SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
394643cf323SChuck Lever 	),
395643cf323SChuck Lever 
396643cf323SChuck Lever 	TP_fast_assign(
397643cf323SChuck Lever 		__entry->r_xprt = r_xprt;
398643cf323SChuck Lever 		__entry->event = event->event;
399643cf323SChuck Lever 		__assign_str(name, event->device->name);
400643cf323SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
401643cf323SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
402643cf323SChuck Lever 	),
403643cf323SChuck Lever 
404643cf323SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: dev %s: %s (%u)",
405643cf323SChuck Lever 		__get_str(addr), __get_str(port), __entry->r_xprt,
406643cf323SChuck Lever 		__get_str(name), rdma_show_ib_event(__entry->event),
407643cf323SChuck Lever 		__entry->event
408643cf323SChuck Lever 	)
409643cf323SChuck Lever );
410643cf323SChuck Lever 
411b4744e00SChuck Lever /**
412ab03eff5SChuck Lever  ** Call events
413ab03eff5SChuck Lever  **/
414ab03eff5SChuck Lever 
4151c443effSChuck Lever TRACE_EVENT(xprtrdma_createmrs,
4161c443effSChuck Lever 	TP_PROTO(
4171c443effSChuck Lever 		const struct rpcrdma_xprt *r_xprt,
4181c443effSChuck Lever 		unsigned int count
4191c443effSChuck Lever 	),
4201c443effSChuck Lever 
4211c443effSChuck Lever 	TP_ARGS(r_xprt, count),
4221c443effSChuck Lever 
4231c443effSChuck Lever 	TP_STRUCT__entry(
4241c443effSChuck Lever 		__field(const void *, r_xprt)
4251c443effSChuck Lever 		__field(unsigned int, count)
4261c443effSChuck Lever 	),
4271c443effSChuck Lever 
4281c443effSChuck Lever 	TP_fast_assign(
4291c443effSChuck Lever 		__entry->r_xprt = r_xprt;
4301c443effSChuck Lever 		__entry->count = count;
4311c443effSChuck Lever 	),
4321c443effSChuck Lever 
4331c443effSChuck Lever 	TP_printk("r_xprt=%p: created %u MRs",
4341c443effSChuck Lever 		__entry->r_xprt, __entry->count
4351c443effSChuck Lever 	)
4361c443effSChuck Lever );
4371c443effSChuck Lever 
4381c443effSChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_nomrs);
4391c443effSChuck Lever 
44058f10ad4SChuck Lever DEFINE_RDCH_EVENT(xprtrdma_read_chunk);
44158f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_write_chunk);
44258f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_reply_chunk);
44358f10ad4SChuck Lever 
444ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_noch);
445ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_readch);
446ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_areadch);
447ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_writech);
448ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_replych);
449ab03eff5SChuck Lever 
450ab03eff5SChuck Lever #define xprtrdma_show_chunktype(x)					\
451ab03eff5SChuck Lever 		__print_symbolic(x,					\
452ab03eff5SChuck Lever 				{ rpcrdma_noch, "inline" },		\
453ab03eff5SChuck Lever 				{ rpcrdma_readch, "read list" },	\
454ab03eff5SChuck Lever 				{ rpcrdma_areadch, "*read list" },	\
455ab03eff5SChuck Lever 				{ rpcrdma_writech, "write list" },	\
456ab03eff5SChuck Lever 				{ rpcrdma_replych, "reply chunk" })
457ab03eff5SChuck Lever 
458ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_marshal,
459ab03eff5SChuck Lever 	TP_PROTO(
460ab03eff5SChuck Lever 		const struct rpc_rqst *rqst,
461ab03eff5SChuck Lever 		unsigned int hdrlen,
462ab03eff5SChuck Lever 		unsigned int rtype,
463ab03eff5SChuck Lever 		unsigned int wtype
464ab03eff5SChuck Lever 	),
465ab03eff5SChuck Lever 
466ab03eff5SChuck Lever 	TP_ARGS(rqst, hdrlen, rtype, wtype),
467ab03eff5SChuck Lever 
468ab03eff5SChuck Lever 	TP_STRUCT__entry(
469ab03eff5SChuck Lever 		__field(unsigned int, task_id)
470ab03eff5SChuck Lever 		__field(unsigned int, client_id)
471ab03eff5SChuck Lever 		__field(u32, xid)
472ab03eff5SChuck Lever 		__field(unsigned int, hdrlen)
473ab03eff5SChuck Lever 		__field(unsigned int, headlen)
474ab03eff5SChuck Lever 		__field(unsigned int, pagelen)
475ab03eff5SChuck Lever 		__field(unsigned int, taillen)
476ab03eff5SChuck Lever 		__field(unsigned int, rtype)
477ab03eff5SChuck Lever 		__field(unsigned int, wtype)
478ab03eff5SChuck Lever 	),
479ab03eff5SChuck Lever 
480ab03eff5SChuck Lever 	TP_fast_assign(
481ab03eff5SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
482ab03eff5SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
483ab03eff5SChuck Lever 		__entry->xid = be32_to_cpu(rqst->rq_xid);
484ab03eff5SChuck Lever 		__entry->hdrlen = hdrlen;
485ab03eff5SChuck Lever 		__entry->headlen = rqst->rq_snd_buf.head[0].iov_len;
486ab03eff5SChuck Lever 		__entry->pagelen = rqst->rq_snd_buf.page_len;
487ab03eff5SChuck Lever 		__entry->taillen = rqst->rq_snd_buf.tail[0].iov_len;
488ab03eff5SChuck Lever 		__entry->rtype = rtype;
489ab03eff5SChuck Lever 		__entry->wtype = wtype;
490ab03eff5SChuck Lever 	),
491ab03eff5SChuck Lever 
492ab03eff5SChuck Lever 	TP_printk("task:%u@%u xid=0x%08x: hdr=%u xdr=%u/%u/%u %s/%s",
493ab03eff5SChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
494ab03eff5SChuck Lever 		__entry->hdrlen,
495ab03eff5SChuck Lever 		__entry->headlen, __entry->pagelen, __entry->taillen,
496ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->rtype),
497ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->wtype)
498ab03eff5SChuck Lever 	)
499ab03eff5SChuck Lever );
500ab03eff5SChuck Lever 
501ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_post_send,
502ab03eff5SChuck Lever 	TP_PROTO(
503ab03eff5SChuck Lever 		const struct rpcrdma_req *req,
504ab03eff5SChuck Lever 		int status
505ab03eff5SChuck Lever 	),
506ab03eff5SChuck Lever 
507ab03eff5SChuck Lever 	TP_ARGS(req, status),
508ab03eff5SChuck Lever 
509ab03eff5SChuck Lever 	TP_STRUCT__entry(
510ab03eff5SChuck Lever 		__field(const void *, req)
511ab03eff5SChuck Lever 		__field(int, num_sge)
512ab03eff5SChuck Lever 		__field(bool, signaled)
513ab03eff5SChuck Lever 		__field(int, status)
514ab03eff5SChuck Lever 	),
515ab03eff5SChuck Lever 
516ab03eff5SChuck Lever 	TP_fast_assign(
517ab03eff5SChuck Lever 		__entry->req = req;
518ab03eff5SChuck Lever 		__entry->num_sge = req->rl_sendctx->sc_wr.num_sge;
519ab03eff5SChuck Lever 		__entry->signaled = req->rl_sendctx->sc_wr.send_flags &
520ab03eff5SChuck Lever 				    IB_SEND_SIGNALED;
521ab03eff5SChuck Lever 		__entry->status = status;
522ab03eff5SChuck Lever 	),
523ab03eff5SChuck Lever 
524ab03eff5SChuck Lever 	TP_printk("req=%p, %d SGEs%s, status=%d",
525ab03eff5SChuck Lever 		__entry->req, __entry->num_sge,
526ab03eff5SChuck Lever 		(__entry->signaled ? ", signaled" : ""),
527ab03eff5SChuck Lever 		__entry->status
528ab03eff5SChuck Lever 	)
529ab03eff5SChuck Lever );
530ab03eff5SChuck Lever 
531b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_post_recv,
532b4a7f91cSChuck Lever 	TP_PROTO(
533b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
534b4a7f91cSChuck Lever 		int status
535b4a7f91cSChuck Lever 	),
536b4a7f91cSChuck Lever 
537b4a7f91cSChuck Lever 	TP_ARGS(rep, status),
538b4a7f91cSChuck Lever 
539b4a7f91cSChuck Lever 	TP_STRUCT__entry(
540b4a7f91cSChuck Lever 		__field(const void *, rep)
541b4a7f91cSChuck Lever 		__field(int, status)
542b4a7f91cSChuck Lever 	),
543b4a7f91cSChuck Lever 
544b4a7f91cSChuck Lever 	TP_fast_assign(
545b4a7f91cSChuck Lever 		__entry->rep = rep;
546b4a7f91cSChuck Lever 		__entry->status = status;
547b4a7f91cSChuck Lever 	),
548b4a7f91cSChuck Lever 
549b4a7f91cSChuck Lever 	TP_printk("rep=%p status=%d",
550b4a7f91cSChuck Lever 		__entry->rep, __entry->status
551b4a7f91cSChuck Lever 	)
552b4a7f91cSChuck Lever );
553b4a7f91cSChuck Lever 
554ab03eff5SChuck Lever /**
555ab03eff5SChuck Lever  ** Completion events
556ab03eff5SChuck Lever  **/
557ab03eff5SChuck Lever 
558ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_wc_send,
559ab03eff5SChuck Lever 	TP_PROTO(
560ab03eff5SChuck Lever 		const struct rpcrdma_sendctx *sc,
561ab03eff5SChuck Lever 		const struct ib_wc *wc
562ab03eff5SChuck Lever 	),
563ab03eff5SChuck Lever 
564ab03eff5SChuck Lever 	TP_ARGS(sc, wc),
565ab03eff5SChuck Lever 
566ab03eff5SChuck Lever 	TP_STRUCT__entry(
567ab03eff5SChuck Lever 		__field(const void *, req)
568ab03eff5SChuck Lever 		__field(unsigned int, unmap_count)
569ab03eff5SChuck Lever 		__field(unsigned int, status)
570ab03eff5SChuck Lever 		__field(unsigned int, vendor_err)
571ab03eff5SChuck Lever 	),
572ab03eff5SChuck Lever 
573ab03eff5SChuck Lever 	TP_fast_assign(
574ab03eff5SChuck Lever 		__entry->req = sc->sc_req;
575ab03eff5SChuck Lever 		__entry->unmap_count = sc->sc_unmap_count;
576ab03eff5SChuck Lever 		__entry->status = wc->status;
577ab03eff5SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
578ab03eff5SChuck Lever 	),
579ab03eff5SChuck Lever 
580ab03eff5SChuck Lever 	TP_printk("req=%p, unmapped %u pages: %s (%u/0x%x)",
581ab03eff5SChuck Lever 		__entry->req, __entry->unmap_count,
582ab03eff5SChuck Lever 		rdma_show_wc_status(__entry->status),
583ab03eff5SChuck Lever 		__entry->status, __entry->vendor_err
584ab03eff5SChuck Lever 	)
585ab03eff5SChuck Lever );
586ab03eff5SChuck Lever 
587b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_wc_receive,
588b4a7f91cSChuck Lever 	TP_PROTO(
589b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
590b4a7f91cSChuck Lever 		const struct ib_wc *wc
591b4a7f91cSChuck Lever 	),
592b4a7f91cSChuck Lever 
593b4a7f91cSChuck Lever 	TP_ARGS(rep, wc),
594b4a7f91cSChuck Lever 
595b4a7f91cSChuck Lever 	TP_STRUCT__entry(
596b4a7f91cSChuck Lever 		__field(const void *, rep)
597b4a7f91cSChuck Lever 		__field(unsigned int, byte_len)
598b4a7f91cSChuck Lever 		__field(unsigned int, status)
599b4a7f91cSChuck Lever 		__field(unsigned int, vendor_err)
600b4a7f91cSChuck Lever 	),
601b4a7f91cSChuck Lever 
602b4a7f91cSChuck Lever 	TP_fast_assign(
603b4a7f91cSChuck Lever 		__entry->rep = rep;
604b4a7f91cSChuck Lever 		__entry->byte_len = wc->byte_len;
605b4a7f91cSChuck Lever 		__entry->status = wc->status;
606b4a7f91cSChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
607b4a7f91cSChuck Lever 	),
608b4a7f91cSChuck Lever 
609b4a7f91cSChuck Lever 	TP_printk("rep=%p, %u bytes: %s (%u/0x%x)",
610b4a7f91cSChuck Lever 		__entry->rep, __entry->byte_len,
611b4a7f91cSChuck Lever 		rdma_show_wc_status(__entry->status),
612b4a7f91cSChuck Lever 		__entry->status, __entry->vendor_err
613b4a7f91cSChuck Lever 	)
614b4a7f91cSChuck Lever );
615b4a7f91cSChuck Lever 
61658f10ad4SChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_fastreg);
6172937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li);
6182937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li_wake);
6192937fedeSChuck Lever 
6202937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_localinv);
6212937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_dma_unmap);
6222937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_remoteinv);
6231c443effSChuck Lever DEFINE_MR_EVENT(xprtrdma_recover_mr);
62458f10ad4SChuck Lever 
625b4a7f91cSChuck Lever /**
626b4a7f91cSChuck Lever  ** Reply events
627b4a7f91cSChuck Lever  **/
628b4a7f91cSChuck Lever 
629b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_reply,
630b4a7f91cSChuck Lever 	TP_PROTO(
631b4a7f91cSChuck Lever 		const struct rpc_task *task,
632b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
633b4a7f91cSChuck Lever 		const struct rpcrdma_req *req,
634b4a7f91cSChuck Lever 		unsigned int credits
635b4a7f91cSChuck Lever 	),
636b4a7f91cSChuck Lever 
637b4a7f91cSChuck Lever 	TP_ARGS(task, rep, req, credits),
638b4a7f91cSChuck Lever 
639b4a7f91cSChuck Lever 	TP_STRUCT__entry(
640b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
641b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
642b4a7f91cSChuck Lever 		__field(const void *, rep)
643b4a7f91cSChuck Lever 		__field(const void *, req)
644b4a7f91cSChuck Lever 		__field(u32, xid)
645b4a7f91cSChuck Lever 		__field(unsigned int, credits)
646b4a7f91cSChuck Lever 	),
647b4a7f91cSChuck Lever 
648b4a7f91cSChuck Lever 	TP_fast_assign(
649b4a7f91cSChuck Lever 		__entry->task_id = task->tk_pid;
650b4a7f91cSChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
651b4a7f91cSChuck Lever 		__entry->rep = rep;
652b4a7f91cSChuck Lever 		__entry->req = req;
653b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
654b4a7f91cSChuck Lever 		__entry->credits = credits;
655b4a7f91cSChuck Lever 	),
656b4a7f91cSChuck Lever 
657b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x, %u credits, rep=%p -> req=%p",
658b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
659b4a7f91cSChuck Lever 		__entry->credits, __entry->rep, __entry->req
660b4a7f91cSChuck Lever 	)
661b4a7f91cSChuck Lever );
662b4a7f91cSChuck Lever 
663b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_defer_cmp,
664b4a7f91cSChuck Lever 	TP_PROTO(
665b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep
666b4a7f91cSChuck Lever 	),
667b4a7f91cSChuck Lever 
668b4a7f91cSChuck Lever 	TP_ARGS(rep),
669b4a7f91cSChuck Lever 
670b4a7f91cSChuck Lever 	TP_STRUCT__entry(
671b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
672b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
673b4a7f91cSChuck Lever 		__field(const void *, rep)
674b4a7f91cSChuck Lever 		__field(u32, xid)
675b4a7f91cSChuck Lever 	),
676b4a7f91cSChuck Lever 
677b4a7f91cSChuck Lever 	TP_fast_assign(
678b4a7f91cSChuck Lever 		__entry->task_id = rep->rr_rqst->rq_task->tk_pid;
679b4a7f91cSChuck Lever 		__entry->client_id = rep->rr_rqst->rq_task->tk_client->cl_clid;
680b4a7f91cSChuck Lever 		__entry->rep = rep;
681b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
682b4a7f91cSChuck Lever 	),
683b4a7f91cSChuck Lever 
684b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x rep=%p",
685b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
686b4a7f91cSChuck Lever 		__entry->rep
687b4a7f91cSChuck Lever 	)
688b4a7f91cSChuck Lever );
689b4a7f91cSChuck Lever 
690b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_vers);
691b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_rqst);
692b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_short);
693b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_hdr);
694b4a7f91cSChuck Lever 
695e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup,
696e11b7c96SChuck Lever 	TP_PROTO(
697e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
698e11b7c96SChuck Lever 		int len,
699e11b7c96SChuck Lever 		int hdrlen
700e11b7c96SChuck Lever 	),
701e11b7c96SChuck Lever 
702e11b7c96SChuck Lever 	TP_ARGS(rqst, len, hdrlen),
703e11b7c96SChuck Lever 
704e11b7c96SChuck Lever 	TP_STRUCT__entry(
705e11b7c96SChuck Lever 		__field(unsigned int, task_id)
706e11b7c96SChuck Lever 		__field(unsigned int, client_id)
707e11b7c96SChuck Lever 		__field(const void *, base)
708e11b7c96SChuck Lever 		__field(int, len)
709e11b7c96SChuck Lever 		__field(int, hdrlen)
710e11b7c96SChuck Lever 	),
711e11b7c96SChuck Lever 
712e11b7c96SChuck Lever 	TP_fast_assign(
713e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
714e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
715e11b7c96SChuck Lever 		__entry->base = rqst->rq_rcv_buf.head[0].iov_base;
716e11b7c96SChuck Lever 		__entry->len = len;
717e11b7c96SChuck Lever 		__entry->hdrlen = hdrlen;
718e11b7c96SChuck Lever 	),
719e11b7c96SChuck Lever 
720e11b7c96SChuck Lever 	TP_printk("task:%u@%u base=%p len=%d hdrlen=%d",
721e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
722e11b7c96SChuck Lever 		__entry->base, __entry->len, __entry->hdrlen
723e11b7c96SChuck Lever 	)
724e11b7c96SChuck Lever );
725e11b7c96SChuck Lever 
726e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup_pg,
727e11b7c96SChuck Lever 	TP_PROTO(
728e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
729e11b7c96SChuck Lever 		int pageno,
730e11b7c96SChuck Lever 		const void *pos,
731e11b7c96SChuck Lever 		int len,
732e11b7c96SChuck Lever 		int curlen
733e11b7c96SChuck Lever 	),
734e11b7c96SChuck Lever 
735e11b7c96SChuck Lever 	TP_ARGS(rqst, pageno, pos, len, curlen),
736e11b7c96SChuck Lever 
737e11b7c96SChuck Lever 	TP_STRUCT__entry(
738e11b7c96SChuck Lever 		__field(unsigned int, task_id)
739e11b7c96SChuck Lever 		__field(unsigned int, client_id)
740e11b7c96SChuck Lever 		__field(const void *, pos)
741e11b7c96SChuck Lever 		__field(int, pageno)
742e11b7c96SChuck Lever 		__field(int, len)
743e11b7c96SChuck Lever 		__field(int, curlen)
744e11b7c96SChuck Lever 	),
745e11b7c96SChuck Lever 
746e11b7c96SChuck Lever 	TP_fast_assign(
747e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
748e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
749e11b7c96SChuck Lever 		__entry->pos = pos;
750e11b7c96SChuck Lever 		__entry->pageno = pageno;
751e11b7c96SChuck Lever 		__entry->len = len;
752e11b7c96SChuck Lever 		__entry->curlen = curlen;
753e11b7c96SChuck Lever 	),
754e11b7c96SChuck Lever 
755e11b7c96SChuck Lever 	TP_printk("task:%u@%u pageno=%d pos=%p len=%d curlen=%d",
756e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
757e11b7c96SChuck Lever 		__entry->pageno, __entry->pos, __entry->len, __entry->curlen
758e11b7c96SChuck Lever 	)
759e11b7c96SChuck Lever );
760e11b7c96SChuck Lever 
761e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_decode_seg,
762e11b7c96SChuck Lever 	TP_PROTO(
763e11b7c96SChuck Lever 		u32 handle,
764e11b7c96SChuck Lever 		u32 length,
765e11b7c96SChuck Lever 		u64 offset
766e11b7c96SChuck Lever 	),
767e11b7c96SChuck Lever 
768e11b7c96SChuck Lever 	TP_ARGS(handle, length, offset),
769e11b7c96SChuck Lever 
770e11b7c96SChuck Lever 	TP_STRUCT__entry(
771e11b7c96SChuck Lever 		__field(u32, handle)
772e11b7c96SChuck Lever 		__field(u32, length)
773e11b7c96SChuck Lever 		__field(u64, offset)
774e11b7c96SChuck Lever 	),
775e11b7c96SChuck Lever 
776e11b7c96SChuck Lever 	TP_fast_assign(
777e11b7c96SChuck Lever 		__entry->handle = handle;
778e11b7c96SChuck Lever 		__entry->length = length;
779e11b7c96SChuck Lever 		__entry->offset = offset;
780e11b7c96SChuck Lever 	),
781e11b7c96SChuck Lever 
782e11b7c96SChuck Lever 	TP_printk("%u@0x%016llx:0x%08x",
783e11b7c96SChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
784e11b7c96SChuck Lever 		__entry->handle
785e11b7c96SChuck Lever 	)
786e11b7c96SChuck Lever );
787e11b7c96SChuck Lever 
788fc1eb807SChuck Lever /**
789ae724676SChuck Lever  ** Allocation/release of rpcrdma_reqs and rpcrdma_reps
790ae724676SChuck Lever  **/
791ae724676SChuck Lever 
792ae724676SChuck Lever TRACE_EVENT(xprtrdma_allocate,
793ae724676SChuck Lever 	TP_PROTO(
794ae724676SChuck Lever 		const struct rpc_task *task,
795ae724676SChuck Lever 		const struct rpcrdma_req *req
796ae724676SChuck Lever 	),
797ae724676SChuck Lever 
798ae724676SChuck Lever 	TP_ARGS(task, req),
799ae724676SChuck Lever 
800ae724676SChuck Lever 	TP_STRUCT__entry(
801ae724676SChuck Lever 		__field(unsigned int, task_id)
802ae724676SChuck Lever 		__field(unsigned int, client_id)
803ae724676SChuck Lever 		__field(const void *, req)
804ae724676SChuck Lever 		__field(const void *, rep)
805ae724676SChuck Lever 		__field(size_t, callsize)
806ae724676SChuck Lever 		__field(size_t, rcvsize)
807ae724676SChuck Lever 	),
808ae724676SChuck Lever 
809ae724676SChuck Lever 	TP_fast_assign(
810ae724676SChuck Lever 		__entry->task_id = task->tk_pid;
811ae724676SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
812ae724676SChuck Lever 		__entry->req = req;
813ae724676SChuck Lever 		__entry->rep = req ? req->rl_reply : NULL;
814ae724676SChuck Lever 		__entry->callsize = task->tk_rqstp->rq_callsize;
815ae724676SChuck Lever 		__entry->rcvsize = task->tk_rqstp->rq_rcvsize;
816ae724676SChuck Lever 	),
817ae724676SChuck Lever 
818ae724676SChuck Lever 	TP_printk("task:%u@%u req=%p rep=%p (%zu, %zu)",
819ae724676SChuck Lever 		__entry->task_id, __entry->client_id,
820ae724676SChuck Lever 		__entry->req, __entry->rep,
821ae724676SChuck Lever 		__entry->callsize, __entry->rcvsize
822ae724676SChuck Lever 	)
823ae724676SChuck Lever );
824ae724676SChuck Lever 
825ae724676SChuck Lever TRACE_EVENT(xprtrdma_rpc_done,
826ae724676SChuck Lever 	TP_PROTO(
827ae724676SChuck Lever 		const struct rpc_task *task,
828ae724676SChuck Lever 		const struct rpcrdma_req *req
829ae724676SChuck Lever 	),
830ae724676SChuck Lever 
831ae724676SChuck Lever 	TP_ARGS(task, req),
832ae724676SChuck Lever 
833ae724676SChuck Lever 	TP_STRUCT__entry(
834ae724676SChuck Lever 		__field(unsigned int, task_id)
835ae724676SChuck Lever 		__field(unsigned int, client_id)
836ae724676SChuck Lever 		__field(const void *, req)
837ae724676SChuck Lever 		__field(const void *, rep)
838ae724676SChuck Lever 	),
839ae724676SChuck Lever 
840ae724676SChuck Lever 	TP_fast_assign(
841ae724676SChuck Lever 		__entry->task_id = task->tk_pid;
842ae724676SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
843ae724676SChuck Lever 		__entry->req = req;
844ae724676SChuck Lever 		__entry->rep = req->rl_reply;
845ae724676SChuck Lever 	),
846ae724676SChuck Lever 
847ae724676SChuck Lever 	TP_printk("task:%u@%u req=%p rep=%p",
848ae724676SChuck Lever 		__entry->task_id, __entry->client_id,
849ae724676SChuck Lever 		__entry->req, __entry->rep
850ae724676SChuck Lever 	)
851ae724676SChuck Lever );
852ae724676SChuck Lever 
853ae724676SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_noreps);
854ae724676SChuck Lever 
855ae724676SChuck Lever /**
856fc1eb807SChuck Lever  ** Callback events
857fc1eb807SChuck Lever  **/
858fc1eb807SChuck Lever 
859fc1eb807SChuck Lever TRACE_EVENT(xprtrdma_cb_setup,
860fc1eb807SChuck Lever 	TP_PROTO(
861fc1eb807SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
862fc1eb807SChuck Lever 		unsigned int reqs
863fc1eb807SChuck Lever 	),
864fc1eb807SChuck Lever 
865fc1eb807SChuck Lever 	TP_ARGS(r_xprt, reqs),
866fc1eb807SChuck Lever 
867fc1eb807SChuck Lever 	TP_STRUCT__entry(
868fc1eb807SChuck Lever 		__field(const void *, r_xprt)
869fc1eb807SChuck Lever 		__field(unsigned int, reqs)
870fc1eb807SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
871fc1eb807SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
872fc1eb807SChuck Lever 	),
873fc1eb807SChuck Lever 
874fc1eb807SChuck Lever 	TP_fast_assign(
875fc1eb807SChuck Lever 		__entry->r_xprt = r_xprt;
876fc1eb807SChuck Lever 		__entry->reqs = reqs;
877fc1eb807SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
878fc1eb807SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
879fc1eb807SChuck Lever 	),
880fc1eb807SChuck Lever 
881fc1eb807SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: %u reqs",
882fc1eb807SChuck Lever 		__get_str(addr), __get_str(port),
883fc1eb807SChuck Lever 		__entry->r_xprt, __entry->reqs
884fc1eb807SChuck Lever 	)
885fc1eb807SChuck Lever );
886fc1eb807SChuck Lever 
887fc1eb807SChuck Lever DEFINE_CB_EVENT(xprtrdma_cb_call);
888fc1eb807SChuck Lever DEFINE_CB_EVENT(xprtrdma_cb_reply);
889fc1eb807SChuck Lever 
89098895edbSChuck Lever /**
89198895edbSChuck Lever  ** Server-side RPC/RDMA events
89298895edbSChuck Lever  **/
89398895edbSChuck Lever 
89498895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_xprt_event,
89598895edbSChuck Lever 	TP_PROTO(
89698895edbSChuck Lever 		const struct svc_xprt *xprt
89798895edbSChuck Lever 	),
89898895edbSChuck Lever 
89998895edbSChuck Lever 	TP_ARGS(xprt),
90098895edbSChuck Lever 
90198895edbSChuck Lever 	TP_STRUCT__entry(
90298895edbSChuck Lever 		__field(const void *, xprt)
90398895edbSChuck Lever 		__string(addr, xprt->xpt_remotebuf)
90498895edbSChuck Lever 	),
90598895edbSChuck Lever 
90698895edbSChuck Lever 	TP_fast_assign(
90798895edbSChuck Lever 		__entry->xprt = xprt;
90898895edbSChuck Lever 		__assign_str(addr, xprt->xpt_remotebuf);
90998895edbSChuck Lever 	),
91098895edbSChuck Lever 
91198895edbSChuck Lever 	TP_printk("xprt=%p addr=%s",
91298895edbSChuck Lever 		__entry->xprt, __get_str(addr)
91398895edbSChuck Lever 	)
91498895edbSChuck Lever );
91598895edbSChuck Lever 
91698895edbSChuck Lever #define DEFINE_XPRT_EVENT(name)						\
91798895edbSChuck Lever 		DEFINE_EVENT(svcrdma_xprt_event, svcrdma_xprt_##name,	\
91898895edbSChuck Lever 				TP_PROTO(				\
91998895edbSChuck Lever 					const struct svc_xprt *xprt	\
92098895edbSChuck Lever 				),					\
92198895edbSChuck Lever 				TP_ARGS(xprt))
92298895edbSChuck Lever 
92398895edbSChuck Lever DEFINE_XPRT_EVENT(accept);
92498895edbSChuck Lever DEFINE_XPRT_EVENT(fail);
92598895edbSChuck Lever DEFINE_XPRT_EVENT(free);
92698895edbSChuck Lever 
92798895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_MSG);
92898895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_NOMSG);
92998895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_MSGP);
93098895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_DONE);
93198895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_ERROR);
93298895edbSChuck Lever 
93398895edbSChuck Lever #define show_rpcrdma_proc(x)						\
93498895edbSChuck Lever 		__print_symbolic(x,					\
93598895edbSChuck Lever 				{ RDMA_MSG, "RDMA_MSG" },		\
93698895edbSChuck Lever 				{ RDMA_NOMSG, "RDMA_NOMSG" },		\
93798895edbSChuck Lever 				{ RDMA_MSGP, "RDMA_MSGP" },		\
93898895edbSChuck Lever 				{ RDMA_DONE, "RDMA_DONE" },		\
93998895edbSChuck Lever 				{ RDMA_ERROR, "RDMA_ERROR" })
94098895edbSChuck Lever 
94198895edbSChuck Lever TRACE_EVENT(svcrdma_decode_rqst,
94298895edbSChuck Lever 	TP_PROTO(
94398895edbSChuck Lever 		__be32 *p,
94498895edbSChuck Lever 		unsigned int hdrlen
94598895edbSChuck Lever 	),
94698895edbSChuck Lever 
94798895edbSChuck Lever 	TP_ARGS(p, hdrlen),
94898895edbSChuck Lever 
94998895edbSChuck Lever 	TP_STRUCT__entry(
95098895edbSChuck Lever 		__field(u32, xid)
95198895edbSChuck Lever 		__field(u32, vers)
95298895edbSChuck Lever 		__field(u32, proc)
95398895edbSChuck Lever 		__field(u32, credits)
95498895edbSChuck Lever 		__field(unsigned int, hdrlen)
95598895edbSChuck Lever 	),
95698895edbSChuck Lever 
95798895edbSChuck Lever 	TP_fast_assign(
95898895edbSChuck Lever 		__entry->xid = be32_to_cpup(p++);
95998895edbSChuck Lever 		__entry->vers = be32_to_cpup(p++);
96098895edbSChuck Lever 		__entry->credits = be32_to_cpup(p++);
96198895edbSChuck Lever 		__entry->proc = be32_to_cpup(p);
96298895edbSChuck Lever 		__entry->hdrlen = hdrlen;
96398895edbSChuck Lever 	),
96498895edbSChuck Lever 
96598895edbSChuck Lever 	TP_printk("xid=0x%08x vers=%u credits=%u proc=%s hdrlen=%u",
96698895edbSChuck Lever 		__entry->xid, __entry->vers, __entry->credits,
96798895edbSChuck Lever 		show_rpcrdma_proc(__entry->proc), __entry->hdrlen)
96898895edbSChuck Lever );
96998895edbSChuck Lever 
97098895edbSChuck Lever TRACE_EVENT(svcrdma_decode_short,
97198895edbSChuck Lever 	TP_PROTO(
97298895edbSChuck Lever 		unsigned int hdrlen
97398895edbSChuck Lever 	),
97498895edbSChuck Lever 
97598895edbSChuck Lever 	TP_ARGS(hdrlen),
97698895edbSChuck Lever 
97798895edbSChuck Lever 	TP_STRUCT__entry(
97898895edbSChuck Lever 		__field(unsigned int, hdrlen)
97998895edbSChuck Lever 	),
98098895edbSChuck Lever 
98198895edbSChuck Lever 	TP_fast_assign(
98298895edbSChuck Lever 		__entry->hdrlen = hdrlen;
98398895edbSChuck Lever 	),
98498895edbSChuck Lever 
98598895edbSChuck Lever 	TP_printk("hdrlen=%u", __entry->hdrlen)
98698895edbSChuck Lever );
98798895edbSChuck Lever 
98898895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_badreq_event,
98998895edbSChuck Lever 	TP_PROTO(
99098895edbSChuck Lever 		__be32 *p
99198895edbSChuck Lever 	),
99298895edbSChuck Lever 
99398895edbSChuck Lever 	TP_ARGS(p),
99498895edbSChuck Lever 
99598895edbSChuck Lever 	TP_STRUCT__entry(
99698895edbSChuck Lever 		__field(u32, xid)
99798895edbSChuck Lever 		__field(u32, vers)
99898895edbSChuck Lever 		__field(u32, proc)
99998895edbSChuck Lever 		__field(u32, credits)
100098895edbSChuck Lever 	),
100198895edbSChuck Lever 
100298895edbSChuck Lever 	TP_fast_assign(
100398895edbSChuck Lever 		__entry->xid = be32_to_cpup(p++);
100498895edbSChuck Lever 		__entry->vers = be32_to_cpup(p++);
100598895edbSChuck Lever 		__entry->credits = be32_to_cpup(p++);
100698895edbSChuck Lever 		__entry->proc = be32_to_cpup(p);
100798895edbSChuck Lever 	),
100898895edbSChuck Lever 
100998895edbSChuck Lever 	TP_printk("xid=0x%08x vers=%u credits=%u proc=%u",
101098895edbSChuck Lever 		__entry->xid, __entry->vers, __entry->credits, __entry->proc)
101198895edbSChuck Lever );
101298895edbSChuck Lever 
101398895edbSChuck Lever #define DEFINE_BADREQ_EVENT(name)					\
101498895edbSChuck Lever 		DEFINE_EVENT(svcrdma_badreq_event, svcrdma_decode_##name,\
101598895edbSChuck Lever 				TP_PROTO(				\
101698895edbSChuck Lever 					__be32 *p			\
101798895edbSChuck Lever 				),					\
101898895edbSChuck Lever 				TP_ARGS(p))
101998895edbSChuck Lever 
102098895edbSChuck Lever DEFINE_BADREQ_EVENT(badvers);
102198895edbSChuck Lever DEFINE_BADREQ_EVENT(drop);
102298895edbSChuck Lever DEFINE_BADREQ_EVENT(badproc);
102398895edbSChuck Lever DEFINE_BADREQ_EVENT(parse);
102498895edbSChuck Lever 
102598895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_segment_event,
102698895edbSChuck Lever 	TP_PROTO(
102798895edbSChuck Lever 		u32 handle,
102898895edbSChuck Lever 		u32 length,
102998895edbSChuck Lever 		u64 offset
103098895edbSChuck Lever 	),
103198895edbSChuck Lever 
103298895edbSChuck Lever 	TP_ARGS(handle, length, offset),
103398895edbSChuck Lever 
103498895edbSChuck Lever 	TP_STRUCT__entry(
103598895edbSChuck Lever 		__field(u32, handle)
103698895edbSChuck Lever 		__field(u32, length)
103798895edbSChuck Lever 		__field(u64, offset)
103898895edbSChuck Lever 	),
103998895edbSChuck Lever 
104098895edbSChuck Lever 	TP_fast_assign(
104198895edbSChuck Lever 		__entry->handle = handle;
104298895edbSChuck Lever 		__entry->length = length;
104398895edbSChuck Lever 		__entry->offset = offset;
104498895edbSChuck Lever 	),
104598895edbSChuck Lever 
104698895edbSChuck Lever 	TP_printk("%u@0x%016llx:0x%08x",
104798895edbSChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
104898895edbSChuck Lever 		__entry->handle
104998895edbSChuck Lever 	)
105098895edbSChuck Lever );
105198895edbSChuck Lever 
105298895edbSChuck Lever #define DEFINE_SEGMENT_EVENT(name)					\
105398895edbSChuck Lever 		DEFINE_EVENT(svcrdma_segment_event, svcrdma_encode_##name,\
105498895edbSChuck Lever 				TP_PROTO(				\
105598895edbSChuck Lever 					u32 handle,			\
105698895edbSChuck Lever 					u32 length,			\
105798895edbSChuck Lever 					u64 offset			\
105898895edbSChuck Lever 				),					\
105998895edbSChuck Lever 				TP_ARGS(handle, length, offset))
106098895edbSChuck Lever 
106198895edbSChuck Lever DEFINE_SEGMENT_EVENT(rseg);
106298895edbSChuck Lever DEFINE_SEGMENT_EVENT(wseg);
106398895edbSChuck Lever 
106498895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_chunk_event,
106598895edbSChuck Lever 	TP_PROTO(
106698895edbSChuck Lever 		u32 length
106798895edbSChuck Lever 	),
106898895edbSChuck Lever 
106998895edbSChuck Lever 	TP_ARGS(length),
107098895edbSChuck Lever 
107198895edbSChuck Lever 	TP_STRUCT__entry(
107298895edbSChuck Lever 		__field(u32, length)
107398895edbSChuck Lever 	),
107498895edbSChuck Lever 
107598895edbSChuck Lever 	TP_fast_assign(
107698895edbSChuck Lever 		__entry->length = length;
107798895edbSChuck Lever 	),
107898895edbSChuck Lever 
107998895edbSChuck Lever 	TP_printk("length=%u",
108098895edbSChuck Lever 		__entry->length
108198895edbSChuck Lever 	)
108298895edbSChuck Lever );
108398895edbSChuck Lever 
108498895edbSChuck Lever #define DEFINE_CHUNK_EVENT(name)					\
108598895edbSChuck Lever 		DEFINE_EVENT(svcrdma_chunk_event, svcrdma_encode_##name,\
108698895edbSChuck Lever 				TP_PROTO(				\
108798895edbSChuck Lever 					u32 length			\
108898895edbSChuck Lever 				),					\
108998895edbSChuck Lever 				TP_ARGS(length))
109098895edbSChuck Lever 
109198895edbSChuck Lever DEFINE_CHUNK_EVENT(pzr);
109298895edbSChuck Lever DEFINE_CHUNK_EVENT(write);
109398895edbSChuck Lever DEFINE_CHUNK_EVENT(reply);
109498895edbSChuck Lever 
109598895edbSChuck Lever TRACE_EVENT(svcrdma_encode_read,
109698895edbSChuck Lever 	TP_PROTO(
109798895edbSChuck Lever 		u32 length,
109898895edbSChuck Lever 		u32 position
109998895edbSChuck Lever 	),
110098895edbSChuck Lever 
110198895edbSChuck Lever 	TP_ARGS(length, position),
110298895edbSChuck Lever 
110398895edbSChuck Lever 	TP_STRUCT__entry(
110498895edbSChuck Lever 		__field(u32, length)
110598895edbSChuck Lever 		__field(u32, position)
110698895edbSChuck Lever 	),
110798895edbSChuck Lever 
110898895edbSChuck Lever 	TP_fast_assign(
110998895edbSChuck Lever 		__entry->length = length;
111098895edbSChuck Lever 		__entry->position = position;
111198895edbSChuck Lever 	),
111298895edbSChuck Lever 
111398895edbSChuck Lever 	TP_printk("length=%u position=%u",
111498895edbSChuck Lever 		__entry->length, __entry->position
111598895edbSChuck Lever 	)
111698895edbSChuck Lever );
111798895edbSChuck Lever 
111898895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_error_event,
111998895edbSChuck Lever 	TP_PROTO(
112098895edbSChuck Lever 		__be32 xid
112198895edbSChuck Lever 	),
112298895edbSChuck Lever 
112398895edbSChuck Lever 	TP_ARGS(xid),
112498895edbSChuck Lever 
112598895edbSChuck Lever 	TP_STRUCT__entry(
112698895edbSChuck Lever 		__field(u32, xid)
112798895edbSChuck Lever 	),
112898895edbSChuck Lever 
112998895edbSChuck Lever 	TP_fast_assign(
113098895edbSChuck Lever 		__entry->xid = be32_to_cpu(xid);
113198895edbSChuck Lever 	),
113298895edbSChuck Lever 
113398895edbSChuck Lever 	TP_printk("xid=0x%08x",
113498895edbSChuck Lever 		__entry->xid
113598895edbSChuck Lever 	)
113698895edbSChuck Lever );
113798895edbSChuck Lever 
113898895edbSChuck Lever #define DEFINE_ERROR_EVENT(name)					\
113998895edbSChuck Lever 		DEFINE_EVENT(svcrdma_error_event, svcrdma_err_##name,	\
114098895edbSChuck Lever 				TP_PROTO(				\
114198895edbSChuck Lever 					__be32 xid			\
114298895edbSChuck Lever 				),					\
114398895edbSChuck Lever 				TP_ARGS(xid))
114498895edbSChuck Lever 
114598895edbSChuck Lever DEFINE_ERROR_EVENT(vers);
114698895edbSChuck Lever DEFINE_ERROR_EVENT(chunk);
114798895edbSChuck Lever 
1148bd2abef3SChuck Lever /**
1149bd2abef3SChuck Lever  ** Server-side RDMA API events
1150bd2abef3SChuck Lever  **/
1151bd2abef3SChuck Lever 
1152bd2abef3SChuck Lever TRACE_EVENT(svcrdma_dma_map_page,
1153bd2abef3SChuck Lever 	TP_PROTO(
1154bd2abef3SChuck Lever 		const struct svcxprt_rdma *rdma,
1155bd2abef3SChuck Lever 		const void *page
1156bd2abef3SChuck Lever 	),
1157bd2abef3SChuck Lever 
1158bd2abef3SChuck Lever 	TP_ARGS(rdma, page),
1159bd2abef3SChuck Lever 
1160bd2abef3SChuck Lever 	TP_STRUCT__entry(
1161bd2abef3SChuck Lever 		__field(const void *, page);
1162bd2abef3SChuck Lever 		__string(device, rdma->sc_cm_id->device->name)
1163bd2abef3SChuck Lever 		__string(addr, rdma->sc_xprt.xpt_remotebuf)
1164bd2abef3SChuck Lever 	),
1165bd2abef3SChuck Lever 
1166bd2abef3SChuck Lever 	TP_fast_assign(
1167bd2abef3SChuck Lever 		__entry->page = page;
1168bd2abef3SChuck Lever 		__assign_str(device, rdma->sc_cm_id->device->name);
1169bd2abef3SChuck Lever 		__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
1170bd2abef3SChuck Lever 	),
1171bd2abef3SChuck Lever 
1172bd2abef3SChuck Lever 	TP_printk("addr=%s device=%s page=%p",
1173bd2abef3SChuck Lever 		__get_str(addr), __get_str(device), __entry->page
1174bd2abef3SChuck Lever 	)
1175bd2abef3SChuck Lever );
1176bd2abef3SChuck Lever 
1177bd2abef3SChuck Lever TRACE_EVENT(svcrdma_dma_map_rwctx,
1178bd2abef3SChuck Lever 	TP_PROTO(
1179bd2abef3SChuck Lever 		const struct svcxprt_rdma *rdma,
1180bd2abef3SChuck Lever 		int status
1181bd2abef3SChuck Lever 	),
1182bd2abef3SChuck Lever 
1183bd2abef3SChuck Lever 	TP_ARGS(rdma, status),
1184bd2abef3SChuck Lever 
1185bd2abef3SChuck Lever 	TP_STRUCT__entry(
1186bd2abef3SChuck Lever 		__field(int, status)
1187bd2abef3SChuck Lever 		__string(device, rdma->sc_cm_id->device->name)
1188bd2abef3SChuck Lever 		__string(addr, rdma->sc_xprt.xpt_remotebuf)
1189bd2abef3SChuck Lever 	),
1190bd2abef3SChuck Lever 
1191bd2abef3SChuck Lever 	TP_fast_assign(
1192bd2abef3SChuck Lever 		__entry->status = status;
1193bd2abef3SChuck Lever 		__assign_str(device, rdma->sc_cm_id->device->name);
1194bd2abef3SChuck Lever 		__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
1195bd2abef3SChuck Lever 	),
1196bd2abef3SChuck Lever 
1197bd2abef3SChuck Lever 	TP_printk("addr=%s device=%s status=%d",
1198bd2abef3SChuck Lever 		__get_str(addr), __get_str(device), __entry->status
1199bd2abef3SChuck Lever 	)
1200bd2abef3SChuck Lever );
1201bd2abef3SChuck Lever 
1202bd2abef3SChuck Lever TRACE_EVENT(svcrdma_send_failed,
1203bd2abef3SChuck Lever 	TP_PROTO(
1204bd2abef3SChuck Lever 		const struct svc_rqst *rqst,
1205bd2abef3SChuck Lever 		int status
1206bd2abef3SChuck Lever 	),
1207bd2abef3SChuck Lever 
1208bd2abef3SChuck Lever 	TP_ARGS(rqst, status),
1209bd2abef3SChuck Lever 
1210bd2abef3SChuck Lever 	TP_STRUCT__entry(
1211bd2abef3SChuck Lever 		__field(int, status)
1212bd2abef3SChuck Lever 		__field(u32, xid)
1213bd2abef3SChuck Lever 		__field(const void *, xprt)
1214bd2abef3SChuck Lever 		__string(addr, rqst->rq_xprt->xpt_remotebuf)
1215bd2abef3SChuck Lever 	),
1216bd2abef3SChuck Lever 
1217bd2abef3SChuck Lever 	TP_fast_assign(
1218bd2abef3SChuck Lever 		__entry->status = status;
1219bd2abef3SChuck Lever 		__entry->xid = __be32_to_cpu(rqst->rq_xid);
1220bd2abef3SChuck Lever 		__entry->xprt = rqst->rq_xprt;
1221bd2abef3SChuck Lever 		__assign_str(addr, rqst->rq_xprt->xpt_remotebuf);
1222bd2abef3SChuck Lever 	),
1223bd2abef3SChuck Lever 
1224bd2abef3SChuck Lever 	TP_printk("xprt=%p addr=%s xid=0x%08x status=%d",
1225bd2abef3SChuck Lever 		__entry->xprt, __get_str(addr),
1226bd2abef3SChuck Lever 		__entry->xid, __entry->status
1227bd2abef3SChuck Lever 	)
1228bd2abef3SChuck Lever );
1229bd2abef3SChuck Lever 
1230bd2abef3SChuck Lever DECLARE_EVENT_CLASS(svcrdma_sendcomp_event,
1231bd2abef3SChuck Lever 	TP_PROTO(
1232bd2abef3SChuck Lever 		const struct ib_wc *wc
1233bd2abef3SChuck Lever 	),
1234bd2abef3SChuck Lever 
1235bd2abef3SChuck Lever 	TP_ARGS(wc),
1236bd2abef3SChuck Lever 
1237bd2abef3SChuck Lever 	TP_STRUCT__entry(
1238bd2abef3SChuck Lever 		__field(const void *, cqe)
1239bd2abef3SChuck Lever 		__field(unsigned int, status)
1240bd2abef3SChuck Lever 		__field(unsigned int, vendor_err)
1241bd2abef3SChuck Lever 	),
1242bd2abef3SChuck Lever 
1243bd2abef3SChuck Lever 	TP_fast_assign(
1244bd2abef3SChuck Lever 		__entry->cqe = wc->wr_cqe;
1245bd2abef3SChuck Lever 		__entry->status = wc->status;
1246bd2abef3SChuck Lever 		if (wc->status)
1247bd2abef3SChuck Lever 			__entry->vendor_err = wc->vendor_err;
1248bd2abef3SChuck Lever 		else
1249bd2abef3SChuck Lever 			__entry->vendor_err = 0;
1250bd2abef3SChuck Lever 	),
1251bd2abef3SChuck Lever 
1252bd2abef3SChuck Lever 	TP_printk("cqe=%p status=%s (%u/0x%x)",
1253bd2abef3SChuck Lever 		__entry->cqe, rdma_show_wc_status(__entry->status),
1254bd2abef3SChuck Lever 		__entry->status, __entry->vendor_err
1255bd2abef3SChuck Lever 	)
1256bd2abef3SChuck Lever );
1257bd2abef3SChuck Lever 
1258bd2abef3SChuck Lever #define DEFINE_SENDCOMP_EVENT(name)					\
1259bd2abef3SChuck Lever 		DEFINE_EVENT(svcrdma_sendcomp_event, svcrdma_wc_##name,	\
1260bd2abef3SChuck Lever 				TP_PROTO(				\
1261bd2abef3SChuck Lever 					const struct ib_wc *wc		\
1262bd2abef3SChuck Lever 				),					\
1263bd2abef3SChuck Lever 				TP_ARGS(wc))
1264bd2abef3SChuck Lever 
1265bd2abef3SChuck Lever TRACE_EVENT(svcrdma_post_send,
1266bd2abef3SChuck Lever 	TP_PROTO(
1267bd2abef3SChuck Lever 		const struct ib_send_wr *wr,
1268bd2abef3SChuck Lever 		int status
1269bd2abef3SChuck Lever 	),
1270bd2abef3SChuck Lever 
1271bd2abef3SChuck Lever 	TP_ARGS(wr, status),
1272bd2abef3SChuck Lever 
1273bd2abef3SChuck Lever 	TP_STRUCT__entry(
1274bd2abef3SChuck Lever 		__field(const void *, cqe)
1275bd2abef3SChuck Lever 		__field(unsigned int, num_sge)
1276bd2abef3SChuck Lever 		__field(u32, inv_rkey)
1277bd2abef3SChuck Lever 		__field(int, status)
1278bd2abef3SChuck Lever 	),
1279bd2abef3SChuck Lever 
1280bd2abef3SChuck Lever 	TP_fast_assign(
1281bd2abef3SChuck Lever 		__entry->cqe = wr->wr_cqe;
1282bd2abef3SChuck Lever 		__entry->num_sge = wr->num_sge;
1283bd2abef3SChuck Lever 		__entry->inv_rkey = (wr->opcode == IB_WR_SEND_WITH_INV) ?
1284bd2abef3SChuck Lever 					wr->ex.invalidate_rkey : 0;
1285bd2abef3SChuck Lever 		__entry->status = status;
1286bd2abef3SChuck Lever 	),
1287bd2abef3SChuck Lever 
1288bd2abef3SChuck Lever 	TP_printk("cqe=%p num_sge=%u inv_rkey=0x%08x status=%d",
1289bd2abef3SChuck Lever 		__entry->cqe, __entry->num_sge,
1290bd2abef3SChuck Lever 		__entry->inv_rkey, __entry->status
1291bd2abef3SChuck Lever 	)
1292bd2abef3SChuck Lever );
1293bd2abef3SChuck Lever 
1294bd2abef3SChuck Lever DEFINE_SENDCOMP_EVENT(send);
1295bd2abef3SChuck Lever 
1296bd2abef3SChuck Lever TRACE_EVENT(svcrdma_post_recv,
1297bd2abef3SChuck Lever 	TP_PROTO(
1298bd2abef3SChuck Lever 		const struct ib_recv_wr *wr,
1299bd2abef3SChuck Lever 		int status
1300bd2abef3SChuck Lever 	),
1301bd2abef3SChuck Lever 
1302bd2abef3SChuck Lever 	TP_ARGS(wr, status),
1303bd2abef3SChuck Lever 
1304bd2abef3SChuck Lever 	TP_STRUCT__entry(
1305bd2abef3SChuck Lever 		__field(const void *, cqe)
1306bd2abef3SChuck Lever 		__field(int, status)
1307bd2abef3SChuck Lever 	),
1308bd2abef3SChuck Lever 
1309bd2abef3SChuck Lever 	TP_fast_assign(
1310bd2abef3SChuck Lever 		__entry->cqe = wr->wr_cqe;
1311bd2abef3SChuck Lever 		__entry->status = status;
1312bd2abef3SChuck Lever 	),
1313bd2abef3SChuck Lever 
1314bd2abef3SChuck Lever 	TP_printk("cqe=%p status=%d",
1315bd2abef3SChuck Lever 		__entry->cqe, __entry->status
1316bd2abef3SChuck Lever 	)
1317bd2abef3SChuck Lever );
1318bd2abef3SChuck Lever 
1319bd2abef3SChuck Lever TRACE_EVENT(svcrdma_wc_receive,
1320bd2abef3SChuck Lever 	TP_PROTO(
1321bd2abef3SChuck Lever 		const struct ib_wc *wc
1322bd2abef3SChuck Lever 	),
1323bd2abef3SChuck Lever 
1324bd2abef3SChuck Lever 	TP_ARGS(wc),
1325bd2abef3SChuck Lever 
1326bd2abef3SChuck Lever 	TP_STRUCT__entry(
1327bd2abef3SChuck Lever 		__field(const void *, cqe)
1328bd2abef3SChuck Lever 		__field(u32, byte_len)
1329bd2abef3SChuck Lever 		__field(unsigned int, status)
1330bd2abef3SChuck Lever 		__field(u32, vendor_err)
1331bd2abef3SChuck Lever 	),
1332bd2abef3SChuck Lever 
1333bd2abef3SChuck Lever 	TP_fast_assign(
1334bd2abef3SChuck Lever 		__entry->cqe = wc->wr_cqe;
1335bd2abef3SChuck Lever 		__entry->status = wc->status;
1336bd2abef3SChuck Lever 		if (wc->status) {
1337bd2abef3SChuck Lever 			__entry->byte_len = 0;
1338bd2abef3SChuck Lever 			__entry->vendor_err = wc->vendor_err;
1339bd2abef3SChuck Lever 		} else {
1340bd2abef3SChuck Lever 			__entry->byte_len = wc->byte_len;
1341bd2abef3SChuck Lever 			__entry->vendor_err = 0;
1342bd2abef3SChuck Lever 		}
1343bd2abef3SChuck Lever 	),
1344bd2abef3SChuck Lever 
1345bd2abef3SChuck Lever 	TP_printk("cqe=%p byte_len=%u status=%s (%u/0x%x)",
1346bd2abef3SChuck Lever 		__entry->cqe, __entry->byte_len,
1347bd2abef3SChuck Lever 		rdma_show_wc_status(__entry->status),
1348bd2abef3SChuck Lever 		__entry->status, __entry->vendor_err
1349bd2abef3SChuck Lever 	)
1350bd2abef3SChuck Lever );
1351bd2abef3SChuck Lever 
1352bd2abef3SChuck Lever TRACE_EVENT(svcrdma_post_rw,
1353bd2abef3SChuck Lever 	TP_PROTO(
1354bd2abef3SChuck Lever 		const void *cqe,
1355bd2abef3SChuck Lever 		int sqecount,
1356bd2abef3SChuck Lever 		int status
1357bd2abef3SChuck Lever 	),
1358bd2abef3SChuck Lever 
1359bd2abef3SChuck Lever 	TP_ARGS(cqe, sqecount, status),
1360bd2abef3SChuck Lever 
1361bd2abef3SChuck Lever 	TP_STRUCT__entry(
1362bd2abef3SChuck Lever 		__field(const void *, cqe)
1363bd2abef3SChuck Lever 		__field(int, sqecount)
1364bd2abef3SChuck Lever 		__field(int, status)
1365bd2abef3SChuck Lever 	),
1366bd2abef3SChuck Lever 
1367bd2abef3SChuck Lever 	TP_fast_assign(
1368bd2abef3SChuck Lever 		__entry->cqe = cqe;
1369bd2abef3SChuck Lever 		__entry->sqecount = sqecount;
1370bd2abef3SChuck Lever 		__entry->status = status;
1371bd2abef3SChuck Lever 	),
1372bd2abef3SChuck Lever 
1373bd2abef3SChuck Lever 	TP_printk("cqe=%p sqecount=%d status=%d",
1374bd2abef3SChuck Lever 		__entry->cqe, __entry->sqecount, __entry->status
1375bd2abef3SChuck Lever 	)
1376bd2abef3SChuck Lever );
1377bd2abef3SChuck Lever 
1378bd2abef3SChuck Lever DEFINE_SENDCOMP_EVENT(read);
1379bd2abef3SChuck Lever DEFINE_SENDCOMP_EVENT(write);
1380bd2abef3SChuck Lever 
1381bd2abef3SChuck Lever TRACE_EVENT(svcrdma_cm_event,
1382bd2abef3SChuck Lever 	TP_PROTO(
1383bd2abef3SChuck Lever 		const struct rdma_cm_event *event,
1384bd2abef3SChuck Lever 		const struct sockaddr *sap
1385bd2abef3SChuck Lever 	),
1386bd2abef3SChuck Lever 
1387bd2abef3SChuck Lever 	TP_ARGS(event, sap),
1388bd2abef3SChuck Lever 
1389bd2abef3SChuck Lever 	TP_STRUCT__entry(
1390bd2abef3SChuck Lever 		__field(unsigned int, event)
1391bd2abef3SChuck Lever 		__field(int, status)
1392bd2abef3SChuck Lever 		__array(__u8, addr, INET6_ADDRSTRLEN + 10)
1393bd2abef3SChuck Lever 	),
1394bd2abef3SChuck Lever 
1395bd2abef3SChuck Lever 	TP_fast_assign(
1396bd2abef3SChuck Lever 		__entry->event = event->event;
1397bd2abef3SChuck Lever 		__entry->status = event->status;
1398bd2abef3SChuck Lever 		snprintf(__entry->addr, sizeof(__entry->addr) - 1,
1399bd2abef3SChuck Lever 			 "%pISpc", sap);
1400bd2abef3SChuck Lever 	),
1401bd2abef3SChuck Lever 
1402bd2abef3SChuck Lever 	TP_printk("addr=%s event=%s (%u/%d)",
1403bd2abef3SChuck Lever 		__entry->addr,
1404bd2abef3SChuck Lever 		rdma_show_cm_event(__entry->event),
1405bd2abef3SChuck Lever 		__entry->event, __entry->status
1406bd2abef3SChuck Lever 	)
1407bd2abef3SChuck Lever );
1408bd2abef3SChuck Lever 
1409bd2abef3SChuck Lever TRACE_EVENT(svcrdma_qp_error,
1410bd2abef3SChuck Lever 	TP_PROTO(
1411bd2abef3SChuck Lever 		const struct ib_event *event,
1412bd2abef3SChuck Lever 		const struct sockaddr *sap
1413bd2abef3SChuck Lever 	),
1414bd2abef3SChuck Lever 
1415bd2abef3SChuck Lever 	TP_ARGS(event, sap),
1416bd2abef3SChuck Lever 
1417bd2abef3SChuck Lever 	TP_STRUCT__entry(
1418bd2abef3SChuck Lever 		__field(unsigned int, event)
1419bd2abef3SChuck Lever 		__string(device, event->device->name)
1420bd2abef3SChuck Lever 		__array(__u8, addr, INET6_ADDRSTRLEN + 10)
1421bd2abef3SChuck Lever 	),
1422bd2abef3SChuck Lever 
1423bd2abef3SChuck Lever 	TP_fast_assign(
1424bd2abef3SChuck Lever 		__entry->event = event->event;
1425bd2abef3SChuck Lever 		__assign_str(device, event->device->name);
1426bd2abef3SChuck Lever 		snprintf(__entry->addr, sizeof(__entry->addr) - 1,
1427bd2abef3SChuck Lever 			 "%pISpc", sap);
1428bd2abef3SChuck Lever 	),
1429bd2abef3SChuck Lever 
1430bd2abef3SChuck Lever 	TP_printk("addr=%s dev=%s event=%s (%u)",
1431bd2abef3SChuck Lever 		__entry->addr, __get_str(device),
1432bd2abef3SChuck Lever 		rdma_show_ib_event(__entry->event), __entry->event
1433bd2abef3SChuck Lever 	)
1434bd2abef3SChuck Lever );
1435bd2abef3SChuck Lever 
1436bd2abef3SChuck Lever DECLARE_EVENT_CLASS(svcrdma_sendqueue_event,
1437bd2abef3SChuck Lever 	TP_PROTO(
1438bd2abef3SChuck Lever 		const struct svcxprt_rdma *rdma
1439bd2abef3SChuck Lever 	),
1440bd2abef3SChuck Lever 
1441bd2abef3SChuck Lever 	TP_ARGS(rdma),
1442bd2abef3SChuck Lever 
1443bd2abef3SChuck Lever 	TP_STRUCT__entry(
1444bd2abef3SChuck Lever 		__field(int, avail)
1445bd2abef3SChuck Lever 		__field(int, depth)
1446bd2abef3SChuck Lever 		__string(addr, rdma->sc_xprt.xpt_remotebuf)
1447bd2abef3SChuck Lever 	),
1448bd2abef3SChuck Lever 
1449bd2abef3SChuck Lever 	TP_fast_assign(
1450bd2abef3SChuck Lever 		__entry->avail = atomic_read(&rdma->sc_sq_avail);
1451bd2abef3SChuck Lever 		__entry->depth = rdma->sc_sq_depth;
1452bd2abef3SChuck Lever 		__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
1453bd2abef3SChuck Lever 	),
1454bd2abef3SChuck Lever 
1455bd2abef3SChuck Lever 	TP_printk("addr=%s sc_sq_avail=%d/%d",
1456bd2abef3SChuck Lever 		__get_str(addr), __entry->avail, __entry->depth
1457bd2abef3SChuck Lever 	)
1458bd2abef3SChuck Lever );
1459bd2abef3SChuck Lever 
1460bd2abef3SChuck Lever #define DEFINE_SQ_EVENT(name)						\
1461bd2abef3SChuck Lever 		DEFINE_EVENT(svcrdma_sendqueue_event, svcrdma_sq_##name,\
1462bd2abef3SChuck Lever 				TP_PROTO(				\
1463bd2abef3SChuck Lever 					const struct svcxprt_rdma *rdma \
1464bd2abef3SChuck Lever 				),					\
1465bd2abef3SChuck Lever 				TP_ARGS(rdma))
1466bd2abef3SChuck Lever 
1467bd2abef3SChuck Lever DEFINE_SQ_EVENT(full);
1468bd2abef3SChuck Lever DEFINE_SQ_EVENT(retry);
1469bd2abef3SChuck Lever 
1470e48f083eSChuck Lever #endif /* _TRACE_RPCRDMA_H */
1471e48f083eSChuck Lever 
1472e48f083eSChuck Lever #include <trace/define_trace.h>
1473