xref: /openbmc/linux/include/trace/events/rpcrdma.h (revision e11b7c96)
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 
5458f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_rdch_event,
5558f10ad4SChuck Lever 	TP_PROTO(
5658f10ad4SChuck Lever 		const struct rpc_task *task,
5758f10ad4SChuck Lever 		unsigned int pos,
5858f10ad4SChuck Lever 		struct rpcrdma_mr *mr,
5958f10ad4SChuck Lever 		int nsegs
6058f10ad4SChuck Lever 	),
6158f10ad4SChuck Lever 
6258f10ad4SChuck Lever 	TP_ARGS(task, pos, mr, nsegs),
6358f10ad4SChuck Lever 
6458f10ad4SChuck Lever 	TP_STRUCT__entry(
6558f10ad4SChuck Lever 		__field(unsigned int, task_id)
6658f10ad4SChuck Lever 		__field(unsigned int, client_id)
6758f10ad4SChuck Lever 		__field(const void *, mr)
6858f10ad4SChuck Lever 		__field(unsigned int, pos)
6958f10ad4SChuck Lever 		__field(int, nents)
7058f10ad4SChuck Lever 		__field(u32, handle)
7158f10ad4SChuck Lever 		__field(u32, length)
7258f10ad4SChuck Lever 		__field(u64, offset)
7358f10ad4SChuck Lever 		__field(int, nsegs)
7458f10ad4SChuck Lever 	),
7558f10ad4SChuck Lever 
7658f10ad4SChuck Lever 	TP_fast_assign(
7758f10ad4SChuck Lever 		__entry->task_id = task->tk_pid;
7858f10ad4SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
7958f10ad4SChuck Lever 		__entry->mr = mr;
8058f10ad4SChuck Lever 		__entry->pos = pos;
8158f10ad4SChuck Lever 		__entry->nents = mr->mr_nents;
8258f10ad4SChuck Lever 		__entry->handle = mr->mr_handle;
8358f10ad4SChuck Lever 		__entry->length = mr->mr_length;
8458f10ad4SChuck Lever 		__entry->offset = mr->mr_offset;
8558f10ad4SChuck Lever 		__entry->nsegs = nsegs;
8658f10ad4SChuck Lever 	),
8758f10ad4SChuck Lever 
8858f10ad4SChuck Lever 	TP_printk("task:%u@%u mr=%p pos=%u %u@0x%016llx:0x%08x (%s)",
8958f10ad4SChuck Lever 		__entry->task_id, __entry->client_id, __entry->mr,
9058f10ad4SChuck Lever 		__entry->pos, __entry->length,
9158f10ad4SChuck Lever 		(unsigned long long)__entry->offset, __entry->handle,
9258f10ad4SChuck Lever 		__entry->nents < __entry->nsegs ? "more" : "last"
9358f10ad4SChuck Lever 	)
9458f10ad4SChuck Lever );
9558f10ad4SChuck Lever 
9658f10ad4SChuck Lever #define DEFINE_RDCH_EVENT(name)						\
9758f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_rdch_event, name,			\
9858f10ad4SChuck Lever 				TP_PROTO(				\
9958f10ad4SChuck Lever 					const struct rpc_task *task,	\
10058f10ad4SChuck Lever 					unsigned int pos,		\
10158f10ad4SChuck Lever 					struct rpcrdma_mr *mr,		\
10258f10ad4SChuck Lever 					int nsegs			\
10358f10ad4SChuck Lever 				),					\
10458f10ad4SChuck Lever 				TP_ARGS(task, pos, mr, nsegs))
10558f10ad4SChuck Lever 
10658f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_wrch_event,
10758f10ad4SChuck Lever 	TP_PROTO(
10858f10ad4SChuck Lever 		const struct rpc_task *task,
10958f10ad4SChuck Lever 		struct rpcrdma_mr *mr,
11058f10ad4SChuck Lever 		int nsegs
11158f10ad4SChuck Lever 	),
11258f10ad4SChuck Lever 
11358f10ad4SChuck Lever 	TP_ARGS(task, mr, nsegs),
11458f10ad4SChuck Lever 
11558f10ad4SChuck Lever 	TP_STRUCT__entry(
11658f10ad4SChuck Lever 		__field(unsigned int, task_id)
11758f10ad4SChuck Lever 		__field(unsigned int, client_id)
11858f10ad4SChuck Lever 		__field(const void *, mr)
11958f10ad4SChuck Lever 		__field(int, nents)
12058f10ad4SChuck Lever 		__field(u32, handle)
12158f10ad4SChuck Lever 		__field(u32, length)
12258f10ad4SChuck Lever 		__field(u64, offset)
12358f10ad4SChuck Lever 		__field(int, nsegs)
12458f10ad4SChuck Lever 	),
12558f10ad4SChuck Lever 
12658f10ad4SChuck Lever 	TP_fast_assign(
12758f10ad4SChuck Lever 		__entry->task_id = task->tk_pid;
12858f10ad4SChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
12958f10ad4SChuck Lever 		__entry->mr = mr;
13058f10ad4SChuck Lever 		__entry->nents = mr->mr_nents;
13158f10ad4SChuck Lever 		__entry->handle = mr->mr_handle;
13258f10ad4SChuck Lever 		__entry->length = mr->mr_length;
13358f10ad4SChuck Lever 		__entry->offset = mr->mr_offset;
13458f10ad4SChuck Lever 		__entry->nsegs = nsegs;
13558f10ad4SChuck Lever 	),
13658f10ad4SChuck Lever 
13758f10ad4SChuck Lever 	TP_printk("task:%u@%u mr=%p %u@0x%016llx:0x%08x (%s)",
13858f10ad4SChuck Lever 		__entry->task_id, __entry->client_id, __entry->mr,
13958f10ad4SChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
14058f10ad4SChuck Lever 		__entry->handle,
14158f10ad4SChuck Lever 		__entry->nents < __entry->nsegs ? "more" : "last"
14258f10ad4SChuck Lever 	)
14358f10ad4SChuck Lever );
14458f10ad4SChuck Lever 
14558f10ad4SChuck Lever #define DEFINE_WRCH_EVENT(name)						\
14658f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_wrch_event, name,			\
14758f10ad4SChuck Lever 				TP_PROTO(				\
14858f10ad4SChuck Lever 					const struct rpc_task *task,	\
14958f10ad4SChuck Lever 					struct rpcrdma_mr *mr,		\
15058f10ad4SChuck Lever 					int nsegs			\
15158f10ad4SChuck Lever 				),					\
15258f10ad4SChuck Lever 				TP_ARGS(task, mr, nsegs))
15358f10ad4SChuck Lever 
15458f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_INVALID);
15558f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_IS_VALID);
15658f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_FR);
15758f10ad4SChuck Lever TRACE_DEFINE_ENUM(FRWR_FLUSHED_LI);
15858f10ad4SChuck Lever 
15958f10ad4SChuck Lever #define xprtrdma_show_frwr_state(x)					\
16058f10ad4SChuck Lever 		__print_symbolic(x,					\
16158f10ad4SChuck Lever 				{ FRWR_IS_INVALID, "INVALID" },		\
16258f10ad4SChuck Lever 				{ FRWR_IS_VALID, "VALID" },		\
16358f10ad4SChuck Lever 				{ FRWR_FLUSHED_FR, "FLUSHED_FR" },	\
16458f10ad4SChuck Lever 				{ FRWR_FLUSHED_LI, "FLUSHED_LI" })
16558f10ad4SChuck Lever 
16658f10ad4SChuck Lever DECLARE_EVENT_CLASS(xprtrdma_frwr_done,
16758f10ad4SChuck Lever 	TP_PROTO(
16858f10ad4SChuck Lever 		const struct ib_wc *wc,
16958f10ad4SChuck Lever 		const struct rpcrdma_frwr *frwr
17058f10ad4SChuck Lever 	),
17158f10ad4SChuck Lever 
17258f10ad4SChuck Lever 	TP_ARGS(wc, frwr),
17358f10ad4SChuck Lever 
17458f10ad4SChuck Lever 	TP_STRUCT__entry(
17558f10ad4SChuck Lever 		__field(const void *, mr)
17658f10ad4SChuck Lever 		__field(unsigned int, state)
17758f10ad4SChuck Lever 		__field(unsigned int, status)
17858f10ad4SChuck Lever 		__field(unsigned int, vendor_err)
17958f10ad4SChuck Lever 	),
18058f10ad4SChuck Lever 
18158f10ad4SChuck Lever 	TP_fast_assign(
18258f10ad4SChuck Lever 		__entry->mr = container_of(frwr, struct rpcrdma_mr, frwr);
18358f10ad4SChuck Lever 		__entry->state = frwr->fr_state;
18458f10ad4SChuck Lever 		__entry->status = wc->status;
18558f10ad4SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
18658f10ad4SChuck Lever 	),
18758f10ad4SChuck Lever 
18858f10ad4SChuck Lever 	TP_printk(
18958f10ad4SChuck Lever 		"mr=%p state=%s: %s (%u/0x%x)",
19058f10ad4SChuck Lever 		__entry->mr, xprtrdma_show_frwr_state(__entry->state),
19158f10ad4SChuck Lever 		rdma_show_wc_status(__entry->status),
19258f10ad4SChuck Lever 		__entry->status, __entry->vendor_err
19358f10ad4SChuck Lever 	)
19458f10ad4SChuck Lever );
19558f10ad4SChuck Lever 
19658f10ad4SChuck Lever #define DEFINE_FRWR_DONE_EVENT(name)					\
19758f10ad4SChuck Lever 		DEFINE_EVENT(xprtrdma_frwr_done, name,			\
19858f10ad4SChuck Lever 				TP_PROTO(				\
19958f10ad4SChuck Lever 					const struct ib_wc *wc,		\
20058f10ad4SChuck Lever 					const struct rpcrdma_frwr *frwr	\
20158f10ad4SChuck Lever 				),					\
20258f10ad4SChuck Lever 				TP_ARGS(wc, frwr))
20358f10ad4SChuck Lever 
204b4a7f91cSChuck Lever /**
205ab03eff5SChuck Lever  ** Call events
206ab03eff5SChuck Lever  **/
207ab03eff5SChuck Lever 
20858f10ad4SChuck Lever DEFINE_RDCH_EVENT(xprtrdma_read_chunk);
20958f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_write_chunk);
21058f10ad4SChuck Lever DEFINE_WRCH_EVENT(xprtrdma_reply_chunk);
21158f10ad4SChuck Lever 
212ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_noch);
213ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_readch);
214ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_areadch);
215ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_writech);
216ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_replych);
217ab03eff5SChuck Lever 
218ab03eff5SChuck Lever #define xprtrdma_show_chunktype(x)					\
219ab03eff5SChuck Lever 		__print_symbolic(x,					\
220ab03eff5SChuck Lever 				{ rpcrdma_noch, "inline" },		\
221ab03eff5SChuck Lever 				{ rpcrdma_readch, "read list" },	\
222ab03eff5SChuck Lever 				{ rpcrdma_areadch, "*read list" },	\
223ab03eff5SChuck Lever 				{ rpcrdma_writech, "write list" },	\
224ab03eff5SChuck Lever 				{ rpcrdma_replych, "reply chunk" })
225ab03eff5SChuck Lever 
226ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_marshal,
227ab03eff5SChuck Lever 	TP_PROTO(
228ab03eff5SChuck Lever 		const struct rpc_rqst *rqst,
229ab03eff5SChuck Lever 		unsigned int hdrlen,
230ab03eff5SChuck Lever 		unsigned int rtype,
231ab03eff5SChuck Lever 		unsigned int wtype
232ab03eff5SChuck Lever 	),
233ab03eff5SChuck Lever 
234ab03eff5SChuck Lever 	TP_ARGS(rqst, hdrlen, rtype, wtype),
235ab03eff5SChuck Lever 
236ab03eff5SChuck Lever 	TP_STRUCT__entry(
237ab03eff5SChuck Lever 		__field(unsigned int, task_id)
238ab03eff5SChuck Lever 		__field(unsigned int, client_id)
239ab03eff5SChuck Lever 		__field(u32, xid)
240ab03eff5SChuck Lever 		__field(unsigned int, hdrlen)
241ab03eff5SChuck Lever 		__field(unsigned int, headlen)
242ab03eff5SChuck Lever 		__field(unsigned int, pagelen)
243ab03eff5SChuck Lever 		__field(unsigned int, taillen)
244ab03eff5SChuck Lever 		__field(unsigned int, rtype)
245ab03eff5SChuck Lever 		__field(unsigned int, wtype)
246ab03eff5SChuck Lever 	),
247ab03eff5SChuck Lever 
248ab03eff5SChuck Lever 	TP_fast_assign(
249ab03eff5SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
250ab03eff5SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
251ab03eff5SChuck Lever 		__entry->xid = be32_to_cpu(rqst->rq_xid);
252ab03eff5SChuck Lever 		__entry->hdrlen = hdrlen;
253ab03eff5SChuck Lever 		__entry->headlen = rqst->rq_snd_buf.head[0].iov_len;
254ab03eff5SChuck Lever 		__entry->pagelen = rqst->rq_snd_buf.page_len;
255ab03eff5SChuck Lever 		__entry->taillen = rqst->rq_snd_buf.tail[0].iov_len;
256ab03eff5SChuck Lever 		__entry->rtype = rtype;
257ab03eff5SChuck Lever 		__entry->wtype = wtype;
258ab03eff5SChuck Lever 	),
259ab03eff5SChuck Lever 
260ab03eff5SChuck Lever 	TP_printk("task:%u@%u xid=0x%08x: hdr=%u xdr=%u/%u/%u %s/%s",
261ab03eff5SChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
262ab03eff5SChuck Lever 		__entry->hdrlen,
263ab03eff5SChuck Lever 		__entry->headlen, __entry->pagelen, __entry->taillen,
264ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->rtype),
265ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->wtype)
266ab03eff5SChuck Lever 	)
267ab03eff5SChuck Lever );
268ab03eff5SChuck Lever 
269ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_post_send,
270ab03eff5SChuck Lever 	TP_PROTO(
271ab03eff5SChuck Lever 		const struct rpcrdma_req *req,
272ab03eff5SChuck Lever 		int status
273ab03eff5SChuck Lever 	),
274ab03eff5SChuck Lever 
275ab03eff5SChuck Lever 	TP_ARGS(req, status),
276ab03eff5SChuck Lever 
277ab03eff5SChuck Lever 	TP_STRUCT__entry(
278ab03eff5SChuck Lever 		__field(const void *, req)
279ab03eff5SChuck Lever 		__field(int, num_sge)
280ab03eff5SChuck Lever 		__field(bool, signaled)
281ab03eff5SChuck Lever 		__field(int, status)
282ab03eff5SChuck Lever 	),
283ab03eff5SChuck Lever 
284ab03eff5SChuck Lever 	TP_fast_assign(
285ab03eff5SChuck Lever 		__entry->req = req;
286ab03eff5SChuck Lever 		__entry->num_sge = req->rl_sendctx->sc_wr.num_sge;
287ab03eff5SChuck Lever 		__entry->signaled = req->rl_sendctx->sc_wr.send_flags &
288ab03eff5SChuck Lever 				    IB_SEND_SIGNALED;
289ab03eff5SChuck Lever 		__entry->status = status;
290ab03eff5SChuck Lever 	),
291ab03eff5SChuck Lever 
292ab03eff5SChuck Lever 	TP_printk("req=%p, %d SGEs%s, status=%d",
293ab03eff5SChuck Lever 		__entry->req, __entry->num_sge,
294ab03eff5SChuck Lever 		(__entry->signaled ? ", signaled" : ""),
295ab03eff5SChuck Lever 		__entry->status
296ab03eff5SChuck Lever 	)
297ab03eff5SChuck Lever );
298ab03eff5SChuck Lever 
299b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_post_recv,
300b4a7f91cSChuck Lever 	TP_PROTO(
301b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
302b4a7f91cSChuck Lever 		int status
303b4a7f91cSChuck Lever 	),
304b4a7f91cSChuck Lever 
305b4a7f91cSChuck Lever 	TP_ARGS(rep, status),
306b4a7f91cSChuck Lever 
307b4a7f91cSChuck Lever 	TP_STRUCT__entry(
308b4a7f91cSChuck Lever 		__field(const void *, rep)
309b4a7f91cSChuck Lever 		__field(int, status)
310b4a7f91cSChuck Lever 	),
311b4a7f91cSChuck Lever 
312b4a7f91cSChuck Lever 	TP_fast_assign(
313b4a7f91cSChuck Lever 		__entry->rep = rep;
314b4a7f91cSChuck Lever 		__entry->status = status;
315b4a7f91cSChuck Lever 	),
316b4a7f91cSChuck Lever 
317b4a7f91cSChuck Lever 	TP_printk("rep=%p status=%d",
318b4a7f91cSChuck Lever 		__entry->rep, __entry->status
319b4a7f91cSChuck Lever 	)
320b4a7f91cSChuck Lever );
321b4a7f91cSChuck Lever 
322ab03eff5SChuck Lever /**
323ab03eff5SChuck Lever  ** Completion events
324ab03eff5SChuck Lever  **/
325ab03eff5SChuck Lever 
326ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_wc_send,
327ab03eff5SChuck Lever 	TP_PROTO(
328ab03eff5SChuck Lever 		const struct rpcrdma_sendctx *sc,
329ab03eff5SChuck Lever 		const struct ib_wc *wc
330ab03eff5SChuck Lever 	),
331ab03eff5SChuck Lever 
332ab03eff5SChuck Lever 	TP_ARGS(sc, wc),
333ab03eff5SChuck Lever 
334ab03eff5SChuck Lever 	TP_STRUCT__entry(
335ab03eff5SChuck Lever 		__field(const void *, req)
336ab03eff5SChuck Lever 		__field(unsigned int, unmap_count)
337ab03eff5SChuck Lever 		__field(unsigned int, status)
338ab03eff5SChuck Lever 		__field(unsigned int, vendor_err)
339ab03eff5SChuck Lever 	),
340ab03eff5SChuck Lever 
341ab03eff5SChuck Lever 	TP_fast_assign(
342ab03eff5SChuck Lever 		__entry->req = sc->sc_req;
343ab03eff5SChuck Lever 		__entry->unmap_count = sc->sc_unmap_count;
344ab03eff5SChuck Lever 		__entry->status = wc->status;
345ab03eff5SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
346ab03eff5SChuck Lever 	),
347ab03eff5SChuck Lever 
348ab03eff5SChuck Lever 	TP_printk("req=%p, unmapped %u pages: %s (%u/0x%x)",
349ab03eff5SChuck Lever 		__entry->req, __entry->unmap_count,
350ab03eff5SChuck Lever 		rdma_show_wc_status(__entry->status),
351ab03eff5SChuck Lever 		__entry->status, __entry->vendor_err
352ab03eff5SChuck Lever 	)
353ab03eff5SChuck Lever );
354ab03eff5SChuck Lever 
355b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_wc_receive,
356b4a7f91cSChuck Lever 	TP_PROTO(
357b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
358b4a7f91cSChuck Lever 		const struct ib_wc *wc
359b4a7f91cSChuck Lever 	),
360b4a7f91cSChuck Lever 
361b4a7f91cSChuck Lever 	TP_ARGS(rep, wc),
362b4a7f91cSChuck Lever 
363b4a7f91cSChuck Lever 	TP_STRUCT__entry(
364b4a7f91cSChuck Lever 		__field(const void *, rep)
365b4a7f91cSChuck Lever 		__field(unsigned int, byte_len)
366b4a7f91cSChuck Lever 		__field(unsigned int, status)
367b4a7f91cSChuck Lever 		__field(unsigned int, vendor_err)
368b4a7f91cSChuck Lever 	),
369b4a7f91cSChuck Lever 
370b4a7f91cSChuck Lever 	TP_fast_assign(
371b4a7f91cSChuck Lever 		__entry->rep = rep;
372b4a7f91cSChuck Lever 		__entry->byte_len = wc->byte_len;
373b4a7f91cSChuck Lever 		__entry->status = wc->status;
374b4a7f91cSChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
375b4a7f91cSChuck Lever 	),
376b4a7f91cSChuck Lever 
377b4a7f91cSChuck Lever 	TP_printk("rep=%p, %u bytes: %s (%u/0x%x)",
378b4a7f91cSChuck Lever 		__entry->rep, __entry->byte_len,
379b4a7f91cSChuck Lever 		rdma_show_wc_status(__entry->status),
380b4a7f91cSChuck Lever 		__entry->status, __entry->vendor_err
381b4a7f91cSChuck Lever 	)
382b4a7f91cSChuck Lever );
383b4a7f91cSChuck Lever 
38458f10ad4SChuck Lever DEFINE_FRWR_DONE_EVENT(xprtrdma_wc_fastreg);
38558f10ad4SChuck Lever 
386b4a7f91cSChuck Lever /**
387b4a7f91cSChuck Lever  ** Reply events
388b4a7f91cSChuck Lever  **/
389b4a7f91cSChuck Lever 
390b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_reply,
391b4a7f91cSChuck Lever 	TP_PROTO(
392b4a7f91cSChuck Lever 		const struct rpc_task *task,
393b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
394b4a7f91cSChuck Lever 		const struct rpcrdma_req *req,
395b4a7f91cSChuck Lever 		unsigned int credits
396b4a7f91cSChuck Lever 	),
397b4a7f91cSChuck Lever 
398b4a7f91cSChuck Lever 	TP_ARGS(task, rep, req, credits),
399b4a7f91cSChuck Lever 
400b4a7f91cSChuck Lever 	TP_STRUCT__entry(
401b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
402b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
403b4a7f91cSChuck Lever 		__field(const void *, rep)
404b4a7f91cSChuck Lever 		__field(const void *, req)
405b4a7f91cSChuck Lever 		__field(u32, xid)
406b4a7f91cSChuck Lever 		__field(unsigned int, credits)
407b4a7f91cSChuck Lever 	),
408b4a7f91cSChuck Lever 
409b4a7f91cSChuck Lever 	TP_fast_assign(
410b4a7f91cSChuck Lever 		__entry->task_id = task->tk_pid;
411b4a7f91cSChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
412b4a7f91cSChuck Lever 		__entry->rep = rep;
413b4a7f91cSChuck Lever 		__entry->req = req;
414b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
415b4a7f91cSChuck Lever 		__entry->credits = credits;
416b4a7f91cSChuck Lever 	),
417b4a7f91cSChuck Lever 
418b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x, %u credits, rep=%p -> req=%p",
419b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
420b4a7f91cSChuck Lever 		__entry->credits, __entry->rep, __entry->req
421b4a7f91cSChuck Lever 	)
422b4a7f91cSChuck Lever );
423b4a7f91cSChuck Lever 
424b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_defer_cmp,
425b4a7f91cSChuck Lever 	TP_PROTO(
426b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep
427b4a7f91cSChuck Lever 	),
428b4a7f91cSChuck Lever 
429b4a7f91cSChuck Lever 	TP_ARGS(rep),
430b4a7f91cSChuck Lever 
431b4a7f91cSChuck Lever 	TP_STRUCT__entry(
432b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
433b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
434b4a7f91cSChuck Lever 		__field(const void *, rep)
435b4a7f91cSChuck Lever 		__field(u32, xid)
436b4a7f91cSChuck Lever 	),
437b4a7f91cSChuck Lever 
438b4a7f91cSChuck Lever 	TP_fast_assign(
439b4a7f91cSChuck Lever 		__entry->task_id = rep->rr_rqst->rq_task->tk_pid;
440b4a7f91cSChuck Lever 		__entry->client_id = rep->rr_rqst->rq_task->tk_client->cl_clid;
441b4a7f91cSChuck Lever 		__entry->rep = rep;
442b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
443b4a7f91cSChuck Lever 	),
444b4a7f91cSChuck Lever 
445b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x rep=%p",
446b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
447b4a7f91cSChuck Lever 		__entry->rep
448b4a7f91cSChuck Lever 	)
449b4a7f91cSChuck Lever );
450b4a7f91cSChuck Lever 
451b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_vers);
452b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_rqst);
453b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_short);
454b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_hdr);
455b4a7f91cSChuck Lever 
456e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup,
457e11b7c96SChuck Lever 	TP_PROTO(
458e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
459e11b7c96SChuck Lever 		int len,
460e11b7c96SChuck Lever 		int hdrlen
461e11b7c96SChuck Lever 	),
462e11b7c96SChuck Lever 
463e11b7c96SChuck Lever 	TP_ARGS(rqst, len, hdrlen),
464e11b7c96SChuck Lever 
465e11b7c96SChuck Lever 	TP_STRUCT__entry(
466e11b7c96SChuck Lever 		__field(unsigned int, task_id)
467e11b7c96SChuck Lever 		__field(unsigned int, client_id)
468e11b7c96SChuck Lever 		__field(const void *, base)
469e11b7c96SChuck Lever 		__field(int, len)
470e11b7c96SChuck Lever 		__field(int, hdrlen)
471e11b7c96SChuck Lever 	),
472e11b7c96SChuck Lever 
473e11b7c96SChuck Lever 	TP_fast_assign(
474e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
475e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
476e11b7c96SChuck Lever 		__entry->base = rqst->rq_rcv_buf.head[0].iov_base;
477e11b7c96SChuck Lever 		__entry->len = len;
478e11b7c96SChuck Lever 		__entry->hdrlen = hdrlen;
479e11b7c96SChuck Lever 	),
480e11b7c96SChuck Lever 
481e11b7c96SChuck Lever 	TP_printk("task:%u@%u base=%p len=%d hdrlen=%d",
482e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
483e11b7c96SChuck Lever 		__entry->base, __entry->len, __entry->hdrlen
484e11b7c96SChuck Lever 	)
485e11b7c96SChuck Lever );
486e11b7c96SChuck Lever 
487e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_fixup_pg,
488e11b7c96SChuck Lever 	TP_PROTO(
489e11b7c96SChuck Lever 		const struct rpc_rqst *rqst,
490e11b7c96SChuck Lever 		int pageno,
491e11b7c96SChuck Lever 		const void *pos,
492e11b7c96SChuck Lever 		int len,
493e11b7c96SChuck Lever 		int curlen
494e11b7c96SChuck Lever 	),
495e11b7c96SChuck Lever 
496e11b7c96SChuck Lever 	TP_ARGS(rqst, pageno, pos, len, curlen),
497e11b7c96SChuck Lever 
498e11b7c96SChuck Lever 	TP_STRUCT__entry(
499e11b7c96SChuck Lever 		__field(unsigned int, task_id)
500e11b7c96SChuck Lever 		__field(unsigned int, client_id)
501e11b7c96SChuck Lever 		__field(const void *, pos)
502e11b7c96SChuck Lever 		__field(int, pageno)
503e11b7c96SChuck Lever 		__field(int, len)
504e11b7c96SChuck Lever 		__field(int, curlen)
505e11b7c96SChuck Lever 	),
506e11b7c96SChuck Lever 
507e11b7c96SChuck Lever 	TP_fast_assign(
508e11b7c96SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
509e11b7c96SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
510e11b7c96SChuck Lever 		__entry->pos = pos;
511e11b7c96SChuck Lever 		__entry->pageno = pageno;
512e11b7c96SChuck Lever 		__entry->len = len;
513e11b7c96SChuck Lever 		__entry->curlen = curlen;
514e11b7c96SChuck Lever 	),
515e11b7c96SChuck Lever 
516e11b7c96SChuck Lever 	TP_printk("task:%u@%u pageno=%d pos=%p len=%d curlen=%d",
517e11b7c96SChuck Lever 		__entry->task_id, __entry->client_id,
518e11b7c96SChuck Lever 		__entry->pageno, __entry->pos, __entry->len, __entry->curlen
519e11b7c96SChuck Lever 	)
520e11b7c96SChuck Lever );
521e11b7c96SChuck Lever 
522e11b7c96SChuck Lever TRACE_EVENT(xprtrdma_decode_seg,
523e11b7c96SChuck Lever 	TP_PROTO(
524e11b7c96SChuck Lever 		u32 handle,
525e11b7c96SChuck Lever 		u32 length,
526e11b7c96SChuck Lever 		u64 offset
527e11b7c96SChuck Lever 	),
528e11b7c96SChuck Lever 
529e11b7c96SChuck Lever 	TP_ARGS(handle, length, offset),
530e11b7c96SChuck Lever 
531e11b7c96SChuck Lever 	TP_STRUCT__entry(
532e11b7c96SChuck Lever 		__field(u32, handle)
533e11b7c96SChuck Lever 		__field(u32, length)
534e11b7c96SChuck Lever 		__field(u64, offset)
535e11b7c96SChuck Lever 	),
536e11b7c96SChuck Lever 
537e11b7c96SChuck Lever 	TP_fast_assign(
538e11b7c96SChuck Lever 		__entry->handle = handle;
539e11b7c96SChuck Lever 		__entry->length = length;
540e11b7c96SChuck Lever 		__entry->offset = offset;
541e11b7c96SChuck Lever 	),
542e11b7c96SChuck Lever 
543e11b7c96SChuck Lever 	TP_printk("%u@0x%016llx:0x%08x",
544e11b7c96SChuck Lever 		__entry->length, (unsigned long long)__entry->offset,
545e11b7c96SChuck Lever 		__entry->handle
546e11b7c96SChuck Lever 	)
547e11b7c96SChuck Lever );
548e11b7c96SChuck Lever 
549e48f083eSChuck Lever #endif /* _TRACE_RPCRDMA_H */
550e48f083eSChuck Lever 
551e48f083eSChuck Lever #include <trace/define_trace.h>
552