xref: /openbmc/linux/include/trace/events/rpcrdma.h (revision b4744e00)
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 /**
271b4744e00SChuck Lever  ** Connection events
272b4744e00SChuck Lever  **/
273b4744e00SChuck Lever 
274b4744e00SChuck Lever TRACE_EVENT(xprtrdma_conn_upcall,
275b4744e00SChuck Lever 	TP_PROTO(
276b4744e00SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
277b4744e00SChuck Lever 		struct rdma_cm_event *event
278b4744e00SChuck Lever 	),
279b4744e00SChuck Lever 
280b4744e00SChuck Lever 	TP_ARGS(r_xprt, event),
281b4744e00SChuck Lever 
282b4744e00SChuck Lever 	TP_STRUCT__entry(
283b4744e00SChuck Lever 		__field(const void *, r_xprt)
284b4744e00SChuck Lever 		__field(unsigned int, event)
285b4744e00SChuck Lever 		__field(int, status)
286b4744e00SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
287b4744e00SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
288b4744e00SChuck Lever 	),
289b4744e00SChuck Lever 
290b4744e00SChuck Lever 	TP_fast_assign(
291b4744e00SChuck Lever 		__entry->r_xprt = r_xprt;
292b4744e00SChuck Lever 		__entry->event = event->event;
293b4744e00SChuck Lever 		__entry->status = event->status;
294b4744e00SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
295b4744e00SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
296b4744e00SChuck Lever 	),
297b4744e00SChuck Lever 
298b4744e00SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: %s (%u/%d)",
299b4744e00SChuck Lever 		__get_str(addr), __get_str(port),
300b4744e00SChuck Lever 		__entry->r_xprt, rdma_show_cm_event(__entry->event),
301b4744e00SChuck Lever 		__entry->event, __entry->status
302b4744e00SChuck Lever 	)
303b4744e00SChuck Lever );
304b4744e00SChuck Lever 
305b4744e00SChuck Lever TRACE_EVENT(xprtrdma_disconnect,
306b4744e00SChuck Lever 	TP_PROTO(
307b4744e00SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
308b4744e00SChuck Lever 		int status
309b4744e00SChuck Lever 	),
310b4744e00SChuck Lever 
311b4744e00SChuck Lever 	TP_ARGS(r_xprt, status),
312b4744e00SChuck Lever 
313b4744e00SChuck Lever 	TP_STRUCT__entry(
314b4744e00SChuck Lever 		__field(const void *, r_xprt)
315b4744e00SChuck Lever 		__field(int, status)
316b4744e00SChuck Lever 		__field(int, connected)
317b4744e00SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
318b4744e00SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
319b4744e00SChuck Lever 	),
320b4744e00SChuck Lever 
321b4744e00SChuck Lever 	TP_fast_assign(
322b4744e00SChuck Lever 		__entry->r_xprt = r_xprt;
323b4744e00SChuck Lever 		__entry->status = status;
324b4744e00SChuck Lever 		__entry->connected = r_xprt->rx_ep.rep_connected;
325b4744e00SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
326b4744e00SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
327b4744e00SChuck Lever 	),
328b4744e00SChuck Lever 
329b4744e00SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: status=%d %sconnected",
330b4744e00SChuck Lever 		__get_str(addr), __get_str(port),
331b4744e00SChuck Lever 		__entry->r_xprt, __entry->status,
332b4744e00SChuck Lever 		__entry->connected == 1 ? "still " : "dis"
333b4744e00SChuck Lever 	)
334b4744e00SChuck Lever );
335b4744e00SChuck Lever 
336b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_conn_start);
337b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_conn_tout);
338b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_create);
339b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_destroy);
340b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_remove);
341b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_reinsert);
342b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_reconnect);
343b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_inject_dsc);
344b4744e00SChuck Lever 
345b4744e00SChuck Lever /**
346ab03eff5SChuck Lever  ** Call events
347ab03eff5SChuck Lever  **/
348ab03eff5SChuck Lever 
3491c443effSChuck Lever TRACE_EVENT(xprtrdma_createmrs,
3501c443effSChuck Lever 	TP_PROTO(
3511c443effSChuck Lever 		const struct rpcrdma_xprt *r_xprt,
3521c443effSChuck Lever 		unsigned int count
3531c443effSChuck Lever 	),
3541c443effSChuck Lever 
3551c443effSChuck Lever 	TP_ARGS(r_xprt, count),
3561c443effSChuck Lever 
3571c443effSChuck Lever 	TP_STRUCT__entry(
3581c443effSChuck Lever 		__field(const void *, r_xprt)
3591c443effSChuck Lever 		__field(unsigned int, count)
3601c443effSChuck Lever 	),
3611c443effSChuck Lever 
3621c443effSChuck Lever 	TP_fast_assign(
3631c443effSChuck Lever 		__entry->r_xprt = r_xprt;
3641c443effSChuck Lever 		__entry->count = count;
3651c443effSChuck Lever 	),
3661c443effSChuck Lever 
3671c443effSChuck Lever 	TP_printk("r_xprt=%p: created %u MRs",
3681c443effSChuck Lever 		__entry->r_xprt, __entry->count
3691c443effSChuck Lever 	)
3701c443effSChuck Lever );
3711c443effSChuck Lever 
3721c443effSChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_nomrs);
3731c443effSChuck Lever 
37458f10ad4SChuck Lever DEFINE_RDCH_EVENT(xprtrdma_read_chunk);
37558f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_write_chunk);
37658f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_reply_chunk);
37758f10ad4SChuck Lever 
378ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_noch);
379ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_readch);
380ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_areadch);
381ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_writech);
382ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_replych);
383ab03eff5SChuck Lever 
384ab03eff5SChuck Lever #define xprtrdma_show_chunktype(x)					\
385ab03eff5SChuck Lever 		__print_symbolic(x,					\
386ab03eff5SChuck Lever 				{ rpcrdma_noch, "inline" },		\
387ab03eff5SChuck Lever 				{ rpcrdma_readch, "read list" },	\
388ab03eff5SChuck Lever 				{ rpcrdma_areadch, "*read list" },	\
389ab03eff5SChuck Lever 				{ rpcrdma_writech, "write list" },	\
390ab03eff5SChuck Lever 				{ rpcrdma_replych, "reply chunk" })
391ab03eff5SChuck Lever 
392ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_marshal,
393ab03eff5SChuck Lever 	TP_PROTO(
394ab03eff5SChuck Lever 		const struct rpc_rqst *rqst,
395ab03eff5SChuck Lever 		unsigned int hdrlen,
396ab03eff5SChuck Lever 		unsigned int rtype,
397ab03eff5SChuck Lever 		unsigned int wtype
398ab03eff5SChuck Lever 	),
399ab03eff5SChuck Lever 
400ab03eff5SChuck Lever 	TP_ARGS(rqst, hdrlen, rtype, wtype),
401ab03eff5SChuck Lever 
402ab03eff5SChuck Lever 	TP_STRUCT__entry(
403ab03eff5SChuck Lever 		__field(unsigned int, task_id)
404ab03eff5SChuck Lever 		__field(unsigned int, client_id)
405ab03eff5SChuck Lever 		__field(u32, xid)
406ab03eff5SChuck Lever 		__field(unsigned int, hdrlen)
407ab03eff5SChuck Lever 		__field(unsigned int, headlen)
408ab03eff5SChuck Lever 		__field(unsigned int, pagelen)
409ab03eff5SChuck Lever 		__field(unsigned int, taillen)
410ab03eff5SChuck Lever 		__field(unsigned int, rtype)
411ab03eff5SChuck Lever 		__field(unsigned int, wtype)
412ab03eff5SChuck Lever 	),
413ab03eff5SChuck Lever 
414ab03eff5SChuck Lever 	TP_fast_assign(
415ab03eff5SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
416ab03eff5SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
417ab03eff5SChuck Lever 		__entry->xid = be32_to_cpu(rqst->rq_xid);
418ab03eff5SChuck Lever 		__entry->hdrlen = hdrlen;
419ab03eff5SChuck Lever 		__entry->headlen = rqst->rq_snd_buf.head[0].iov_len;
420ab03eff5SChuck Lever 		__entry->pagelen = rqst->rq_snd_buf.page_len;
421ab03eff5SChuck Lever 		__entry->taillen = rqst->rq_snd_buf.tail[0].iov_len;
422ab03eff5SChuck Lever 		__entry->rtype = rtype;
423ab03eff5SChuck Lever 		__entry->wtype = wtype;
424ab03eff5SChuck Lever 	),
425ab03eff5SChuck Lever 
426ab03eff5SChuck Lever 	TP_printk("task:%u@%u xid=0x%08x: hdr=%u xdr=%u/%u/%u %s/%s",
427ab03eff5SChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
428ab03eff5SChuck Lever 		__entry->hdrlen,
429ab03eff5SChuck Lever 		__entry->headlen, __entry->pagelen, __entry->taillen,
430ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->rtype),
431ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->wtype)
432ab03eff5SChuck Lever 	)
433ab03eff5SChuck Lever );
434ab03eff5SChuck Lever 
435ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_post_send,
436ab03eff5SChuck Lever 	TP_PROTO(
437ab03eff5SChuck Lever 		const struct rpcrdma_req *req,
438ab03eff5SChuck Lever 		int status
439ab03eff5SChuck Lever 	),
440ab03eff5SChuck Lever 
441ab03eff5SChuck Lever 	TP_ARGS(req, status),
442ab03eff5SChuck Lever 
443ab03eff5SChuck Lever 	TP_STRUCT__entry(
444ab03eff5SChuck Lever 		__field(const void *, req)
445ab03eff5SChuck Lever 		__field(int, num_sge)
446ab03eff5SChuck Lever 		__field(bool, signaled)
447ab03eff5SChuck Lever 		__field(int, status)
448ab03eff5SChuck Lever 	),
449ab03eff5SChuck Lever 
450ab03eff5SChuck Lever 	TP_fast_assign(
451ab03eff5SChuck Lever 		__entry->req = req;
452ab03eff5SChuck Lever 		__entry->num_sge = req->rl_sendctx->sc_wr.num_sge;
453ab03eff5SChuck Lever 		__entry->signaled = req->rl_sendctx->sc_wr.send_flags &
454ab03eff5SChuck Lever 				    IB_SEND_SIGNALED;
455ab03eff5SChuck Lever 		__entry->status = status;
456ab03eff5SChuck Lever 	),
457ab03eff5SChuck Lever 
458ab03eff5SChuck Lever 	TP_printk("req=%p, %d SGEs%s, status=%d",
459ab03eff5SChuck Lever 		__entry->req, __entry->num_sge,
460ab03eff5SChuck Lever 		(__entry->signaled ? ", signaled" : ""),
461ab03eff5SChuck Lever 		__entry->status
462ab03eff5SChuck Lever 	)
463ab03eff5SChuck Lever );
464ab03eff5SChuck Lever 
465b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_post_recv,
466b4a7f91cSChuck Lever 	TP_PROTO(
467b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
468b4a7f91cSChuck Lever 		int status
469b4a7f91cSChuck Lever 	),
470b4a7f91cSChuck Lever 
471b4a7f91cSChuck Lever 	TP_ARGS(rep, status),
472b4a7f91cSChuck Lever 
473b4a7f91cSChuck Lever 	TP_STRUCT__entry(
474b4a7f91cSChuck Lever 		__field(const void *, rep)
475b4a7f91cSChuck Lever 		__field(int, status)
476b4a7f91cSChuck Lever 	),
477b4a7f91cSChuck Lever 
478b4a7f91cSChuck Lever 	TP_fast_assign(
479b4a7f91cSChuck Lever 		__entry->rep = rep;
480b4a7f91cSChuck Lever 		__entry->status = status;
481b4a7f91cSChuck Lever 	),
482b4a7f91cSChuck Lever 
483b4a7f91cSChuck Lever 	TP_printk("rep=%p status=%d",
484b4a7f91cSChuck Lever 		__entry->rep, __entry->status
485b4a7f91cSChuck Lever 	)
486b4a7f91cSChuck Lever );
487b4a7f91cSChuck Lever 
488ab03eff5SChuck Lever /**
489ab03eff5SChuck Lever  ** Completion events
490ab03eff5SChuck Lever  **/
491ab03eff5SChuck Lever 
492ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_wc_send,
493ab03eff5SChuck Lever 	TP_PROTO(
494ab03eff5SChuck Lever 		const struct rpcrdma_sendctx *sc,
495ab03eff5SChuck Lever 		const struct ib_wc *wc
496ab03eff5SChuck Lever 	),
497ab03eff5SChuck Lever 
498ab03eff5SChuck Lever 	TP_ARGS(sc, wc),
499ab03eff5SChuck Lever 
500ab03eff5SChuck Lever 	TP_STRUCT__entry(
501ab03eff5SChuck Lever 		__field(const void *, req)
502ab03eff5SChuck Lever 		__field(unsigned int, unmap_count)
503ab03eff5SChuck Lever 		__field(unsigned int, status)
504ab03eff5SChuck Lever 		__field(unsigned int, vendor_err)
505ab03eff5SChuck Lever 	),
506ab03eff5SChuck Lever 
507ab03eff5SChuck Lever 	TP_fast_assign(
508ab03eff5SChuck Lever 		__entry->req = sc->sc_req;
509ab03eff5SChuck Lever 		__entry->unmap_count = sc->sc_unmap_count;
510ab03eff5SChuck Lever 		__entry->status = wc->status;
511ab03eff5SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
512ab03eff5SChuck Lever 	),
513ab03eff5SChuck Lever 
514ab03eff5SChuck Lever 	TP_printk("req=%p, unmapped %u pages: %s (%u/0x%x)",
515ab03eff5SChuck Lever 		__entry->req, __entry->unmap_count,
516ab03eff5SChuck Lever 		rdma_show_wc_status(__entry->status),
517ab03eff5SChuck Lever 		__entry->status, __entry->vendor_err
518ab03eff5SChuck Lever 	)
519ab03eff5SChuck Lever );
520ab03eff5SChuck Lever 
521b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_wc_receive,
522b4a7f91cSChuck Lever 	TP_PROTO(
523b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
524b4a7f91cSChuck Lever 		const struct ib_wc *wc
525b4a7f91cSChuck Lever 	),
526b4a7f91cSChuck Lever 
527b4a7f91cSChuck Lever 	TP_ARGS(rep, wc),
528b4a7f91cSChuck Lever 
529b4a7f91cSChuck Lever 	TP_STRUCT__entry(
530b4a7f91cSChuck Lever 		__field(const void *, rep)
531b4a7f91cSChuck Lever 		__field(unsigned int, byte_len)
532b4a7f91cSChuck Lever 		__field(unsigned int, status)
533b4a7f91cSChuck Lever 		__field(unsigned int, vendor_err)
534b4a7f91cSChuck Lever 	),
535b4a7f91cSChuck Lever 
536b4a7f91cSChuck Lever 	TP_fast_assign(
537b4a7f91cSChuck Lever 		__entry->rep = rep;
538b4a7f91cSChuck Lever 		__entry->byte_len = wc->byte_len;
539b4a7f91cSChuck Lever 		__entry->status = wc->status;
540b4a7f91cSChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
541b4a7f91cSChuck Lever 	),
542b4a7f91cSChuck Lever 
543b4a7f91cSChuck Lever 	TP_printk("rep=%p, %u bytes: %s (%u/0x%x)",
544b4a7f91cSChuck Lever 		__entry->rep, __entry->byte_len,
545b4a7f91cSChuck Lever 		rdma_show_wc_status(__entry->status),
546b4a7f91cSChuck Lever 		__entry->status, __entry->vendor_err
547b4a7f91cSChuck Lever 	)
548b4a7f91cSChuck Lever );
549b4a7f91cSChuck Lever 
55058f10ad4SChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_fastreg);
5512937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li);
5522937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li_wake);
5532937fedeSChuck Lever 
5542937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_localinv);
5552937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_dma_unmap);
5562937fedeSChuck Lever DEFINE_MR_EVENT(xprtrdma_remoteinv);
5571c443effSChuck Lever DEFINE_MR_EVENT(xprtrdma_recover_mr);
55858f10ad4SChuck Lever 
559b4a7f91cSChuck Lever /**
560b4a7f91cSChuck Lever  ** Reply events
561b4a7f91cSChuck Lever  **/
562b4a7f91cSChuck Lever 
563b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_reply,
564b4a7f91cSChuck Lever 	TP_PROTO(
565b4a7f91cSChuck Lever 		const struct rpc_task *task,
566b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
567b4a7f91cSChuck Lever 		const struct rpcrdma_req *req,
568b4a7f91cSChuck Lever 		unsigned int credits
569b4a7f91cSChuck Lever 	),
570b4a7f91cSChuck Lever 
571b4a7f91cSChuck Lever 	TP_ARGS(task, rep, req, credits),
572b4a7f91cSChuck Lever 
573b4a7f91cSChuck Lever 	TP_STRUCT__entry(
574b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
575b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
576b4a7f91cSChuck Lever 		__field(const void *, rep)
577b4a7f91cSChuck Lever 		__field(const void *, req)
578b4a7f91cSChuck Lever 		__field(u32, xid)
579b4a7f91cSChuck Lever 		__field(unsigned int, credits)
580b4a7f91cSChuck Lever 	),
581b4a7f91cSChuck Lever 
582b4a7f91cSChuck Lever 	TP_fast_assign(
583b4a7f91cSChuck Lever 		__entry->task_id = task->tk_pid;
584b4a7f91cSChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
585b4a7f91cSChuck Lever 		__entry->rep = rep;
586b4a7f91cSChuck Lever 		__entry->req = req;
587b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
588b4a7f91cSChuck Lever 		__entry->credits = credits;
589b4a7f91cSChuck Lever 	),
590b4a7f91cSChuck Lever 
591b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x, %u credits, rep=%p -> req=%p",
592b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
593b4a7f91cSChuck Lever 		__entry->credits, __entry->rep, __entry->req
594b4a7f91cSChuck Lever 	)
595b4a7f91cSChuck Lever );
596b4a7f91cSChuck Lever 
597b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_defer_cmp,
598b4a7f91cSChuck Lever 	TP_PROTO(
599b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep
600b4a7f91cSChuck Lever 	),
601b4a7f91cSChuck Lever 
602b4a7f91cSChuck Lever 	TP_ARGS(rep),
603b4a7f91cSChuck Lever 
604b4a7f91cSChuck Lever 	TP_STRUCT__entry(
605b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
606b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
607b4a7f91cSChuck Lever 		__field(const void *, rep)
608b4a7f91cSChuck Lever 		__field(u32, xid)
609b4a7f91cSChuck Lever 	),
610b4a7f91cSChuck Lever 
611b4a7f91cSChuck Lever 	TP_fast_assign(
612b4a7f91cSChuck Lever 		__entry->task_id = rep->rr_rqst->rq_task->tk_pid;
613b4a7f91cSChuck Lever 		__entry->client_id = rep->rr_rqst->rq_task->tk_client->cl_clid;
614b4a7f91cSChuck Lever 		__entry->rep = rep;
615b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
616b4a7f91cSChuck Lever 	),
617b4a7f91cSChuck Lever 
618b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x rep=%p",
619b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
620b4a7f91cSChuck Lever 		__entry->rep
621b4a7f91cSChuck Lever 	)
622b4a7f91cSChuck Lever );
623b4a7f91cSChuck Lever 
624b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_vers);
625b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_rqst);
626b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_short);
627b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_hdr);
628b4a7f91cSChuck Lever 
629e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup,
630e11b7c96SChuck Lever 	TP_PROTO(
631e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
632e11b7c96SChuck Lever 		int len,
633e11b7c96SChuck Lever 		int hdrlen
634e11b7c96SChuck Lever 	),
635e11b7c96SChuck Lever 
636e11b7c96SChuck Lever 	TP_ARGS(rqst, len, hdrlen),
637e11b7c96SChuck Lever 
638e11b7c96SChuck Lever 	TP_STRUCT__entry(
639e11b7c96SChuck Lever 		__field(unsigned int, task_id)
640e11b7c96SChuck Lever 		__field(unsigned int, client_id)
641e11b7c96SChuck Lever 		__field(const void *, base)
642e11b7c96SChuck Lever 		__field(int, len)
643e11b7c96SChuck Lever 		__field(int, hdrlen)
644e11b7c96SChuck Lever 	),
645e11b7c96SChuck Lever 
646e11b7c96SChuck Lever 	TP_fast_assign(
647e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
648e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
649e11b7c96SChuck Lever 		__entry->base = rqst->rq_rcv_buf.head[0].iov_base;
650e11b7c96SChuck Lever 		__entry->len = len;
651e11b7c96SChuck Lever 		__entry->hdrlen = hdrlen;
652e11b7c96SChuck Lever 	),
653e11b7c96SChuck Lever 
654e11b7c96SChuck Lever 	TP_printk("task:%u@%u base=%p len=%d hdrlen=%d",
655e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
656e11b7c96SChuck Lever 		__entry->base, __entry->len, __entry->hdrlen
657e11b7c96SChuck Lever 	)
658e11b7c96SChuck Lever );
659e11b7c96SChuck Lever 
660e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup_pg,
661e11b7c96SChuck Lever 	TP_PROTO(
662e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
663e11b7c96SChuck Lever 		int pageno,
664e11b7c96SChuck Lever 		const void *pos,
665e11b7c96SChuck Lever 		int len,
666e11b7c96SChuck Lever 		int curlen
667e11b7c96SChuck Lever 	),
668e11b7c96SChuck Lever 
669e11b7c96SChuck Lever 	TP_ARGS(rqst, pageno, pos, len, curlen),
670e11b7c96SChuck Lever 
671e11b7c96SChuck Lever 	TP_STRUCT__entry(
672e11b7c96SChuck Lever 		__field(unsigned int, task_id)
673e11b7c96SChuck Lever 		__field(unsigned int, client_id)
674e11b7c96SChuck Lever 		__field(const void *, pos)
675e11b7c96SChuck Lever 		__field(int, pageno)
676e11b7c96SChuck Lever 		__field(int, len)
677e11b7c96SChuck Lever 		__field(int, curlen)
678e11b7c96SChuck Lever 	),
679e11b7c96SChuck Lever 
680e11b7c96SChuck Lever 	TP_fast_assign(
681e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
682e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
683e11b7c96SChuck Lever 		__entry->pos = pos;
684e11b7c96SChuck Lever 		__entry->pageno = pageno;
685e11b7c96SChuck Lever 		__entry->len = len;
686e11b7c96SChuck Lever 		__entry->curlen = curlen;
687e11b7c96SChuck Lever 	),
688e11b7c96SChuck Lever 
689e11b7c96SChuck Lever 	TP_printk("task:%u@%u pageno=%d pos=%p len=%d curlen=%d",
690e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
691e11b7c96SChuck Lever 		__entry->pageno, __entry->pos, __entry->len, __entry->curlen
692e11b7c96SChuck Lever 	)
693e11b7c96SChuck Lever );
694e11b7c96SChuck Lever 
695e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_decode_seg,
696e11b7c96SChuck Lever 	TP_PROTO(
697e11b7c96SChuck Lever 		u32 handle,
698e11b7c96SChuck Lever 		u32 length,
699e11b7c96SChuck Lever 		u64 offset
700e11b7c96SChuck Lever 	),
701e11b7c96SChuck Lever 
702e11b7c96SChuck Lever 	TP_ARGS(handle, length, offset),
703e11b7c96SChuck Lever 
704e11b7c96SChuck Lever 	TP_STRUCT__entry(
705e11b7c96SChuck Lever 		__field(u32, handle)
706e11b7c96SChuck Lever 		__field(u32, length)
707e11b7c96SChuck Lever 		__field(u64, offset)
708e11b7c96SChuck Lever 	),
709e11b7c96SChuck Lever 
710e11b7c96SChuck Lever 	TP_fast_assign(
711e11b7c96SChuck Lever 		__entry->handle = handle;
712e11b7c96SChuck Lever 		__entry->length = length;
713e11b7c96SChuck Lever 		__entry->offset = offset;
714e11b7c96SChuck Lever 	),
715e11b7c96SChuck Lever 
716e11b7c96SChuck Lever 	TP_printk("%u@0x%016llx:0x%08x",
717e11b7c96SChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
718e11b7c96SChuck Lever 		__entry->handle
719e11b7c96SChuck Lever 	)
720e11b7c96SChuck Lever );
721e11b7c96SChuck Lever 
722e48f083eSChuck Lever #endif /* _TRACE_RPCRDMA_H */
723e48f083eSChuck Lever 
724e48f083eSChuck Lever #include <trace/define_trace.h>
725