xref: /openbmc/linux/include/trace/events/rpcrdma.h (revision b4a7f91c)
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 
54b4a7f91cSChuck Lever /**
55ab03eff5SChuck Lever  ** Call events
56ab03eff5SChuck Lever  **/
57ab03eff5SChuck Lever 
58ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_noch);
59ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_readch);
60ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_areadch);
61ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_writech);
62ab03eff5SChuck Lever TRACE_DEFINE_ENUM(rpcrdma_replych);
63ab03eff5SChuck Lever 
64ab03eff5SChuck Lever #define xprtrdma_show_chunktype(x)					\
65ab03eff5SChuck Lever 		__print_symbolic(x,					\
66ab03eff5SChuck Lever 				{ rpcrdma_noch, "inline" },		\
67ab03eff5SChuck Lever 				{ rpcrdma_readch, "read list" },	\
68ab03eff5SChuck Lever 				{ rpcrdma_areadch, "*read list" },	\
69ab03eff5SChuck Lever 				{ rpcrdma_writech, "write list" },	\
70ab03eff5SChuck Lever 				{ rpcrdma_replych, "reply chunk" })
71ab03eff5SChuck Lever 
72ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_marshal,
73ab03eff5SChuck Lever 	TP_PROTO(
74ab03eff5SChuck Lever 		const struct rpc_rqst *rqst,
75ab03eff5SChuck Lever 		unsigned int hdrlen,
76ab03eff5SChuck Lever 		unsigned int rtype,
77ab03eff5SChuck Lever 		unsigned int wtype
78ab03eff5SChuck Lever 	),
79ab03eff5SChuck Lever 
80ab03eff5SChuck Lever 	TP_ARGS(rqst, hdrlen, rtype, wtype),
81ab03eff5SChuck Lever 
82ab03eff5SChuck Lever 	TP_STRUCT__entry(
83ab03eff5SChuck Lever 		__field(unsigned int, task_id)
84ab03eff5SChuck Lever 		__field(unsigned int, client_id)
85ab03eff5SChuck Lever 		__field(u32, xid)
86ab03eff5SChuck Lever 		__field(unsigned int, hdrlen)
87ab03eff5SChuck Lever 		__field(unsigned int, headlen)
88ab03eff5SChuck Lever 		__field(unsigned int, pagelen)
89ab03eff5SChuck Lever 		__field(unsigned int, taillen)
90ab03eff5SChuck Lever 		__field(unsigned int, rtype)
91ab03eff5SChuck Lever 		__field(unsigned int, wtype)
92ab03eff5SChuck Lever 	),
93ab03eff5SChuck Lever 
94ab03eff5SChuck Lever 	TP_fast_assign(
95ab03eff5SChuck Lever 		__entry->task_id = rqst->rq_task->tk_pid;
96ab03eff5SChuck Lever 		__entry->client_id = rqst->rq_task->tk_client->cl_clid;
97ab03eff5SChuck Lever 		__entry->xid = be32_to_cpu(rqst->rq_xid);
98ab03eff5SChuck Lever 		__entry->hdrlen = hdrlen;
99ab03eff5SChuck Lever 		__entry->headlen = rqst->rq_snd_buf.head[0].iov_len;
100ab03eff5SChuck Lever 		__entry->pagelen = rqst->rq_snd_buf.page_len;
101ab03eff5SChuck Lever 		__entry->taillen = rqst->rq_snd_buf.tail[0].iov_len;
102ab03eff5SChuck Lever 		__entry->rtype = rtype;
103ab03eff5SChuck Lever 		__entry->wtype = wtype;
104ab03eff5SChuck Lever 	),
105ab03eff5SChuck Lever 
106ab03eff5SChuck Lever 	TP_printk("task:%u@%u xid=0x%08x: hdr=%u xdr=%u/%u/%u %s/%s",
107ab03eff5SChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
108ab03eff5SChuck Lever 		__entry->hdrlen,
109ab03eff5SChuck Lever 		__entry->headlen, __entry->pagelen, __entry->taillen,
110ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->rtype),
111ab03eff5SChuck Lever 		xprtrdma_show_chunktype(__entry->wtype)
112ab03eff5SChuck Lever 	)
113ab03eff5SChuck Lever );
114ab03eff5SChuck Lever 
115ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_post_send,
116ab03eff5SChuck Lever 	TP_PROTO(
117ab03eff5SChuck Lever 		const struct rpcrdma_req *req,
118ab03eff5SChuck Lever 		int status
119ab03eff5SChuck Lever 	),
120ab03eff5SChuck Lever 
121ab03eff5SChuck Lever 	TP_ARGS(req, status),
122ab03eff5SChuck Lever 
123ab03eff5SChuck Lever 	TP_STRUCT__entry(
124ab03eff5SChuck Lever 		__field(const void *, req)
125ab03eff5SChuck Lever 		__field(int, num_sge)
126ab03eff5SChuck Lever 		__field(bool, signaled)
127ab03eff5SChuck Lever 		__field(int, status)
128ab03eff5SChuck Lever 	),
129ab03eff5SChuck Lever 
130ab03eff5SChuck Lever 	TP_fast_assign(
131ab03eff5SChuck Lever 		__entry->req = req;
132ab03eff5SChuck Lever 		__entry->num_sge = req->rl_sendctx->sc_wr.num_sge;
133ab03eff5SChuck Lever 		__entry->signaled = req->rl_sendctx->sc_wr.send_flags &
134ab03eff5SChuck Lever 				    IB_SEND_SIGNALED;
135ab03eff5SChuck Lever 		__entry->status = status;
136ab03eff5SChuck Lever 	),
137ab03eff5SChuck Lever 
138ab03eff5SChuck Lever 	TP_printk("req=%p, %d SGEs%s, status=%d",
139ab03eff5SChuck Lever 		__entry->req, __entry->num_sge,
140ab03eff5SChuck Lever 		(__entry->signaled ? ", signaled" : ""),
141ab03eff5SChuck Lever 		__entry->status
142ab03eff5SChuck Lever 	)
143ab03eff5SChuck Lever );
144ab03eff5SChuck Lever 
145b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_post_recv,
146b4a7f91cSChuck Lever 	TP_PROTO(
147b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
148b4a7f91cSChuck Lever 		int status
149b4a7f91cSChuck Lever 	),
150b4a7f91cSChuck Lever 
151b4a7f91cSChuck Lever 	TP_ARGS(rep, status),
152b4a7f91cSChuck Lever 
153b4a7f91cSChuck Lever 	TP_STRUCT__entry(
154b4a7f91cSChuck Lever 		__field(const void *, rep)
155b4a7f91cSChuck Lever 		__field(int, status)
156b4a7f91cSChuck Lever 	),
157b4a7f91cSChuck Lever 
158b4a7f91cSChuck Lever 	TP_fast_assign(
159b4a7f91cSChuck Lever 		__entry->rep = rep;
160b4a7f91cSChuck Lever 		__entry->status = status;
161b4a7f91cSChuck Lever 	),
162b4a7f91cSChuck Lever 
163b4a7f91cSChuck Lever 	TP_printk("rep=%p status=%d",
164b4a7f91cSChuck Lever 		__entry->rep, __entry->status
165b4a7f91cSChuck Lever 	)
166b4a7f91cSChuck Lever );
167b4a7f91cSChuck Lever 
168ab03eff5SChuck Lever /**
169ab03eff5SChuck Lever  ** Completion events
170ab03eff5SChuck Lever  **/
171ab03eff5SChuck Lever 
172ab03eff5SChuck Lever TRACE_EVENT(xprtrdma_wc_send,
173ab03eff5SChuck Lever 	TP_PROTO(
174ab03eff5SChuck Lever 		const struct rpcrdma_sendctx *sc,
175ab03eff5SChuck Lever 		const struct ib_wc *wc
176ab03eff5SChuck Lever 	),
177ab03eff5SChuck Lever 
178ab03eff5SChuck Lever 	TP_ARGS(sc, wc),
179ab03eff5SChuck Lever 
180ab03eff5SChuck Lever 	TP_STRUCT__entry(
181ab03eff5SChuck Lever 		__field(const void *, req)
182ab03eff5SChuck Lever 		__field(unsigned int, unmap_count)
183ab03eff5SChuck Lever 		__field(unsigned int, status)
184ab03eff5SChuck Lever 		__field(unsigned int, vendor_err)
185ab03eff5SChuck Lever 	),
186ab03eff5SChuck Lever 
187ab03eff5SChuck Lever 	TP_fast_assign(
188ab03eff5SChuck Lever 		__entry->req = sc->sc_req;
189ab03eff5SChuck Lever 		__entry->unmap_count = sc->sc_unmap_count;
190ab03eff5SChuck Lever 		__entry->status = wc->status;
191ab03eff5SChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
192ab03eff5SChuck Lever 	),
193ab03eff5SChuck Lever 
194ab03eff5SChuck Lever 	TP_printk("req=%p, unmapped %u pages: %s (%u/0x%x)",
195ab03eff5SChuck Lever 		__entry->req, __entry->unmap_count,
196ab03eff5SChuck Lever 		rdma_show_wc_status(__entry->status),
197ab03eff5SChuck Lever 		__entry->status, __entry->vendor_err
198ab03eff5SChuck Lever 	)
199ab03eff5SChuck Lever );
200ab03eff5SChuck Lever 
201b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_wc_receive,
202b4a7f91cSChuck Lever 	TP_PROTO(
203b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
204b4a7f91cSChuck Lever 		const struct ib_wc *wc
205b4a7f91cSChuck Lever 	),
206b4a7f91cSChuck Lever 
207b4a7f91cSChuck Lever 	TP_ARGS(rep, wc),
208b4a7f91cSChuck Lever 
209b4a7f91cSChuck Lever 	TP_STRUCT__entry(
210b4a7f91cSChuck Lever 		__field(const void *, rep)
211b4a7f91cSChuck Lever 		__field(unsigned int, byte_len)
212b4a7f91cSChuck Lever 		__field(unsigned int, status)
213b4a7f91cSChuck Lever 		__field(unsigned int, vendor_err)
214b4a7f91cSChuck Lever 	),
215b4a7f91cSChuck Lever 
216b4a7f91cSChuck Lever 	TP_fast_assign(
217b4a7f91cSChuck Lever 		__entry->rep = rep;
218b4a7f91cSChuck Lever 		__entry->byte_len = wc->byte_len;
219b4a7f91cSChuck Lever 		__entry->status = wc->status;
220b4a7f91cSChuck Lever 		__entry->vendor_err = __entry->status ? wc->vendor_err : 0;
221b4a7f91cSChuck Lever 	),
222b4a7f91cSChuck Lever 
223b4a7f91cSChuck Lever 	TP_printk("rep=%p, %u bytes: %s (%u/0x%x)",
224b4a7f91cSChuck Lever 		__entry->rep, __entry->byte_len,
225b4a7f91cSChuck Lever 		rdma_show_wc_status(__entry->status),
226b4a7f91cSChuck Lever 		__entry->status, __entry->vendor_err
227b4a7f91cSChuck Lever 	)
228b4a7f91cSChuck Lever );
229b4a7f91cSChuck Lever 
230b4a7f91cSChuck Lever /**
231b4a7f91cSChuck Lever  ** Reply events
232b4a7f91cSChuck Lever  **/
233b4a7f91cSChuck Lever 
234b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_reply,
235b4a7f91cSChuck Lever 	TP_PROTO(
236b4a7f91cSChuck Lever 		const struct rpc_task *task,
237b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep,
238b4a7f91cSChuck Lever 		const struct rpcrdma_req *req,
239b4a7f91cSChuck Lever 		unsigned int credits
240b4a7f91cSChuck Lever 	),
241b4a7f91cSChuck Lever 
242b4a7f91cSChuck Lever 	TP_ARGS(task, rep, req, credits),
243b4a7f91cSChuck Lever 
244b4a7f91cSChuck Lever 	TP_STRUCT__entry(
245b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
246b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
247b4a7f91cSChuck Lever 		__field(const void *, rep)
248b4a7f91cSChuck Lever 		__field(const void *, req)
249b4a7f91cSChuck Lever 		__field(u32, xid)
250b4a7f91cSChuck Lever 		__field(unsigned int, credits)
251b4a7f91cSChuck Lever 	),
252b4a7f91cSChuck Lever 
253b4a7f91cSChuck Lever 	TP_fast_assign(
254b4a7f91cSChuck Lever 		__entry->task_id = task->tk_pid;
255b4a7f91cSChuck Lever 		__entry->client_id = task->tk_client->cl_clid;
256b4a7f91cSChuck Lever 		__entry->rep = rep;
257b4a7f91cSChuck Lever 		__entry->req = req;
258b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
259b4a7f91cSChuck Lever 		__entry->credits = credits;
260b4a7f91cSChuck Lever 	),
261b4a7f91cSChuck Lever 
262b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x, %u credits, rep=%p -> req=%p",
263b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
264b4a7f91cSChuck Lever 		__entry->credits, __entry->rep, __entry->req
265b4a7f91cSChuck Lever 	)
266b4a7f91cSChuck Lever );
267b4a7f91cSChuck Lever 
268b4a7f91cSChuck Lever TRACE_EVENT(xprtrdma_defer_cmp,
269b4a7f91cSChuck Lever 	TP_PROTO(
270b4a7f91cSChuck Lever 		const struct rpcrdma_rep *rep
271b4a7f91cSChuck Lever 	),
272b4a7f91cSChuck Lever 
273b4a7f91cSChuck Lever 	TP_ARGS(rep),
274b4a7f91cSChuck Lever 
275b4a7f91cSChuck Lever 	TP_STRUCT__entry(
276b4a7f91cSChuck Lever 		__field(unsigned int, task_id)
277b4a7f91cSChuck Lever 		__field(unsigned int, client_id)
278b4a7f91cSChuck Lever 		__field(const void *, rep)
279b4a7f91cSChuck Lever 		__field(u32, xid)
280b4a7f91cSChuck Lever 	),
281b4a7f91cSChuck Lever 
282b4a7f91cSChuck Lever 	TP_fast_assign(
283b4a7f91cSChuck Lever 		__entry->task_id = rep->rr_rqst->rq_task->tk_pid;
284b4a7f91cSChuck Lever 		__entry->client_id = rep->rr_rqst->rq_task->tk_client->cl_clid;
285b4a7f91cSChuck Lever 		__entry->rep = rep;
286b4a7f91cSChuck Lever 		__entry->xid = be32_to_cpu(rep->rr_xid);
287b4a7f91cSChuck Lever 	),
288b4a7f91cSChuck Lever 
289b4a7f91cSChuck Lever 	TP_printk("task:%u@%u xid=0x%08x rep=%p",
290b4a7f91cSChuck Lever 		__entry->task_id, __entry->client_id, __entry->xid,
291b4a7f91cSChuck Lever 		__entry->rep
292b4a7f91cSChuck Lever 	)
293b4a7f91cSChuck Lever );
294b4a7f91cSChuck Lever 
295b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_vers);
296b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_rqst);
297b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_short);
298b4a7f91cSChuck Lever DEFINE_REPLY_EVENT(xprtrdma_reply_hdr);
299b4a7f91cSChuck Lever 
300e48f083eSChuck Lever #endif /* _TRACE_RPCRDMA_H */
301e48f083eSChuck Lever 
302e48f083eSChuck Lever #include <trace/define_trace.h>
303