xref: /openbmc/linux/include/trace/events/rpcrdma.h (revision aba11831)
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(unsigned int, pos)
10158f10ad4SChuck Lever 		__field(int, nents)
10258f10ad4SChuck Lever 		__field(u32, handle)
10358f10ad4SChuck Lever 		__field(u32, length)
10458f10ad4SChuck Lever 		__field(u64, offset)
10558f10ad4SChuck Lever 		__field(int, nsegs)
10658f10ad4SChuck Lever 	),
10758f10ad4SChuck Lever 
10858f10ad4SChuck Lever 	TP_fast_assign(
10958f10ad4SChuck Lever 		__entry->task_id = task->tk_pid;
11058f10ad4SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
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 
119aba11831SChuck Lever 	TP_printk("task:%u@%u pos=%u %u@0x%016llx:0x%08x (%s)",
120aba11831SChuck Lever 		__entry->task_id, __entry->client_id,
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)						\
128aba11831SChuck Lever 		DEFINE_EVENT(xprtrdma_rdch_event, xprtrdma_chunk_##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(int, nents)
15058f10ad4SChuck Lever 		__field(u32, handle)
15158f10ad4SChuck Lever 		__field(u32, length)
15258f10ad4SChuck Lever 		__field(u64, offset)
15358f10ad4SChuck Lever 		__field(int, nsegs)
15458f10ad4SChuck Lever 	),
15558f10ad4SChuck Lever 
15658f10ad4SChuck Lever 	TP_fast_assign(
15758f10ad4SChuck Lever 		__entry->task_id = task->tk_pid;
15858f10ad4SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
15958f10ad4SChuck Lever 		__entry->nents = mr->mr_nents;
16058f10ad4SChuck Lever 		__entry->handle = mr->mr_handle;
16158f10ad4SChuck Lever 		__entry->length = mr->mr_length;
16258f10ad4SChuck Lever 		__entry->offset = mr->mr_offset;
16358f10ad4SChuck Lever 		__entry->nsegs = nsegs;
16458f10ad4SChuck Lever 	),
16558f10ad4SChuck Lever 
166aba11831SChuck Lever 	TP_printk("task:%u@%u %u@0x%016llx:0x%08x (%s)",
167aba11831SChuck Lever 		__entry->task_id, __entry->client_id,
16858f10ad4SChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
16958f10ad4SChuck Lever 		__entry->handle,
17058f10ad4SChuck Lever 		__entry->nents < __entry->nsegs ? "more" : "last"
17158f10ad4SChuck Lever 	)
17258f10ad4SChuck Lever );
17358f10ad4SChuck Lever 
17458f10ad4SChuck Lever #define DEFINE_WRCH_EVENT(name)						\
175aba11831SChuck Lever 		DEFINE_EVENT(xprtrdma_wrch_event, xprtrdma_chunk_##name,\
17658f10ad4SChuck Lever 				TP_PROTO(				\
17758f10ad4SChuck Lever 					const struct rpc_task *task,	\
17858f10ad4SChuck Lever 					struct rpcrdma_mr *mr,		\
17958f10ad4SChuck Lever 					int nsegs			\
18058f10ad4SChuck Lever 				),					\
18158f10ad4SChuck Lever 				TP_ARGS(task, mr, nsegs))
18258f10ad4SChuck Lever 
18358f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_INVALID);
18458f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_VALID);
18558f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_FR);
18658f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_LI);
18758f10ad4SChuck Lever 
18858f10ad4SChuck Lever #define xprtrdma_show_frwr_state(x)					\
18958f10ad4SChuck Lever 		__print_symbolic(x,					\
19058f10ad4SChuck Lever 				{ FRWR_IS_INVALID, "INVALID" },		\
19158f10ad4SChuck Lever 				{ FRWR_IS_VALID, "VALID" },		\
19258f10ad4SChuck Lever 				{ FRWR_FLUSHED_FR, "FLUSHED_FR" },	\
19358f10ad4SChuck Lever 				{ FRWR_FLUSHED_LI, "FLUSHED_LI" })
19458f10ad4SChuck Lever 
19558f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_frwr_done,
19658f10ad4SChuck Lever 	TP_PROTO(
19758f10ad4SChuck Lever 		const struct ib_wc *wc,
19858f10ad4SChuck Lever 		const struct rpcrdma_frwr *frwr
19958f10ad4SChuck Lever 	),
20058f10ad4SChuck Lever 
20158f10ad4SChuck Lever 	TP_ARGS(wc, frwr),
20258f10ad4SChuck Lever 
20358f10ad4SChuck Lever 	TP_STRUCT__entry(
20458f10ad4SChuck Lever 		__field(const void *, mr)
20558f10ad4SChuck Lever 		__field(unsigned int, state)
20658f10ad4SChuck Lever 		__field(unsigned int, status)
20758f10ad4SChuck Lever 		__field(unsigned int, vendor_err)
20858f10ad4SChuck Lever 	),
20958f10ad4SChuck Lever 
21058f10ad4SChuck Lever 	TP_fast_assign(
21158f10ad4SChuck Lever 		__entry->mr = container_of(frwr, struct rpcrdma_mr, frwr);
21258f10ad4SChuck Lever 		__entry->state = frwr->fr_state;
21358f10ad4SChuck Lever 		__entry->status = wc->status;
21458f10ad4SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
21558f10ad4SChuck Lever 	),
21658f10ad4SChuck Lever 
21758f10ad4SChuck Lever 	TP_printk(
21858f10ad4SChuck Lever 		"mr=%p state=%s: %s (%u/0x%x)",
21958f10ad4SChuck Lever 		__entry->mr, xprtrdma_show_frwr_state(__entry->state),
22058f10ad4SChuck Lever 		rdma_show_wc_status(__entry->status),
22158f10ad4SChuck Lever 		__entry->status, __entry->vendor_err
22258f10ad4SChuck Lever 	)
22358f10ad4SChuck Lever );
22458f10ad4SChuck Lever 
22558f10ad4SChuck Lever #define DEFINE_FRWR_DONE_EVENT(name)					\
22658f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_frwr_done, name,			\
22758f10ad4SChuck Lever 				TP_PROTO(				\
22858f10ad4SChuck Lever 					const struct ib_wc *wc,		\
22958f10ad4SChuck Lever 					const struct rpcrdma_frwr *frwr	\
23058f10ad4SChuck Lever 				),					\
23158f10ad4SChuck Lever 				TP_ARGS(wc, frwr))
23258f10ad4SChuck Lever 
233aba11831SChuck Lever TRACE_DEFINE_ENUM(DMA_BIDIRECTIONAL);
234aba11831SChuck Lever TRACE_DEFINE_ENUM(DMA_TO_DEVICE);
235aba11831SChuck Lever TRACE_DEFINE_ENUM(DMA_FROM_DEVICE);
236aba11831SChuck Lever TRACE_DEFINE_ENUM(DMA_NONE);
237aba11831SChuck Lever 
238aba11831SChuck Lever #define xprtrdma_show_direction(x)					\
239aba11831SChuck Lever 		__print_symbolic(x,					\
240aba11831SChuck Lever 				{ DMA_BIDIRECTIONAL, "BIDIR" },		\
241aba11831SChuck Lever 				{ DMA_TO_DEVICE, "TO_DEVICE" },		\
242aba11831SChuck Lever 				{ DMA_FROM_DEVICE, "FROM_DEVICE" },	\
243aba11831SChuck Lever 				{ DMA_NONE, "NONE" })
244aba11831SChuck Lever 
2452937fedeSChuck Lever DECLARE_EVENT_CLASS(xprtrdma_mr,
2462937fedeSChuck Lever 	TP_PROTO(
2472937fedeSChuck Lever 		const struct rpcrdma_mr *mr
2482937fedeSChuck Lever 	),
2492937fedeSChuck Lever 
2502937fedeSChuck Lever 	TP_ARGS(mr),
2512937fedeSChuck Lever 
2522937fedeSChuck Lever 	TP_STRUCT__entry(
2532937fedeSChuck Lever 		__field(const void *, mr)
2542937fedeSChuck Lever 		__field(u32, handle)
2552937fedeSChuck Lever 		__field(u32, length)
2562937fedeSChuck Lever 		__field(u64, offset)
257aba11831SChuck Lever 		__field(u32, dir)
2582937fedeSChuck Lever 	),
2592937fedeSChuck Lever 
2602937fedeSChuck Lever 	TP_fast_assign(
2612937fedeSChuck Lever 		__entry->mr = mr;
2622937fedeSChuck Lever 		__entry->handle = mr->mr_handle;
2632937fedeSChuck Lever 		__entry->length = mr->mr_length;
2642937fedeSChuck Lever 		__entry->offset = mr->mr_offset;
265aba11831SChuck Lever 		__entry->dir    = mr->mr_dir;
2662937fedeSChuck Lever 	),
2672937fedeSChuck Lever 
268aba11831SChuck Lever 	TP_printk("mr=%p %u@0x%016llx:0x%08x (%s)",
2692937fedeSChuck Lever 		__entry->mr, __entry->length,
270aba11831SChuck Lever 		(unsigned long long)__entry->offset, __entry->handle,
271aba11831SChuck Lever 		xprtrdma_show_direction(__entry->dir)
2722937fedeSChuck Lever 	)
2732937fedeSChuck Lever );
2742937fedeSChuck Lever 
2752937fedeSChuck Lever #define DEFINE_MR_EVENT(name) \
276d379eaa8SChuck Lever 		DEFINE_EVENT(xprtrdma_mr, xprtrdma_mr_##name, \
2772937fedeSChuck Lever 				TP_PROTO( \
2782937fedeSChuck Lever 					const struct rpcrdma_mr *mr \
2792937fedeSChuck Lever 				), \
2802937fedeSChuck Lever 				TP_ARGS(mr))
2812937fedeSChuck Lever 
282fc1eb807SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_cb_event,
283fc1eb807SChuck Lever 	TP_PROTO(
284fc1eb807SChuck Lever 		const struct rpc_rqst *rqst
285fc1eb807SChuck Lever 	),
286fc1eb807SChuck Lever 
287fc1eb807SChuck Lever 	TP_ARGS(rqst),
288fc1eb807SChuck Lever 
289fc1eb807SChuck Lever 	TP_STRUCT__entry(
290fc1eb807SChuck Lever 		__field(const void *, rqst)
291fc1eb807SChuck Lever 		__field(const void *, rep)
292fc1eb807SChuck Lever 		__field(const void *, req)
293fc1eb807SChuck Lever 		__field(u32, xid)
294fc1eb807SChuck Lever 	),
295fc1eb807SChuck Lever 
296fc1eb807SChuck Lever 	TP_fast_assign(
297fc1eb807SChuck Lever 		__entry->rqst = rqst;
298fc1eb807SChuck Lever 		__entry->req = rpcr_to_rdmar(rqst);
299fc1eb807SChuck Lever 		__entry->rep = rpcr_to_rdmar(rqst)->rl_reply;
300fc1eb807SChuck Lever 		__entry->xid = be32_to_cpu(rqst->rq_xid);
301fc1eb807SChuck Lever 	),
302fc1eb807SChuck Lever 
303fc1eb807SChuck Lever 	TP_printk("xid=0x%08x, rqst=%p req=%p rep=%p",
304fc1eb807SChuck Lever 		__entry->xid, __entry->rqst, __entry->req, __entry->rep
305fc1eb807SChuck Lever 	)
306fc1eb807SChuck Lever );
307fc1eb807SChuck Lever 
308fc1eb807SChuck Lever #define DEFINE_CB_EVENT(name)						\
309fc1eb807SChuck Lever 		DEFINE_EVENT(xprtrdma_cb_event, name,			\
310fc1eb807SChuck Lever 				TP_PROTO(				\
311fc1eb807SChuck Lever 					const struct rpc_rqst *rqst	\
312fc1eb807SChuck Lever 				),					\
313fc1eb807SChuck Lever 				TP_ARGS(rqst))
314fc1eb807SChuck Lever 
315b4a7f91cSChuck Lever /**
316b4744e00SChuck Lever  ** Connection events
317b4744e00SChuck Lever  **/
318b4744e00SChuck Lever 
319ae38288eSChuck Lever TRACE_EVENT(xprtrdma_cm_event,
320b4744e00SChuck Lever 	TP_PROTO(
321b4744e00SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
322b4744e00SChuck Lever 		struct rdma_cm_event *event
323b4744e00SChuck Lever 	),
324b4744e00SChuck Lever 
325b4744e00SChuck Lever 	TP_ARGS(r_xprt, event),
326b4744e00SChuck Lever 
327b4744e00SChuck Lever 	TP_STRUCT__entry(
328b4744e00SChuck Lever 		__field(const void *, r_xprt)
329b4744e00SChuck Lever 		__field(unsigned int, event)
330b4744e00SChuck Lever 		__field(int, status)
331b4744e00SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
332b4744e00SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
333b4744e00SChuck Lever 	),
334b4744e00SChuck Lever 
335b4744e00SChuck Lever 	TP_fast_assign(
336b4744e00SChuck Lever 		__entry->r_xprt = r_xprt;
337b4744e00SChuck Lever 		__entry->event = event->event;
338b4744e00SChuck Lever 		__entry->status = event->status;
339b4744e00SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
340b4744e00SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
341b4744e00SChuck Lever 	),
342b4744e00SChuck Lever 
343b4744e00SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: %s (%u/%d)",
344b4744e00SChuck Lever 		__get_str(addr), __get_str(port),
345b4744e00SChuck Lever 		__entry->r_xprt, rdma_show_cm_event(__entry->event),
346b4744e00SChuck Lever 		__entry->event, __entry->status
347b4744e00SChuck Lever 	)
348b4744e00SChuck Lever );
349b4744e00SChuck Lever 
350b4744e00SChuck Lever TRACE_EVENT(xprtrdma_disconnect,
351b4744e00SChuck Lever 	TP_PROTO(
352b4744e00SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
353b4744e00SChuck Lever 		int status
354b4744e00SChuck Lever 	),
355b4744e00SChuck Lever 
356b4744e00SChuck Lever 	TP_ARGS(r_xprt, status),
357b4744e00SChuck Lever 
358b4744e00SChuck Lever 	TP_STRUCT__entry(
359b4744e00SChuck Lever 		__field(const void *, r_xprt)
360b4744e00SChuck Lever 		__field(int, status)
361b4744e00SChuck Lever 		__field(int, connected)
362b4744e00SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
363b4744e00SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
364b4744e00SChuck Lever 	),
365b4744e00SChuck Lever 
366b4744e00SChuck Lever 	TP_fast_assign(
367b4744e00SChuck Lever 		__entry->r_xprt = r_xprt;
368b4744e00SChuck Lever 		__entry->status = status;
369b4744e00SChuck Lever 		__entry->connected = r_xprt->rx_ep.rep_connected;
370b4744e00SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
371b4744e00SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
372b4744e00SChuck Lever 	),
373b4744e00SChuck Lever 
374b4744e00SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: status=%d %sconnected",
375b4744e00SChuck Lever 		__get_str(addr), __get_str(port),
376b4744e00SChuck Lever 		__entry->r_xprt, __entry->status,
377b4744e00SChuck Lever 		__entry->connected == 1 ? "still " : "dis"
378b4744e00SChuck Lever 	)
379b4744e00SChuck Lever );
380b4744e00SChuck Lever 
381b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_conn_start);
382b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_conn_tout);
383b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_create);
384b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_destroy);
385b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_remove);
386b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_reinsert);
387b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_reconnect);
388b4744e00SChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_inject_dsc);
389b4744e00SChuck Lever 
390f9521d53SChuck Lever TRACE_EVENT(xprtrdma_qp_event,
391643cf323SChuck Lever 	TP_PROTO(
392643cf323SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
393643cf323SChuck Lever 		const struct ib_event *event
394643cf323SChuck Lever 	),
395643cf323SChuck Lever 
396643cf323SChuck Lever 	TP_ARGS(r_xprt, event),
397643cf323SChuck Lever 
398643cf323SChuck Lever 	TP_STRUCT__entry(
399643cf323SChuck Lever 		__field(const void *, r_xprt)
400643cf323SChuck Lever 		__field(unsigned int, event)
401643cf323SChuck Lever 		__string(name, event->device->name)
402643cf323SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
403643cf323SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
404643cf323SChuck Lever 	),
405643cf323SChuck Lever 
406643cf323SChuck Lever 	TP_fast_assign(
407643cf323SChuck Lever 		__entry->r_xprt = r_xprt;
408643cf323SChuck Lever 		__entry->event = event->event;
409643cf323SChuck Lever 		__assign_str(name, event->device->name);
410643cf323SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
411643cf323SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
412643cf323SChuck Lever 	),
413643cf323SChuck Lever 
414643cf323SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: dev %s: %s (%u)",
415643cf323SChuck Lever 		__get_str(addr), __get_str(port), __entry->r_xprt,
416643cf323SChuck Lever 		__get_str(name), rdma_show_ib_event(__entry->event),
417643cf323SChuck Lever 		__entry->event
418643cf323SChuck Lever 	)
419643cf323SChuck Lever );
420643cf323SChuck Lever 
421b4744e00SChuck Lever /**
422ab03eff5SChuck Lever  ** Call events
423ab03eff5SChuck Lever  **/
424ab03eff5SChuck Lever 
4251c443effSChuck Lever TRACE_EVENT(xprtrdma_createmrs,
4261c443effSChuck Lever 	TP_PROTO(
4271c443effSChuck Lever 		const struct rpcrdma_xprt *r_xprt,
4281c443effSChuck Lever 		unsigned int count
4291c443effSChuck Lever 	),
4301c443effSChuck Lever 
4311c443effSChuck Lever 	TP_ARGS(r_xprt, count),
4321c443effSChuck Lever 
4331c443effSChuck Lever 	TP_STRUCT__entry(
4341c443effSChuck Lever 		__field(const void *, r_xprt)
4351c443effSChuck Lever 		__field(unsigned int, count)
4361c443effSChuck Lever 	),
4371c443effSChuck Lever 
4381c443effSChuck Lever 	TP_fast_assign(
4391c443effSChuck Lever 		__entry->r_xprt = r_xprt;
4401c443effSChuck Lever 		__entry->count = count;
4411c443effSChuck Lever 	),
4421c443effSChuck Lever 
4431c443effSChuck Lever 	TP_printk("r_xprt=%p: created %u MRs",
4441c443effSChuck Lever 		__entry->r_xprt, __entry->count
4451c443effSChuck Lever 	)
4461c443effSChuck Lever );
4471c443effSChuck Lever 
4481c443effSChuck Lever DEFINE_RXPRT_EVENT(xprtrdma_nomrs);
4491c443effSChuck Lever 
450aba11831SChuck Lever DEFINE_RDCH_EVENT(read);
451aba11831SChuck Lever DEFINE_WRCH_EVENT(write);
452aba11831SChuck Lever DEFINE_WRCH_EVENT(reply);
45358f10ad4SChuck Lever 
454ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_noch);
455ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_readch);
456ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_areadch);
457ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_writech);
458ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_replych);
459ab03eff5SChuck Lever 
460ab03eff5SChuck Lever #define xprtrdma_show_chunktype(x)					\
461ab03eff5SChuck Lever 		__print_symbolic(x,					\
462ab03eff5SChuck Lever 				{ rpcrdma_noch, "inline" },		\
463ab03eff5SChuck Lever 				{ rpcrdma_readch, "read list" },	\
464ab03eff5SChuck Lever 				{ rpcrdma_areadch, "*read list" },	\
465ab03eff5SChuck Lever 				{ rpcrdma_writech, "write list" },	\
466ab03eff5SChuck Lever 				{ rpcrdma_replych, "reply chunk" })
467ab03eff5SChuck Lever 
468ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_marshal,
469ab03eff5SChuck Lever 	TP_PROTO(
470ab03eff5SChuck Lever 		const struct rpc_rqst *rqst,
471ab03eff5SChuck Lever 		unsigned int hdrlen,
472ab03eff5SChuck Lever 		unsigned int rtype,
473ab03eff5SChuck Lever 		unsigned int wtype
474ab03eff5SChuck Lever 	),
475ab03eff5SChuck Lever 
476ab03eff5SChuck Lever 	TP_ARGS(rqst, hdrlen, rtype, wtype),
477ab03eff5SChuck Lever 
478ab03eff5SChuck Lever 	TP_STRUCT__entry(
479ab03eff5SChuck Lever 		__field(unsigned int, task_id)
480ab03eff5SChuck Lever 		__field(unsigned int, client_id)
481ab03eff5SChuck Lever 		__field(u32, xid)
482ab03eff5SChuck Lever 		__field(unsigned int, hdrlen)
483ab03eff5SChuck Lever 		__field(unsigned int, headlen)
484ab03eff5SChuck Lever 		__field(unsigned int, pagelen)
485ab03eff5SChuck Lever 		__field(unsigned int, taillen)
486ab03eff5SChuck Lever 		__field(unsigned int, rtype)
487ab03eff5SChuck Lever 		__field(unsigned int, wtype)
488ab03eff5SChuck Lever 	),
489ab03eff5SChuck Lever 
490ab03eff5SChuck Lever 	TP_fast_assign(
491ab03eff5SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
492ab03eff5SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
493ab03eff5SChuck Lever 		__entry->xid = be32_to_cpu(rqst->rq_xid);
494ab03eff5SChuck Lever 		__entry->hdrlen = hdrlen;
495ab03eff5SChuck Lever 		__entry->headlen = rqst->rq_snd_buf.head[0].iov_len;
496ab03eff5SChuck Lever 		__entry->pagelen = rqst->rq_snd_buf.page_len;
497ab03eff5SChuck Lever 		__entry->taillen = rqst->rq_snd_buf.tail[0].iov_len;
498ab03eff5SChuck Lever 		__entry->rtype = rtype;
499ab03eff5SChuck Lever 		__entry->wtype = wtype;
500ab03eff5SChuck Lever 	),
501ab03eff5SChuck Lever 
502ab03eff5SChuck Lever 	TP_printk("task:%u@%u xid=0x%08x: hdr=%u xdr=%u/%u/%u %s/%s",
503ab03eff5SChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
504ab03eff5SChuck Lever 		__entry->hdrlen,
505ab03eff5SChuck Lever 		__entry->headlen, __entry->pagelen, __entry->taillen,
506ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->rtype),
507ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->wtype)
508ab03eff5SChuck Lever 	)
509ab03eff5SChuck Lever );
510ab03eff5SChuck Lever 
511ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_post_send,
512ab03eff5SChuck Lever 	TP_PROTO(
513ab03eff5SChuck Lever 		const struct rpcrdma_req *req,
514ab03eff5SChuck Lever 		int status
515ab03eff5SChuck Lever 	),
516ab03eff5SChuck Lever 
517ab03eff5SChuck Lever 	TP_ARGS(req, status),
518ab03eff5SChuck Lever 
519ab03eff5SChuck Lever 	TP_STRUCT__entry(
520ab03eff5SChuck Lever 		__field(const void *, req)
521ab03eff5SChuck Lever 		__field(int, num_sge)
522470443e0SChuck Lever 		__field(int, signaled)
523ab03eff5SChuck Lever 		__field(int, status)
524ab03eff5SChuck Lever 	),
525ab03eff5SChuck Lever 
526ab03eff5SChuck Lever 	TP_fast_assign(
527ab03eff5SChuck Lever 		__entry->req = req;
528ab03eff5SChuck Lever 		__entry->num_sge = req->rl_sendctx->sc_wr.num_sge;
529ab03eff5SChuck Lever 		__entry->signaled = req->rl_sendctx->sc_wr.send_flags &
530ab03eff5SChuck Lever 				    IB_SEND_SIGNALED;
531ab03eff5SChuck Lever 		__entry->status = status;
532ab03eff5SChuck Lever 	),
533ab03eff5SChuck Lever 
534ab03eff5SChuck Lever 	TP_printk("req=%p, %d SGEs%s, status=%d",
535ab03eff5SChuck Lever 		__entry->req, __entry->num_sge,
536ab03eff5SChuck Lever 		(__entry->signaled ? ", signaled" : ""),
537ab03eff5SChuck Lever 		__entry->status
538ab03eff5SChuck Lever 	)
539ab03eff5SChuck Lever );
540ab03eff5SChuck Lever 
541b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_post_recv,
542b4a7f91cSChuck Lever 	TP_PROTO(
5430e0b854cSChuck Lever 		const struct ib_cqe *cqe
544b4a7f91cSChuck Lever 	),
545b4a7f91cSChuck Lever 
5460e0b854cSChuck Lever 	TP_ARGS(cqe),
547b4a7f91cSChuck Lever 
548b4a7f91cSChuck Lever 	TP_STRUCT__entry(
5490e0b854cSChuck Lever 		__field(const void *, cqe)
550b4a7f91cSChuck Lever 	),
551b4a7f91cSChuck Lever 
552b4a7f91cSChuck Lever 	TP_fast_assign(
5530e0b854cSChuck Lever 		__entry->cqe = cqe;
554b4a7f91cSChuck Lever 	),
555b4a7f91cSChuck Lever 
5560e0b854cSChuck Lever 	TP_printk("cqe=%p",
5570e0b854cSChuck Lever 		__entry->cqe
558b4a7f91cSChuck Lever 	)
559b4a7f91cSChuck Lever );
560b4a7f91cSChuck Lever 
5617c8d9e7cSChuck Lever TRACE_EVENT(xprtrdma_post_recvs,
5627c8d9e7cSChuck Lever 	TP_PROTO(
5637c8d9e7cSChuck Lever 		const struct rpcrdma_xprt *r_xprt,
5647c8d9e7cSChuck Lever 		unsigned int count,
5657c8d9e7cSChuck Lever 		int status
5667c8d9e7cSChuck Lever 	),
5677c8d9e7cSChuck Lever 
5687c8d9e7cSChuck Lever 	TP_ARGS(r_xprt, count, status),
5697c8d9e7cSChuck Lever 
5707c8d9e7cSChuck Lever 	TP_STRUCT__entry(
5717c8d9e7cSChuck Lever 		__field(const void *, r_xprt)
5727c8d9e7cSChuck Lever 		__field(unsigned int, count)
5737c8d9e7cSChuck Lever 		__field(int, status)
5747c8d9e7cSChuck Lever 		__field(int, posted)
5757c8d9e7cSChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
5767c8d9e7cSChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
5777c8d9e7cSChuck Lever 	),
5787c8d9e7cSChuck Lever 
5797c8d9e7cSChuck Lever 	TP_fast_assign(
5807c8d9e7cSChuck Lever 		__entry->r_xprt = r_xprt;
5817c8d9e7cSChuck Lever 		__entry->count = count;
5827c8d9e7cSChuck Lever 		__entry->status = status;
5836ceea368SChuck Lever 		__entry->posted = r_xprt->rx_ep.rep_receive_count;
5847c8d9e7cSChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
5857c8d9e7cSChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
5867c8d9e7cSChuck Lever 	),
5877c8d9e7cSChuck Lever 
5887c8d9e7cSChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: %u new recvs, %d active (rc %d)",
5897c8d9e7cSChuck Lever 		__get_str(addr), __get_str(port), __entry->r_xprt,
5907c8d9e7cSChuck Lever 		__entry->count, __entry->posted, __entry->status
591ab03eff5SChuck Lever 	)
592ab03eff5SChuck Lever );
593ab03eff5SChuck Lever 
594ab03eff5SChuck Lever /**
595ab03eff5SChuck Lever  ** Completion events
596ab03eff5SChuck Lever  **/
597ab03eff5SChuck Lever 
598ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_wc_send,
599ab03eff5SChuck Lever 	TP_PROTO(
600ab03eff5SChuck Lever 		const struct rpcrdma_sendctx *sc,
601ab03eff5SChuck Lever 		const struct ib_wc *wc
602ab03eff5SChuck Lever 	),
603ab03eff5SChuck Lever 
604ab03eff5SChuck Lever 	TP_ARGS(sc, wc),
605ab03eff5SChuck Lever 
606ab03eff5SChuck Lever 	TP_STRUCT__entry(
607ab03eff5SChuck Lever 		__field(const void *, req)
608ab03eff5SChuck Lever 		__field(unsigned int, unmap_count)
609ab03eff5SChuck Lever 		__field(unsigned int, status)
610ab03eff5SChuck Lever 		__field(unsigned int, vendor_err)
611ab03eff5SChuck Lever 	),
612ab03eff5SChuck Lever 
613ab03eff5SChuck Lever 	TP_fast_assign(
614ab03eff5SChuck Lever 		__entry->req = sc->sc_req;
615ab03eff5SChuck Lever 		__entry->unmap_count = sc->sc_unmap_count;
616ab03eff5SChuck Lever 		__entry->status = wc->status;
617ab03eff5SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
618ab03eff5SChuck Lever 	),
619ab03eff5SChuck Lever 
620ab03eff5SChuck Lever 	TP_printk("req=%p, unmapped %u pages: %s (%u/0x%x)",
621ab03eff5SChuck Lever 		__entry->req, __entry->unmap_count,
622ab03eff5SChuck Lever 		rdma_show_wc_status(__entry->status),
623ab03eff5SChuck Lever 		__entry->status, __entry->vendor_err
624ab03eff5SChuck Lever 	)
625ab03eff5SChuck Lever );
626ab03eff5SChuck Lever 
627b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_wc_receive,
628b4a7f91cSChuck Lever 	TP_PROTO(
629b4a7f91cSChuck Lever 		const struct ib_wc *wc
630b4a7f91cSChuck Lever 	),
631b4a7f91cSChuck Lever 
6320e0b854cSChuck Lever 	TP_ARGS(wc),
633b4a7f91cSChuck Lever 
634b4a7f91cSChuck Lever 	TP_STRUCT__entry(
6350e0b854cSChuck Lever 		__field(const void *, cqe)
6360e0b854cSChuck Lever 		__field(u32, byte_len)
637b4a7f91cSChuck Lever 		__field(unsigned int, status)
6380e0b854cSChuck Lever 		__field(u32, vendor_err)
639b4a7f91cSChuck Lever 	),
640b4a7f91cSChuck Lever 
641b4a7f91cSChuck Lever 	TP_fast_assign(
6420e0b854cSChuck Lever 		__entry->cqe = wc->wr_cqe;
643b4a7f91cSChuck Lever 		__entry->status = wc->status;
6440e0b854cSChuck Lever 		if (wc->status) {
6450e0b854cSChuck Lever 			__entry->byte_len = 0;
6460e0b854cSChuck Lever 			__entry->vendor_err = wc->vendor_err;
6470e0b854cSChuck Lever 		} else {
6480e0b854cSChuck Lever 			__entry->byte_len = wc->byte_len;
6490e0b854cSChuck Lever 			__entry->vendor_err = 0;
6500e0b854cSChuck Lever 		}
651b4a7f91cSChuck Lever 	),
652b4a7f91cSChuck Lever 
6530e0b854cSChuck Lever 	TP_printk("cqe=%p %u bytes: %s (%u/0x%x)",
6540e0b854cSChuck Lever 		__entry->cqe, __entry->byte_len,
655b4a7f91cSChuck Lever 		rdma_show_wc_status(__entry->status),
656b4a7f91cSChuck Lever 		__entry->status, __entry->vendor_err
657b4a7f91cSChuck Lever 	)
658b4a7f91cSChuck Lever );
659b4a7f91cSChuck Lever 
66058f10ad4SChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_fastreg);
6612937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li);
6622937fedeSChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_li_wake);
6632937fedeSChuck Lever 
664d379eaa8SChuck Lever DEFINE_MR_EVENT(localinv);
665d379eaa8SChuck Lever DEFINE_MR_EVENT(map);
666d379eaa8SChuck Lever DEFINE_MR_EVENT(unmap);
667d379eaa8SChuck Lever DEFINE_MR_EVENT(remoteinv);
668d379eaa8SChuck Lever DEFINE_MR_EVENT(recycle);
66958f10ad4SChuck Lever 
670b4a7f91cSChuck Lever /**
671b4a7f91cSChuck Lever  ** Reply events
672b4a7f91cSChuck Lever  **/
673b4a7f91cSChuck Lever 
674b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_reply,
675b4a7f91cSChuck Lever 	TP_PROTO(
676b4a7f91cSChuck Lever 		const struct rpc_task *task,
677b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
678b4a7f91cSChuck Lever 		const struct rpcrdma_req *req,
679b4a7f91cSChuck Lever 		unsigned int credits
680b4a7f91cSChuck Lever 	),
681b4a7f91cSChuck Lever 
682b4a7f91cSChuck Lever 	TP_ARGS(task, rep, req, credits),
683b4a7f91cSChuck Lever 
684b4a7f91cSChuck Lever 	TP_STRUCT__entry(
685b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
686b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
687b4a7f91cSChuck Lever 		__field(const void *, rep)
688b4a7f91cSChuck Lever 		__field(const void *, req)
689b4a7f91cSChuck Lever 		__field(u32, xid)
690b4a7f91cSChuck Lever 		__field(unsigned int, credits)
691b4a7f91cSChuck Lever 	),
692b4a7f91cSChuck Lever 
693b4a7f91cSChuck Lever 	TP_fast_assign(
694b4a7f91cSChuck Lever 		__entry->task_id = task->tk_pid;
695b4a7f91cSChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
696b4a7f91cSChuck Lever 		__entry->rep = rep;
697b4a7f91cSChuck Lever 		__entry->req = req;
698b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
699b4a7f91cSChuck Lever 		__entry->credits = credits;
700b4a7f91cSChuck Lever 	),
701b4a7f91cSChuck Lever 
702b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x, %u credits, rep=%p -> req=%p",
703b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
704b4a7f91cSChuck Lever 		__entry->credits, __entry->rep, __entry->req
705b4a7f91cSChuck Lever 	)
706b4a7f91cSChuck Lever );
707b4a7f91cSChuck Lever 
708b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_defer_cmp,
709b4a7f91cSChuck Lever 	TP_PROTO(
710b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep
711b4a7f91cSChuck Lever 	),
712b4a7f91cSChuck Lever 
713b4a7f91cSChuck Lever 	TP_ARGS(rep),
714b4a7f91cSChuck Lever 
715b4a7f91cSChuck Lever 	TP_STRUCT__entry(
716b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
717b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
718b4a7f91cSChuck Lever 		__field(const void *, rep)
719b4a7f91cSChuck Lever 		__field(u32, xid)
720b4a7f91cSChuck Lever 	),
721b4a7f91cSChuck Lever 
722b4a7f91cSChuck Lever 	TP_fast_assign(
723b4a7f91cSChuck Lever 		__entry->task_id = rep->rr_rqst->rq_task->tk_pid;
724b4a7f91cSChuck Lever 		__entry->client_id = rep->rr_rqst->rq_task->tk_client->cl_clid;
725b4a7f91cSChuck Lever 		__entry->rep = rep;
726b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
727b4a7f91cSChuck Lever 	),
728b4a7f91cSChuck Lever 
729b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x rep=%p",
730b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
731b4a7f91cSChuck Lever 		__entry->rep
732b4a7f91cSChuck Lever 	)
733b4a7f91cSChuck Lever );
734b4a7f91cSChuck Lever 
735b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_vers);
736b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_rqst);
737b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_short);
738b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_hdr);
739b4a7f91cSChuck Lever 
740e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup,
741e11b7c96SChuck Lever 	TP_PROTO(
742e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
743e11b7c96SChuck Lever 		int len,
744e11b7c96SChuck Lever 		int hdrlen
745e11b7c96SChuck Lever 	),
746e11b7c96SChuck Lever 
747e11b7c96SChuck Lever 	TP_ARGS(rqst, len, hdrlen),
748e11b7c96SChuck Lever 
749e11b7c96SChuck Lever 	TP_STRUCT__entry(
750e11b7c96SChuck Lever 		__field(unsigned int, task_id)
751e11b7c96SChuck Lever 		__field(unsigned int, client_id)
752e11b7c96SChuck Lever 		__field(const void *, base)
753e11b7c96SChuck Lever 		__field(int, len)
754e11b7c96SChuck Lever 		__field(int, hdrlen)
755e11b7c96SChuck Lever 	),
756e11b7c96SChuck Lever 
757e11b7c96SChuck Lever 	TP_fast_assign(
758e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
759e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
760e11b7c96SChuck Lever 		__entry->base = rqst->rq_rcv_buf.head[0].iov_base;
761e11b7c96SChuck Lever 		__entry->len = len;
762e11b7c96SChuck Lever 		__entry->hdrlen = hdrlen;
763e11b7c96SChuck Lever 	),
764e11b7c96SChuck Lever 
765e11b7c96SChuck Lever 	TP_printk("task:%u@%u base=%p len=%d hdrlen=%d",
766e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
767e11b7c96SChuck Lever 		__entry->base, __entry->len, __entry->hdrlen
768e11b7c96SChuck Lever 	)
769e11b7c96SChuck Lever );
770e11b7c96SChuck Lever 
771e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup_pg,
772e11b7c96SChuck Lever 	TP_PROTO(
773e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
774e11b7c96SChuck Lever 		int pageno,
775e11b7c96SChuck Lever 		const void *pos,
776e11b7c96SChuck Lever 		int len,
777e11b7c96SChuck Lever 		int curlen
778e11b7c96SChuck Lever 	),
779e11b7c96SChuck Lever 
780e11b7c96SChuck Lever 	TP_ARGS(rqst, pageno, pos, len, curlen),
781e11b7c96SChuck Lever 
782e11b7c96SChuck Lever 	TP_STRUCT__entry(
783e11b7c96SChuck Lever 		__field(unsigned int, task_id)
784e11b7c96SChuck Lever 		__field(unsigned int, client_id)
785e11b7c96SChuck Lever 		__field(const void *, pos)
786e11b7c96SChuck Lever 		__field(int, pageno)
787e11b7c96SChuck Lever 		__field(int, len)
788e11b7c96SChuck Lever 		__field(int, curlen)
789e11b7c96SChuck Lever 	),
790e11b7c96SChuck Lever 
791e11b7c96SChuck Lever 	TP_fast_assign(
792e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
793e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
794e11b7c96SChuck Lever 		__entry->pos = pos;
795e11b7c96SChuck Lever 		__entry->pageno = pageno;
796e11b7c96SChuck Lever 		__entry->len = len;
797e11b7c96SChuck Lever 		__entry->curlen = curlen;
798e11b7c96SChuck Lever 	),
799e11b7c96SChuck Lever 
800e11b7c96SChuck Lever 	TP_printk("task:%u@%u pageno=%d pos=%p len=%d curlen=%d",
801e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
802e11b7c96SChuck Lever 		__entry->pageno, __entry->pos, __entry->len, __entry->curlen
803e11b7c96SChuck Lever 	)
804e11b7c96SChuck Lever );
805e11b7c96SChuck Lever 
806e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_decode_seg,
807e11b7c96SChuck Lever 	TP_PROTO(
808e11b7c96SChuck Lever 		u32 handle,
809e11b7c96SChuck Lever 		u32 length,
810e11b7c96SChuck Lever 		u64 offset
811e11b7c96SChuck Lever 	),
812e11b7c96SChuck Lever 
813e11b7c96SChuck Lever 	TP_ARGS(handle, length, offset),
814e11b7c96SChuck Lever 
815e11b7c96SChuck Lever 	TP_STRUCT__entry(
816e11b7c96SChuck Lever 		__field(u32, handle)
817e11b7c96SChuck Lever 		__field(u32, length)
818e11b7c96SChuck Lever 		__field(u64, offset)
819e11b7c96SChuck Lever 	),
820e11b7c96SChuck Lever 
821e11b7c96SChuck Lever 	TP_fast_assign(
822e11b7c96SChuck Lever 		__entry->handle = handle;
823e11b7c96SChuck Lever 		__entry->length = length;
824e11b7c96SChuck Lever 		__entry->offset = offset;
825e11b7c96SChuck Lever 	),
826e11b7c96SChuck Lever 
827e11b7c96SChuck Lever 	TP_printk("%u@0x%016llx:0x%08x",
828e11b7c96SChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
829e11b7c96SChuck Lever 		__entry->handle
830e11b7c96SChuck Lever 	)
831e11b7c96SChuck Lever );
832e11b7c96SChuck Lever 
833fc1eb807SChuck Lever /**
834ae724676SChuck Lever  ** Allocation/release of rpcrdma_reqs and rpcrdma_reps
835ae724676SChuck Lever  **/
836ae724676SChuck Lever 
837ae724676SChuck Lever TRACE_EVENT(xprtrdma_allocate,
838ae724676SChuck Lever 	TP_PROTO(
839ae724676SChuck Lever 		const struct rpc_task *task,
840ae724676SChuck Lever 		const struct rpcrdma_req *req
841ae724676SChuck Lever 	),
842ae724676SChuck Lever 
843ae724676SChuck Lever 	TP_ARGS(task, req),
844ae724676SChuck Lever 
845ae724676SChuck Lever 	TP_STRUCT__entry(
846ae724676SChuck Lever 		__field(unsigned int, task_id)
847ae724676SChuck Lever 		__field(unsigned int, client_id)
848ae724676SChuck Lever 		__field(const void *, req)
849ae724676SChuck Lever 		__field(size_t, callsize)
850ae724676SChuck Lever 		__field(size_t, rcvsize)
851ae724676SChuck Lever 	),
852ae724676SChuck Lever 
853ae724676SChuck Lever 	TP_fast_assign(
854ae724676SChuck Lever 		__entry->task_id = task->tk_pid;
855ae724676SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
856ae724676SChuck Lever 		__entry->req = req;
857ae724676SChuck Lever 		__entry->callsize = task->tk_rqstp->rq_callsize;
858ae724676SChuck Lever 		__entry->rcvsize = task->tk_rqstp->rq_rcvsize;
859ae724676SChuck Lever 	),
860ae724676SChuck Lever 
8617c8d9e7cSChuck Lever 	TP_printk("task:%u@%u req=%p (%zu, %zu)",
862ae724676SChuck Lever 		__entry->task_id, __entry->client_id,
8637c8d9e7cSChuck Lever 		__entry->req, __entry->callsize, __entry->rcvsize
864ae724676SChuck Lever 	)
865ae724676SChuck Lever );
866ae724676SChuck Lever 
867ae724676SChuck Lever TRACE_EVENT(xprtrdma_rpc_done,
868ae724676SChuck Lever 	TP_PROTO(
869ae724676SChuck Lever 		const struct rpc_task *task,
870ae724676SChuck Lever 		const struct rpcrdma_req *req
871ae724676SChuck Lever 	),
872ae724676SChuck Lever 
873ae724676SChuck Lever 	TP_ARGS(task, req),
874ae724676SChuck Lever 
875ae724676SChuck Lever 	TP_STRUCT__entry(
876ae724676SChuck Lever 		__field(unsigned int, task_id)
877ae724676SChuck Lever 		__field(unsigned int, client_id)
878ae724676SChuck Lever 		__field(const void *, req)
879ae724676SChuck Lever 		__field(const void *, rep)
880ae724676SChuck Lever 	),
881ae724676SChuck Lever 
882ae724676SChuck Lever 	TP_fast_assign(
883ae724676SChuck Lever 		__entry->task_id = task->tk_pid;
884ae724676SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
885ae724676SChuck Lever 		__entry->req = req;
886ae724676SChuck Lever 		__entry->rep = req->rl_reply;
887ae724676SChuck Lever 	),
888ae724676SChuck Lever 
889ae724676SChuck Lever 	TP_printk("task:%u@%u req=%p rep=%p",
890ae724676SChuck Lever 		__entry->task_id, __entry->client_id,
891ae724676SChuck Lever 		__entry->req, __entry->rep
892ae724676SChuck Lever 	)
893ae724676SChuck Lever );
894ae724676SChuck Lever 
895ae724676SChuck Lever /**
896fc1eb807SChuck Lever  ** Callback events
897fc1eb807SChuck Lever  **/
898fc1eb807SChuck Lever 
899fc1eb807SChuck Lever TRACE_EVENT(xprtrdma_cb_setup,
900fc1eb807SChuck Lever 	TP_PROTO(
901fc1eb807SChuck Lever 		const struct rpcrdma_xprt *r_xprt,
902fc1eb807SChuck Lever 		unsigned int reqs
903fc1eb807SChuck Lever 	),
904fc1eb807SChuck Lever 
905fc1eb807SChuck Lever 	TP_ARGS(r_xprt, reqs),
906fc1eb807SChuck Lever 
907fc1eb807SChuck Lever 	TP_STRUCT__entry(
908fc1eb807SChuck Lever 		__field(const void *, r_xprt)
909fc1eb807SChuck Lever 		__field(unsigned int, reqs)
910fc1eb807SChuck Lever 		__string(addr, rpcrdma_addrstr(r_xprt))
911fc1eb807SChuck Lever 		__string(port, rpcrdma_portstr(r_xprt))
912fc1eb807SChuck Lever 	),
913fc1eb807SChuck Lever 
914fc1eb807SChuck Lever 	TP_fast_assign(
915fc1eb807SChuck Lever 		__entry->r_xprt = r_xprt;
916fc1eb807SChuck Lever 		__entry->reqs = reqs;
917fc1eb807SChuck Lever 		__assign_str(addr, rpcrdma_addrstr(r_xprt));
918fc1eb807SChuck Lever 		__assign_str(port, rpcrdma_portstr(r_xprt));
919fc1eb807SChuck Lever 	),
920fc1eb807SChuck Lever 
921fc1eb807SChuck Lever 	TP_printk("peer=[%s]:%s r_xprt=%p: %u reqs",
922fc1eb807SChuck Lever 		__get_str(addr), __get_str(port),
923fc1eb807SChuck Lever 		__entry->r_xprt, __entry->reqs
924fc1eb807SChuck Lever 	)
925fc1eb807SChuck Lever );
926fc1eb807SChuck Lever 
927fc1eb807SChuck Lever DEFINE_CB_EVENT(xprtrdma_cb_call);
928fc1eb807SChuck Lever DEFINE_CB_EVENT(xprtrdma_cb_reply);
929fc1eb807SChuck Lever 
93098895edbSChuck Lever /**
93198895edbSChuck Lever  ** Server-side RPC/RDMA events
93298895edbSChuck Lever  **/
93398895edbSChuck Lever 
93498895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_xprt_event,
93598895edbSChuck Lever 	TP_PROTO(
93698895edbSChuck Lever 		const struct svc_xprt *xprt
93798895edbSChuck Lever 	),
93898895edbSChuck Lever 
93998895edbSChuck Lever 	TP_ARGS(xprt),
94098895edbSChuck Lever 
94198895edbSChuck Lever 	TP_STRUCT__entry(
94298895edbSChuck Lever 		__field(const void *, xprt)
94398895edbSChuck Lever 		__string(addr, xprt->xpt_remotebuf)
94498895edbSChuck Lever 	),
94598895edbSChuck Lever 
94698895edbSChuck Lever 	TP_fast_assign(
94798895edbSChuck Lever 		__entry->xprt = xprt;
94898895edbSChuck Lever 		__assign_str(addr, xprt->xpt_remotebuf);
94998895edbSChuck Lever 	),
95098895edbSChuck Lever 
95198895edbSChuck Lever 	TP_printk("xprt=%p addr=%s",
95298895edbSChuck Lever 		__entry->xprt, __get_str(addr)
95398895edbSChuck Lever 	)
95498895edbSChuck Lever );
95598895edbSChuck Lever 
95698895edbSChuck Lever #define DEFINE_XPRT_EVENT(name)						\
95798895edbSChuck Lever 		DEFINE_EVENT(svcrdma_xprt_event, svcrdma_xprt_##name,	\
95898895edbSChuck Lever 				TP_PROTO(				\
95998895edbSChuck Lever 					const struct svc_xprt *xprt	\
96098895edbSChuck Lever 				),					\
96198895edbSChuck Lever 				TP_ARGS(xprt))
96298895edbSChuck Lever 
96398895edbSChuck Lever DEFINE_XPRT_EVENT(accept);
96498895edbSChuck Lever DEFINE_XPRT_EVENT(fail);
96598895edbSChuck Lever DEFINE_XPRT_EVENT(free);
96698895edbSChuck Lever 
96798895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_MSG);
96898895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_NOMSG);
96998895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_MSGP);
97098895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_DONE);
97198895edbSChuck Lever TRACE_DEFINE_ENUM(RDMA_ERROR);
97298895edbSChuck Lever 
97398895edbSChuck Lever #define show_rpcrdma_proc(x)						\
97498895edbSChuck Lever 		__print_symbolic(x,					\
97598895edbSChuck Lever 				{ RDMA_MSG, "RDMA_MSG" },		\
97698895edbSChuck Lever 				{ RDMA_NOMSG, "RDMA_NOMSG" },		\
97798895edbSChuck Lever 				{ RDMA_MSGP, "RDMA_MSGP" },		\
97898895edbSChuck Lever 				{ RDMA_DONE, "RDMA_DONE" },		\
97998895edbSChuck Lever 				{ RDMA_ERROR, "RDMA_ERROR" })
98098895edbSChuck Lever 
98198895edbSChuck Lever TRACE_EVENT(svcrdma_decode_rqst,
98298895edbSChuck Lever 	TP_PROTO(
98398895edbSChuck Lever 		__be32 *p,
98498895edbSChuck Lever 		unsigned int hdrlen
98598895edbSChuck Lever 	),
98698895edbSChuck Lever 
98798895edbSChuck Lever 	TP_ARGS(p, hdrlen),
98898895edbSChuck Lever 
98998895edbSChuck Lever 	TP_STRUCT__entry(
99098895edbSChuck Lever 		__field(u32, xid)
99198895edbSChuck Lever 		__field(u32, vers)
99298895edbSChuck Lever 		__field(u32, proc)
99398895edbSChuck Lever 		__field(u32, credits)
99498895edbSChuck Lever 		__field(unsigned int, hdrlen)
99598895edbSChuck Lever 	),
99698895edbSChuck Lever 
99798895edbSChuck Lever 	TP_fast_assign(
99898895edbSChuck Lever 		__entry->xid = be32_to_cpup(p++);
99998895edbSChuck Lever 		__entry->vers = be32_to_cpup(p++);
100098895edbSChuck Lever 		__entry->credits = be32_to_cpup(p++);
100198895edbSChuck Lever 		__entry->proc = be32_to_cpup(p);
100298895edbSChuck Lever 		__entry->hdrlen = hdrlen;
100398895edbSChuck Lever 	),
100498895edbSChuck Lever 
100598895edbSChuck Lever 	TP_printk("xid=0x%08x vers=%u credits=%u proc=%s hdrlen=%u",
100698895edbSChuck Lever 		__entry->xid, __entry->vers, __entry->credits,
100798895edbSChuck Lever 		show_rpcrdma_proc(__entry->proc), __entry->hdrlen)
100898895edbSChuck Lever );
100998895edbSChuck Lever 
101098895edbSChuck Lever TRACE_EVENT(svcrdma_decode_short,
101198895edbSChuck Lever 	TP_PROTO(
101298895edbSChuck Lever 		unsigned int hdrlen
101398895edbSChuck Lever 	),
101498895edbSChuck Lever 
101598895edbSChuck Lever 	TP_ARGS(hdrlen),
101698895edbSChuck Lever 
101798895edbSChuck Lever 	TP_STRUCT__entry(
101898895edbSChuck Lever 		__field(unsigned int, hdrlen)
101998895edbSChuck Lever 	),
102098895edbSChuck Lever 
102198895edbSChuck Lever 	TP_fast_assign(
102298895edbSChuck Lever 		__entry->hdrlen = hdrlen;
102398895edbSChuck Lever 	),
102498895edbSChuck Lever 
102598895edbSChuck Lever 	TP_printk("hdrlen=%u", __entry->hdrlen)
102698895edbSChuck Lever );
102798895edbSChuck Lever 
102898895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_badreq_event,
102998895edbSChuck Lever 	TP_PROTO(
103098895edbSChuck Lever 		__be32 *p
103198895edbSChuck Lever 	),
103298895edbSChuck Lever 
103398895edbSChuck Lever 	TP_ARGS(p),
103498895edbSChuck Lever 
103598895edbSChuck Lever 	TP_STRUCT__entry(
103698895edbSChuck Lever 		__field(u32, xid)
103798895edbSChuck Lever 		__field(u32, vers)
103898895edbSChuck Lever 		__field(u32, proc)
103998895edbSChuck Lever 		__field(u32, credits)
104098895edbSChuck Lever 	),
104198895edbSChuck Lever 
104298895edbSChuck Lever 	TP_fast_assign(
104398895edbSChuck Lever 		__entry->xid = be32_to_cpup(p++);
104498895edbSChuck Lever 		__entry->vers = be32_to_cpup(p++);
104598895edbSChuck Lever 		__entry->credits = be32_to_cpup(p++);
104698895edbSChuck Lever 		__entry->proc = be32_to_cpup(p);
104798895edbSChuck Lever 	),
104898895edbSChuck Lever 
104998895edbSChuck Lever 	TP_printk("xid=0x%08x vers=%u credits=%u proc=%u",
105098895edbSChuck Lever 		__entry->xid, __entry->vers, __entry->credits, __entry->proc)
105198895edbSChuck Lever );
105298895edbSChuck Lever 
105398895edbSChuck Lever #define DEFINE_BADREQ_EVENT(name)					\
105498895edbSChuck Lever 		DEFINE_EVENT(svcrdma_badreq_event, svcrdma_decode_##name,\
105598895edbSChuck Lever 				TP_PROTO(				\
105698895edbSChuck Lever 					__be32 *p			\
105798895edbSChuck Lever 				),					\
105898895edbSChuck Lever 				TP_ARGS(p))
105998895edbSChuck Lever 
106098895edbSChuck Lever DEFINE_BADREQ_EVENT(badvers);
106198895edbSChuck Lever DEFINE_BADREQ_EVENT(drop);
106298895edbSChuck Lever DEFINE_BADREQ_EVENT(badproc);
106398895edbSChuck Lever DEFINE_BADREQ_EVENT(parse);
106498895edbSChuck Lever 
106598895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_segment_event,
106698895edbSChuck Lever 	TP_PROTO(
106798895edbSChuck Lever 		u32 handle,
106898895edbSChuck Lever 		u32 length,
106998895edbSChuck Lever 		u64 offset
107098895edbSChuck Lever 	),
107198895edbSChuck Lever 
107298895edbSChuck Lever 	TP_ARGS(handle, length, offset),
107398895edbSChuck Lever 
107498895edbSChuck Lever 	TP_STRUCT__entry(
107598895edbSChuck Lever 		__field(u32, handle)
107698895edbSChuck Lever 		__field(u32, length)
107798895edbSChuck Lever 		__field(u64, offset)
107898895edbSChuck Lever 	),
107998895edbSChuck Lever 
108098895edbSChuck Lever 	TP_fast_assign(
108198895edbSChuck Lever 		__entry->handle = handle;
108298895edbSChuck Lever 		__entry->length = length;
108398895edbSChuck Lever 		__entry->offset = offset;
108498895edbSChuck Lever 	),
108598895edbSChuck Lever 
108698895edbSChuck Lever 	TP_printk("%u@0x%016llx:0x%08x",
108798895edbSChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
108898895edbSChuck Lever 		__entry->handle
108998895edbSChuck Lever 	)
109098895edbSChuck Lever );
109198895edbSChuck Lever 
109298895edbSChuck Lever #define DEFINE_SEGMENT_EVENT(name)					\
109398895edbSChuck Lever 		DEFINE_EVENT(svcrdma_segment_event, svcrdma_encode_##name,\
109498895edbSChuck Lever 				TP_PROTO(				\
109598895edbSChuck Lever 					u32 handle,			\
109698895edbSChuck Lever 					u32 length,			\
109798895edbSChuck Lever 					u64 offset			\
109898895edbSChuck Lever 				),					\
109998895edbSChuck Lever 				TP_ARGS(handle, length, offset))
110098895edbSChuck Lever 
110198895edbSChuck Lever DEFINE_SEGMENT_EVENT(rseg);
110298895edbSChuck Lever DEFINE_SEGMENT_EVENT(wseg);
110398895edbSChuck Lever 
110498895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_chunk_event,
110598895edbSChuck Lever 	TP_PROTO(
110698895edbSChuck Lever 		u32 length
110798895edbSChuck Lever 	),
110898895edbSChuck Lever 
110998895edbSChuck Lever 	TP_ARGS(length),
111098895edbSChuck Lever 
111198895edbSChuck Lever 	TP_STRUCT__entry(
111298895edbSChuck Lever 		__field(u32, length)
111398895edbSChuck Lever 	),
111498895edbSChuck Lever 
111598895edbSChuck Lever 	TP_fast_assign(
111698895edbSChuck Lever 		__entry->length = length;
111798895edbSChuck Lever 	),
111898895edbSChuck Lever 
111998895edbSChuck Lever 	TP_printk("length=%u",
112098895edbSChuck Lever 		__entry->length
112198895edbSChuck Lever 	)
112298895edbSChuck Lever );
112398895edbSChuck Lever 
112498895edbSChuck Lever #define DEFINE_CHUNK_EVENT(name)					\
112598895edbSChuck Lever 		DEFINE_EVENT(svcrdma_chunk_event, svcrdma_encode_##name,\
112698895edbSChuck Lever 				TP_PROTO(				\
112798895edbSChuck Lever 					u32 length			\
112898895edbSChuck Lever 				),					\
112998895edbSChuck Lever 				TP_ARGS(length))
113098895edbSChuck Lever 
113198895edbSChuck Lever DEFINE_CHUNK_EVENT(pzr);
113298895edbSChuck Lever DEFINE_CHUNK_EVENT(write);
113398895edbSChuck Lever DEFINE_CHUNK_EVENT(reply);
113498895edbSChuck Lever 
113598895edbSChuck Lever TRACE_EVENT(svcrdma_encode_read,
113698895edbSChuck Lever 	TP_PROTO(
113798895edbSChuck Lever 		u32 length,
113898895edbSChuck Lever 		u32 position
113998895edbSChuck Lever 	),
114098895edbSChuck Lever 
114198895edbSChuck Lever 	TP_ARGS(length, position),
114298895edbSChuck Lever 
114398895edbSChuck Lever 	TP_STRUCT__entry(
114498895edbSChuck Lever 		__field(u32, length)
114598895edbSChuck Lever 		__field(u32, position)
114698895edbSChuck Lever 	),
114798895edbSChuck Lever 
114898895edbSChuck Lever 	TP_fast_assign(
114998895edbSChuck Lever 		__entry->length = length;
115098895edbSChuck Lever 		__entry->position = position;
115198895edbSChuck Lever 	),
115298895edbSChuck Lever 
115398895edbSChuck Lever 	TP_printk("length=%u position=%u",
115498895edbSChuck Lever 		__entry->length, __entry->position
115598895edbSChuck Lever 	)
115698895edbSChuck Lever );
115798895edbSChuck Lever 
115898895edbSChuck Lever DECLARE_EVENT_CLASS(svcrdma_error_event,
115998895edbSChuck Lever 	TP_PROTO(
116098895edbSChuck Lever 		__be32 xid
116198895edbSChuck Lever 	),
116298895edbSChuck Lever 
116398895edbSChuck Lever 	TP_ARGS(xid),
116498895edbSChuck Lever 
116598895edbSChuck Lever 	TP_STRUCT__entry(
116698895edbSChuck Lever 		__field(u32, xid)
116798895edbSChuck Lever 	),
116898895edbSChuck Lever 
116998895edbSChuck Lever 	TP_fast_assign(
117098895edbSChuck Lever 		__entry->xid = be32_to_cpu(xid);
117198895edbSChuck Lever 	),
117298895edbSChuck Lever 
117398895edbSChuck Lever 	TP_printk("xid=0x%08x",
117498895edbSChuck Lever 		__entry->xid
117598895edbSChuck Lever 	)
117698895edbSChuck Lever );
117798895edbSChuck Lever 
117898895edbSChuck Lever #define DEFINE_ERROR_EVENT(name)					\
117998895edbSChuck Lever 		DEFINE_EVENT(svcrdma_error_event, svcrdma_err_##name,	\
118098895edbSChuck Lever 				TP_PROTO(				\
118198895edbSChuck Lever 					__be32 xid			\
118298895edbSChuck Lever 				),					\
118398895edbSChuck Lever 				TP_ARGS(xid))
118498895edbSChuck Lever 
118598895edbSChuck Lever DEFINE_ERROR_EVENT(vers);
118698895edbSChuck Lever DEFINE_ERROR_EVENT(chunk);
118798895edbSChuck Lever 
1188bd2abef3SChuck Lever /**
1189bd2abef3SChuck Lever  ** Server-side RDMA API events
1190bd2abef3SChuck Lever  **/
1191bd2abef3SChuck Lever 
1192bd2abef3SChuck Lever TRACE_EVENT(svcrdma_dma_map_page,
1193bd2abef3SChuck Lever 	TP_PROTO(
1194bd2abef3SChuck Lever 		const struct svcxprt_rdma *rdma,
1195bd2abef3SChuck Lever 		const void *page
1196bd2abef3SChuck Lever 	),
1197bd2abef3SChuck Lever 
1198bd2abef3SChuck Lever 	TP_ARGS(rdma, page),
1199bd2abef3SChuck Lever 
1200bd2abef3SChuck Lever 	TP_STRUCT__entry(
1201bd2abef3SChuck Lever 		__field(const void *, page);
1202bd2abef3SChuck Lever 		__string(device, rdma->sc_cm_id->device->name)
1203bd2abef3SChuck Lever 		__string(addr, rdma->sc_xprt.xpt_remotebuf)
1204bd2abef3SChuck Lever 	),
1205bd2abef3SChuck Lever 
1206bd2abef3SChuck Lever 	TP_fast_assign(
1207bd2abef3SChuck Lever 		__entry->page = page;
1208bd2abef3SChuck Lever 		__assign_str(device, rdma->sc_cm_id->device->name);
1209bd2abef3SChuck Lever 		__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
1210bd2abef3SChuck Lever 	),
1211bd2abef3SChuck Lever 
1212bd2abef3SChuck Lever 	TP_printk("addr=%s device=%s page=%p",
1213bd2abef3SChuck Lever 		__get_str(addr), __get_str(device), __entry->page
1214bd2abef3SChuck Lever 	)
1215bd2abef3SChuck Lever );
1216bd2abef3SChuck Lever 
1217bd2abef3SChuck Lever TRACE_EVENT(svcrdma_dma_map_rwctx,
1218bd2abef3SChuck Lever 	TP_PROTO(
1219bd2abef3SChuck Lever 		const struct svcxprt_rdma *rdma,
1220bd2abef3SChuck Lever 		int status
1221bd2abef3SChuck Lever 	),
1222bd2abef3SChuck Lever 
1223bd2abef3SChuck Lever 	TP_ARGS(rdma, status),
1224bd2abef3SChuck Lever 
1225bd2abef3SChuck Lever 	TP_STRUCT__entry(
1226bd2abef3SChuck Lever 		__field(int, status)
1227bd2abef3SChuck Lever 		__string(device, rdma->sc_cm_id->device->name)
1228bd2abef3SChuck Lever 		__string(addr, rdma->sc_xprt.xpt_remotebuf)
1229bd2abef3SChuck Lever 	),
1230bd2abef3SChuck Lever 
1231bd2abef3SChuck Lever 	TP_fast_assign(
1232bd2abef3SChuck Lever 		__entry->status = status;
1233bd2abef3SChuck Lever 		__assign_str(device, rdma->sc_cm_id->device->name);
1234bd2abef3SChuck Lever 		__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
1235bd2abef3SChuck Lever 	),
1236bd2abef3SChuck Lever 
1237bd2abef3SChuck Lever 	TP_printk("addr=%s device=%s status=%d",
1238bd2abef3SChuck Lever 		__get_str(addr), __get_str(device), __entry->status
1239bd2abef3SChuck Lever 	)
1240bd2abef3SChuck Lever );
1241bd2abef3SChuck Lever 
1242bd2abef3SChuck Lever TRACE_EVENT(svcrdma_send_failed,
1243bd2abef3SChuck Lever 	TP_PROTO(
1244bd2abef3SChuck Lever 		const struct svc_rqst *rqst,
1245bd2abef3SChuck Lever 		int status
1246bd2abef3SChuck Lever 	),
1247bd2abef3SChuck Lever 
1248bd2abef3SChuck Lever 	TP_ARGS(rqst, status),
1249bd2abef3SChuck Lever 
1250bd2abef3SChuck Lever 	TP_STRUCT__entry(
1251bd2abef3SChuck Lever 		__field(int, status)
1252bd2abef3SChuck Lever 		__field(u32, xid)
1253bd2abef3SChuck Lever 		__field(const void *, xprt)
1254bd2abef3SChuck Lever 		__string(addr, rqst->rq_xprt->xpt_remotebuf)
1255bd2abef3SChuck Lever 	),
1256bd2abef3SChuck Lever 
1257bd2abef3SChuck Lever 	TP_fast_assign(
1258bd2abef3SChuck Lever 		__entry->status = status;
1259bd2abef3SChuck Lever 		__entry->xid = __be32_to_cpu(rqst->rq_xid);
1260bd2abef3SChuck Lever 		__entry->xprt = rqst->rq_xprt;
1261bd2abef3SChuck Lever 		__assign_str(addr, rqst->rq_xprt->xpt_remotebuf);
1262bd2abef3SChuck Lever 	),
1263bd2abef3SChuck Lever 
1264bd2abef3SChuck Lever 	TP_printk("xprt=%p addr=%s xid=0x%08x status=%d",
1265bd2abef3SChuck Lever 		__entry->xprt, __get_str(addr),
1266bd2abef3SChuck Lever 		__entry->xid, __entry->status
1267bd2abef3SChuck Lever 	)
1268bd2abef3SChuck Lever );
1269bd2abef3SChuck Lever 
1270bd2abef3SChuck Lever DECLARE_EVENT_CLASS(svcrdma_sendcomp_event,
1271bd2abef3SChuck Lever 	TP_PROTO(
1272bd2abef3SChuck Lever 		const struct ib_wc *wc
1273bd2abef3SChuck Lever 	),
1274bd2abef3SChuck Lever 
1275bd2abef3SChuck Lever 	TP_ARGS(wc),
1276bd2abef3SChuck Lever 
1277bd2abef3SChuck Lever 	TP_STRUCT__entry(
1278bd2abef3SChuck Lever 		__field(const void *, cqe)
1279bd2abef3SChuck Lever 		__field(unsigned int, status)
1280bd2abef3SChuck Lever 		__field(unsigned int, vendor_err)
1281bd2abef3SChuck Lever 	),
1282bd2abef3SChuck Lever 
1283bd2abef3SChuck Lever 	TP_fast_assign(
1284bd2abef3SChuck Lever 		__entry->cqe = wc->wr_cqe;
1285bd2abef3SChuck Lever 		__entry->status = wc->status;
1286bd2abef3SChuck Lever 		if (wc->status)
1287bd2abef3SChuck Lever 			__entry->vendor_err = wc->vendor_err;
1288bd2abef3SChuck Lever 		else
1289bd2abef3SChuck Lever 			__entry->vendor_err = 0;
1290bd2abef3SChuck Lever 	),
1291bd2abef3SChuck Lever 
1292bd2abef3SChuck Lever 	TP_printk("cqe=%p status=%s (%u/0x%x)",
1293bd2abef3SChuck Lever 		__entry->cqe, rdma_show_wc_status(__entry->status),
1294bd2abef3SChuck Lever 		__entry->status, __entry->vendor_err
1295bd2abef3SChuck Lever 	)
1296bd2abef3SChuck Lever );
1297bd2abef3SChuck Lever 
1298bd2abef3SChuck Lever #define DEFINE_SENDCOMP_EVENT(name)					\
1299bd2abef3SChuck Lever 		DEFINE_EVENT(svcrdma_sendcomp_event, svcrdma_wc_##name,	\
1300bd2abef3SChuck Lever 				TP_PROTO(				\
1301bd2abef3SChuck Lever 					const struct ib_wc *wc		\
1302bd2abef3SChuck Lever 				),					\
1303bd2abef3SChuck Lever 				TP_ARGS(wc))
1304bd2abef3SChuck Lever 
1305bd2abef3SChuck Lever TRACE_EVENT(svcrdma_post_send,
1306bd2abef3SChuck Lever 	TP_PROTO(
1307bd2abef3SChuck Lever 		const struct ib_send_wr *wr,
1308bd2abef3SChuck Lever 		int status
1309bd2abef3SChuck Lever 	),
1310bd2abef3SChuck Lever 
1311bd2abef3SChuck Lever 	TP_ARGS(wr, status),
1312bd2abef3SChuck Lever 
1313bd2abef3SChuck Lever 	TP_STRUCT__entry(
1314bd2abef3SChuck Lever 		__field(const void *, cqe)
1315bd2abef3SChuck Lever 		__field(unsigned int, num_sge)
1316bd2abef3SChuck Lever 		__field(u32, inv_rkey)
1317bd2abef3SChuck Lever 		__field(int, status)
1318bd2abef3SChuck Lever 	),
1319bd2abef3SChuck Lever 
1320bd2abef3SChuck Lever 	TP_fast_assign(
1321bd2abef3SChuck Lever 		__entry->cqe = wr->wr_cqe;
1322bd2abef3SChuck Lever 		__entry->num_sge = wr->num_sge;
1323bd2abef3SChuck Lever 		__entry->inv_rkey = (wr->opcode == IB_WR_SEND_WITH_INV) ?
1324bd2abef3SChuck Lever 					wr->ex.invalidate_rkey : 0;
1325bd2abef3SChuck Lever 		__entry->status = status;
1326bd2abef3SChuck Lever 	),
1327bd2abef3SChuck Lever 
1328bd2abef3SChuck Lever 	TP_printk("cqe=%p num_sge=%u inv_rkey=0x%08x status=%d",
1329bd2abef3SChuck Lever 		__entry->cqe, __entry->num_sge,
1330bd2abef3SChuck Lever 		__entry->inv_rkey, __entry->status
1331bd2abef3SChuck Lever 	)
1332bd2abef3SChuck Lever );
1333bd2abef3SChuck Lever 
1334bd2abef3SChuck Lever DEFINE_SENDCOMP_EVENT(send);
1335bd2abef3SChuck Lever 
1336bd2abef3SChuck Lever TRACE_EVENT(svcrdma_post_recv,
1337bd2abef3SChuck Lever 	TP_PROTO(
1338bd2abef3SChuck Lever 		const struct ib_recv_wr *wr,
1339bd2abef3SChuck Lever 		int status
1340bd2abef3SChuck Lever 	),
1341bd2abef3SChuck Lever 
1342bd2abef3SChuck Lever 	TP_ARGS(wr, status),
1343bd2abef3SChuck Lever 
1344bd2abef3SChuck Lever 	TP_STRUCT__entry(
1345bd2abef3SChuck Lever 		__field(const void *, cqe)
1346bd2abef3SChuck Lever 		__field(int, status)
1347bd2abef3SChuck Lever 	),
1348bd2abef3SChuck Lever 
1349bd2abef3SChuck Lever 	TP_fast_assign(
1350bd2abef3SChuck Lever 		__entry->cqe = wr->wr_cqe;
1351bd2abef3SChuck Lever 		__entry->status = status;
1352bd2abef3SChuck Lever 	),
1353bd2abef3SChuck Lever 
1354bd2abef3SChuck Lever 	TP_printk("cqe=%p status=%d",
1355bd2abef3SChuck Lever 		__entry->cqe, __entry->status
1356bd2abef3SChuck Lever 	)
1357bd2abef3SChuck Lever );
1358bd2abef3SChuck Lever 
1359bd2abef3SChuck Lever TRACE_EVENT(svcrdma_wc_receive,
1360bd2abef3SChuck Lever 	TP_PROTO(
1361bd2abef3SChuck Lever 		const struct ib_wc *wc
1362bd2abef3SChuck Lever 	),
1363bd2abef3SChuck Lever 
1364bd2abef3SChuck Lever 	TP_ARGS(wc),
1365bd2abef3SChuck Lever 
1366bd2abef3SChuck Lever 	TP_STRUCT__entry(
1367bd2abef3SChuck Lever 		__field(const void *, cqe)
1368bd2abef3SChuck Lever 		__field(u32, byte_len)
1369bd2abef3SChuck Lever 		__field(unsigned int, status)
1370bd2abef3SChuck Lever 		__field(u32, vendor_err)
1371bd2abef3SChuck Lever 	),
1372bd2abef3SChuck Lever 
1373bd2abef3SChuck Lever 	TP_fast_assign(
1374bd2abef3SChuck Lever 		__entry->cqe = wc->wr_cqe;
1375bd2abef3SChuck Lever 		__entry->status = wc->status;
1376bd2abef3SChuck Lever 		if (wc->status) {
1377bd2abef3SChuck Lever 			__entry->byte_len = 0;
1378bd2abef3SChuck Lever 			__entry->vendor_err = wc->vendor_err;
1379bd2abef3SChuck Lever 		} else {
1380bd2abef3SChuck Lever 			__entry->byte_len = wc->byte_len;
1381bd2abef3SChuck Lever 			__entry->vendor_err = 0;
1382bd2abef3SChuck Lever 		}
1383bd2abef3SChuck Lever 	),
1384bd2abef3SChuck Lever 
1385bd2abef3SChuck Lever 	TP_printk("cqe=%p byte_len=%u status=%s (%u/0x%x)",
1386bd2abef3SChuck Lever 		__entry->cqe, __entry->byte_len,
1387bd2abef3SChuck Lever 		rdma_show_wc_status(__entry->status),
1388bd2abef3SChuck Lever 		__entry->status, __entry->vendor_err
1389bd2abef3SChuck Lever 	)
1390bd2abef3SChuck Lever );
1391bd2abef3SChuck Lever 
1392bd2abef3SChuck Lever TRACE_EVENT(svcrdma_post_rw,
1393bd2abef3SChuck Lever 	TP_PROTO(
1394bd2abef3SChuck Lever 		const void *cqe,
1395bd2abef3SChuck Lever 		int sqecount,
1396bd2abef3SChuck Lever 		int status
1397bd2abef3SChuck Lever 	),
1398bd2abef3SChuck Lever 
1399bd2abef3SChuck Lever 	TP_ARGS(cqe, sqecount, status),
1400bd2abef3SChuck Lever 
1401bd2abef3SChuck Lever 	TP_STRUCT__entry(
1402bd2abef3SChuck Lever 		__field(const void *, cqe)
1403bd2abef3SChuck Lever 		__field(int, sqecount)
1404bd2abef3SChuck Lever 		__field(int, status)
1405bd2abef3SChuck Lever 	),
1406bd2abef3SChuck Lever 
1407bd2abef3SChuck Lever 	TP_fast_assign(
1408bd2abef3SChuck Lever 		__entry->cqe = cqe;
1409bd2abef3SChuck Lever 		__entry->sqecount = sqecount;
1410bd2abef3SChuck Lever 		__entry->status = status;
1411bd2abef3SChuck Lever 	),
1412bd2abef3SChuck Lever 
1413bd2abef3SChuck Lever 	TP_printk("cqe=%p sqecount=%d status=%d",
1414bd2abef3SChuck Lever 		__entry->cqe, __entry->sqecount, __entry->status
1415bd2abef3SChuck Lever 	)
1416bd2abef3SChuck Lever );
1417bd2abef3SChuck Lever 
1418bd2abef3SChuck Lever DEFINE_SENDCOMP_EVENT(read);
1419bd2abef3SChuck Lever DEFINE_SENDCOMP_EVENT(write);
1420bd2abef3SChuck Lever 
1421bd2abef3SChuck Lever TRACE_EVENT(svcrdma_cm_event,
1422bd2abef3SChuck Lever 	TP_PROTO(
1423bd2abef3SChuck Lever 		const struct rdma_cm_event *event,
1424bd2abef3SChuck Lever 		const struct sockaddr *sap
1425bd2abef3SChuck Lever 	),
1426bd2abef3SChuck Lever 
1427bd2abef3SChuck Lever 	TP_ARGS(event, sap),
1428bd2abef3SChuck Lever 
1429bd2abef3SChuck Lever 	TP_STRUCT__entry(
1430bd2abef3SChuck Lever 		__field(unsigned int, event)
1431bd2abef3SChuck Lever 		__field(int, status)
1432bd2abef3SChuck Lever 		__array(__u8, addr, INET6_ADDRSTRLEN + 10)
1433bd2abef3SChuck Lever 	),
1434bd2abef3SChuck Lever 
1435bd2abef3SChuck Lever 	TP_fast_assign(
1436bd2abef3SChuck Lever 		__entry->event = event->event;
1437bd2abef3SChuck Lever 		__entry->status = event->status;
1438bd2abef3SChuck Lever 		snprintf(__entry->addr, sizeof(__entry->addr) - 1,
1439bd2abef3SChuck Lever 			 "%pISpc", sap);
1440bd2abef3SChuck Lever 	),
1441bd2abef3SChuck Lever 
1442bd2abef3SChuck Lever 	TP_printk("addr=%s event=%s (%u/%d)",
1443bd2abef3SChuck Lever 		__entry->addr,
1444bd2abef3SChuck Lever 		rdma_show_cm_event(__entry->event),
1445bd2abef3SChuck Lever 		__entry->event, __entry->status
1446bd2abef3SChuck Lever 	)
1447bd2abef3SChuck Lever );
1448bd2abef3SChuck Lever 
1449bd2abef3SChuck Lever TRACE_EVENT(svcrdma_qp_error,
1450bd2abef3SChuck Lever 	TP_PROTO(
1451bd2abef3SChuck Lever 		const struct ib_event *event,
1452bd2abef3SChuck Lever 		const struct sockaddr *sap
1453bd2abef3SChuck Lever 	),
1454bd2abef3SChuck Lever 
1455bd2abef3SChuck Lever 	TP_ARGS(event, sap),
1456bd2abef3SChuck Lever 
1457bd2abef3SChuck Lever 	TP_STRUCT__entry(
1458bd2abef3SChuck Lever 		__field(unsigned int, event)
1459bd2abef3SChuck Lever 		__string(device, event->device->name)
1460bd2abef3SChuck Lever 		__array(__u8, addr, INET6_ADDRSTRLEN + 10)
1461bd2abef3SChuck Lever 	),
1462bd2abef3SChuck Lever 
1463bd2abef3SChuck Lever 	TP_fast_assign(
1464bd2abef3SChuck Lever 		__entry->event = event->event;
1465bd2abef3SChuck Lever 		__assign_str(device, event->device->name);
1466bd2abef3SChuck Lever 		snprintf(__entry->addr, sizeof(__entry->addr) - 1,
1467bd2abef3SChuck Lever 			 "%pISpc", sap);
1468bd2abef3SChuck Lever 	),
1469bd2abef3SChuck Lever 
1470bd2abef3SChuck Lever 	TP_printk("addr=%s dev=%s event=%s (%u)",
1471bd2abef3SChuck Lever 		__entry->addr, __get_str(device),
1472bd2abef3SChuck Lever 		rdma_show_ib_event(__entry->event), __entry->event
1473bd2abef3SChuck Lever 	)
1474bd2abef3SChuck Lever );
1475bd2abef3SChuck Lever 
1476bd2abef3SChuck Lever DECLARE_EVENT_CLASS(svcrdma_sendqueue_event,
1477bd2abef3SChuck Lever 	TP_PROTO(
1478bd2abef3SChuck Lever 		const struct svcxprt_rdma *rdma
1479bd2abef3SChuck Lever 	),
1480bd2abef3SChuck Lever 
1481bd2abef3SChuck Lever 	TP_ARGS(rdma),
1482bd2abef3SChuck Lever 
1483bd2abef3SChuck Lever 	TP_STRUCT__entry(
1484bd2abef3SChuck Lever 		__field(int, avail)
1485bd2abef3SChuck Lever 		__field(int, depth)
1486bd2abef3SChuck Lever 		__string(addr, rdma->sc_xprt.xpt_remotebuf)
1487bd2abef3SChuck Lever 	),
1488bd2abef3SChuck Lever 
1489bd2abef3SChuck Lever 	TP_fast_assign(
1490bd2abef3SChuck Lever 		__entry->avail = atomic_read(&rdma->sc_sq_avail);
1491bd2abef3SChuck Lever 		__entry->depth = rdma->sc_sq_depth;
1492bd2abef3SChuck Lever 		__assign_str(addr, rdma->sc_xprt.xpt_remotebuf);
1493bd2abef3SChuck Lever 	),
1494bd2abef3SChuck Lever 
1495bd2abef3SChuck Lever 	TP_printk("addr=%s sc_sq_avail=%d/%d",
1496bd2abef3SChuck Lever 		__get_str(addr), __entry->avail, __entry->depth
1497bd2abef3SChuck Lever 	)
1498bd2abef3SChuck Lever );
1499bd2abef3SChuck Lever 
1500bd2abef3SChuck Lever #define DEFINE_SQ_EVENT(name)						\
1501bd2abef3SChuck Lever 		DEFINE_EVENT(svcrdma_sendqueue_event, svcrdma_sq_##name,\
1502bd2abef3SChuck Lever 				TP_PROTO(				\
1503bd2abef3SChuck Lever 					const struct svcxprt_rdma *rdma \
1504bd2abef3SChuck Lever 				),					\
1505bd2abef3SChuck Lever 				TP_ARGS(rdma))
1506bd2abef3SChuck Lever 
1507bd2abef3SChuck Lever DEFINE_SQ_EVENT(full);
1508bd2abef3SChuck Lever DEFINE_SQ_EVENT(retry);
1509bd2abef3SChuck Lever 
1510e48f083eSChuck Lever #endif /* _TRACE_RPCRDMA_H */
1511e48f083eSChuck Lever 
1512e48f083eSChuck Lever #include <trace/define_trace.h>
1513