]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
82b0a4c3 TM |
2 | #undef TRACE_SYSTEM |
3 | #define TRACE_SYSTEM sunrpc | |
4 | ||
5 | #if !defined(_TRACE_SUNRPC_H) || defined(TRACE_HEADER_MULTI_READ) | |
6 | #define _TRACE_SUNRPC_H | |
7 | ||
8 | #include <linux/sunrpc/sched.h> | |
9 | #include <linux/sunrpc/clnt.h> | |
860a0d9e | 10 | #include <linux/sunrpc/svc.h> |
1a867a08 | 11 | #include <linux/sunrpc/xprtsock.h> |
83a712e0 | 12 | #include <linux/sunrpc/svc_xprt.h> |
40b5ea0c TM |
13 | #include <net/tcp_states.h> |
14 | #include <linux/net.h> | |
82b0a4c3 TM |
15 | #include <linux/tracepoint.h> |
16 | ||
b20dfc3f CL |
17 | DECLARE_EVENT_CLASS(xdr_buf_class, |
18 | TP_PROTO( | |
19 | const struct xdr_buf *xdr | |
20 | ), | |
21 | ||
22 | TP_ARGS(xdr), | |
23 | ||
24 | TP_STRUCT__entry( | |
25 | __field(const void *, head_base) | |
26 | __field(size_t, head_len) | |
27 | __field(const void *, tail_base) | |
28 | __field(size_t, tail_len) | |
29 | __field(unsigned int, page_len) | |
30 | __field(unsigned int, msg_len) | |
31 | ), | |
32 | ||
33 | TP_fast_assign( | |
34 | __entry->head_base = xdr->head[0].iov_base; | |
35 | __entry->head_len = xdr->head[0].iov_len; | |
36 | __entry->tail_base = xdr->tail[0].iov_base; | |
37 | __entry->tail_len = xdr->tail[0].iov_len; | |
38 | __entry->page_len = xdr->page_len; | |
39 | __entry->msg_len = xdr->len; | |
40 | ), | |
41 | ||
42 | TP_printk("head=[%p,%zu] page=%u tail=[%p,%zu] len=%u", | |
43 | __entry->head_base, __entry->head_len, __entry->page_len, | |
44 | __entry->tail_base, __entry->tail_len, __entry->msg_len | |
45 | ) | |
46 | ); | |
47 | ||
48 | #define DEFINE_XDRBUF_EVENT(name) \ | |
49 | DEFINE_EVENT(xdr_buf_class, name, \ | |
50 | TP_PROTO( \ | |
51 | const struct xdr_buf *xdr \ | |
52 | ), \ | |
53 | TP_ARGS(xdr)) | |
54 | ||
55 | DEFINE_XDRBUF_EVENT(xprt_sendto); | |
56 | DEFINE_XDRBUF_EVENT(xprt_recvfrom); | |
57 | DEFINE_XDRBUF_EVENT(svc_recvfrom); | |
58 | DEFINE_XDRBUF_EVENT(svc_sendto); | |
59 | ||
ff27e9f7 CL |
60 | TRACE_DEFINE_ENUM(RPC_AUTH_OK); |
61 | TRACE_DEFINE_ENUM(RPC_AUTH_BADCRED); | |
62 | TRACE_DEFINE_ENUM(RPC_AUTH_REJECTEDCRED); | |
63 | TRACE_DEFINE_ENUM(RPC_AUTH_BADVERF); | |
64 | TRACE_DEFINE_ENUM(RPC_AUTH_REJECTEDVERF); | |
65 | TRACE_DEFINE_ENUM(RPC_AUTH_TOOWEAK); | |
66 | TRACE_DEFINE_ENUM(RPCSEC_GSS_CREDPROBLEM); | |
67 | TRACE_DEFINE_ENUM(RPCSEC_GSS_CTXPROBLEM); | |
68 | ||
69 | #define rpc_show_auth_stat(status) \ | |
70 | __print_symbolic(status, \ | |
71 | { RPC_AUTH_OK, "AUTH_OK" }, \ | |
72 | { RPC_AUTH_BADCRED, "BADCRED" }, \ | |
73 | { RPC_AUTH_REJECTEDCRED, "REJECTEDCRED" }, \ | |
74 | { RPC_AUTH_BADVERF, "BADVERF" }, \ | |
75 | { RPC_AUTH_REJECTEDVERF, "REJECTEDVERF" }, \ | |
76 | { RPC_AUTH_TOOWEAK, "TOOWEAK" }, \ | |
77 | { RPCSEC_GSS_CREDPROBLEM, "GSS_CREDPROBLEM" }, \ | |
78 | { RPCSEC_GSS_CTXPROBLEM, "GSS_CTXPROBLEM" }) \ | |
79 | ||
5753cba1 SD |
80 | DECLARE_EVENT_CLASS(rpc_task_status, |
81 | ||
e671edb9 | 82 | TP_PROTO(const struct rpc_task *task), |
5753cba1 | 83 | |
e671edb9 | 84 | TP_ARGS(task), |
5753cba1 SD |
85 | |
86 | TP_STRUCT__entry( | |
92cb6c5b TM |
87 | __field(unsigned int, task_id) |
88 | __field(unsigned int, client_id) | |
5753cba1 SD |
89 | __field(int, status) |
90 | ), | |
91 | ||
92 | TP_fast_assign( | |
92cb6c5b TM |
93 | __entry->task_id = task->tk_pid; |
94 | __entry->client_id = task->tk_client->cl_clid; | |
e671edb9 | 95 | __entry->status = task->tk_status; |
5753cba1 SD |
96 | ), |
97 | ||
52069449 | 98 | TP_printk("task:%u@%u status=%d", |
92cb6c5b TM |
99 | __entry->task_id, __entry->client_id, |
100 | __entry->status) | |
5753cba1 | 101 | ); |
dc5820bd CL |
102 | #define DEFINE_RPC_STATUS_EVENT(name) \ |
103 | DEFINE_EVENT(rpc_task_status, rpc_##name##_status, \ | |
104 | TP_PROTO( \ | |
105 | const struct rpc_task *task \ | |
106 | ), \ | |
107 | TP_ARGS(task)) | |
108 | ||
109 | DEFINE_RPC_STATUS_EVENT(call); | |
110 | DEFINE_RPC_STATUS_EVENT(bind); | |
111 | DEFINE_RPC_STATUS_EVENT(connect); | |
5753cba1 | 112 | |
c435da68 CL |
113 | TRACE_EVENT(rpc_request, |
114 | TP_PROTO(const struct rpc_task *task), | |
115 | ||
116 | TP_ARGS(task), | |
117 | ||
118 | TP_STRUCT__entry( | |
119 | __field(unsigned int, task_id) | |
120 | __field(unsigned int, client_id) | |
121 | __field(int, version) | |
122 | __field(bool, async) | |
123 | __string(progname, task->tk_client->cl_program->name) | |
124 | __string(procname, rpc_proc_name(task)) | |
125 | ), | |
126 | ||
127 | TP_fast_assign( | |
128 | __entry->task_id = task->tk_pid; | |
129 | __entry->client_id = task->tk_client->cl_clid; | |
130 | __entry->version = task->tk_client->cl_vers; | |
131 | __entry->async = RPC_IS_ASYNC(task); | |
132 | __assign_str(progname, task->tk_client->cl_program->name) | |
133 | __assign_str(procname, rpc_proc_name(task)) | |
134 | ), | |
135 | ||
136 | TP_printk("task:%u@%u %sv%d %s (%ssync)", | |
137 | __entry->task_id, __entry->client_id, | |
138 | __get_str(progname), __entry->version, | |
139 | __get_str(procname), __entry->async ? "a": "" | |
140 | ) | |
141 | ); | |
142 | ||
6f701383 CL |
143 | TRACE_DEFINE_ENUM(RPC_TASK_ASYNC); |
144 | TRACE_DEFINE_ENUM(RPC_TASK_SWAPPER); | |
145 | TRACE_DEFINE_ENUM(RPC_CALL_MAJORSEEN); | |
146 | TRACE_DEFINE_ENUM(RPC_TASK_ROOTCREDS); | |
147 | TRACE_DEFINE_ENUM(RPC_TASK_DYNAMIC); | |
6f701383 CL |
148 | TRACE_DEFINE_ENUM(RPC_TASK_SOFT); |
149 | TRACE_DEFINE_ENUM(RPC_TASK_SOFTCONN); | |
150 | TRACE_DEFINE_ENUM(RPC_TASK_SENT); | |
151 | TRACE_DEFINE_ENUM(RPC_TASK_TIMEOUT); | |
152 | TRACE_DEFINE_ENUM(RPC_TASK_NOCONNECT); | |
153 | TRACE_DEFINE_ENUM(RPC_TASK_NO_RETRANS_TIMEOUT); | |
154 | ||
155 | #define rpc_show_task_flags(flags) \ | |
156 | __print_flags(flags, "|", \ | |
157 | { RPC_TASK_ASYNC, "ASYNC" }, \ | |
158 | { RPC_TASK_SWAPPER, "SWAPPER" }, \ | |
159 | { RPC_CALL_MAJORSEEN, "MAJORSEEN" }, \ | |
160 | { RPC_TASK_ROOTCREDS, "ROOTCREDS" }, \ | |
161 | { RPC_TASK_DYNAMIC, "DYNAMIC" }, \ | |
6f701383 CL |
162 | { RPC_TASK_SOFT, "SOFT" }, \ |
163 | { RPC_TASK_SOFTCONN, "SOFTCONN" }, \ | |
164 | { RPC_TASK_SENT, "SENT" }, \ | |
165 | { RPC_TASK_TIMEOUT, "TIMEOUT" }, \ | |
166 | { RPC_TASK_NOCONNECT, "NOCONNECT" }, \ | |
167 | { RPC_TASK_NO_RETRANS_TIMEOUT, "NORTO" }) | |
168 | ||
169 | TRACE_DEFINE_ENUM(RPC_TASK_RUNNING); | |
170 | TRACE_DEFINE_ENUM(RPC_TASK_QUEUED); | |
171 | TRACE_DEFINE_ENUM(RPC_TASK_ACTIVE); | |
172 | TRACE_DEFINE_ENUM(RPC_TASK_NEED_XMIT); | |
173 | TRACE_DEFINE_ENUM(RPC_TASK_NEED_RECV); | |
174 | TRACE_DEFINE_ENUM(RPC_TASK_MSG_PIN_WAIT); | |
ae67bd38 | 175 | TRACE_DEFINE_ENUM(RPC_TASK_SIGNALLED); |
6f701383 CL |
176 | |
177 | #define rpc_show_runstate(flags) \ | |
178 | __print_flags(flags, "|", \ | |
179 | { (1UL << RPC_TASK_RUNNING), "RUNNING" }, \ | |
180 | { (1UL << RPC_TASK_QUEUED), "QUEUED" }, \ | |
181 | { (1UL << RPC_TASK_ACTIVE), "ACTIVE" }, \ | |
182 | { (1UL << RPC_TASK_NEED_XMIT), "NEED_XMIT" }, \ | |
183 | { (1UL << RPC_TASK_NEED_RECV), "NEED_RECV" }, \ | |
ae67bd38 TM |
184 | { (1UL << RPC_TASK_MSG_PIN_WAIT), "MSG_PIN_WAIT" }, \ |
185 | { (1UL << RPC_TASK_SIGNALLED), "SIGNALLED" }) | |
6f701383 | 186 | |
82b0a4c3 TM |
187 | DECLARE_EVENT_CLASS(rpc_task_running, |
188 | ||
e671edb9 | 189 | TP_PROTO(const struct rpc_task *task, const void *action), |
82b0a4c3 | 190 | |
e671edb9 | 191 | TP_ARGS(task, action), |
82b0a4c3 TM |
192 | |
193 | TP_STRUCT__entry( | |
92cb6c5b TM |
194 | __field(unsigned int, task_id) |
195 | __field(unsigned int, client_id) | |
82b0a4c3 TM |
196 | __field(const void *, action) |
197 | __field(unsigned long, runstate) | |
198 | __field(int, status) | |
199 | __field(unsigned short, flags) | |
200 | ), | |
201 | ||
202 | TP_fast_assign( | |
e671edb9 CL |
203 | __entry->client_id = task->tk_client ? |
204 | task->tk_client->cl_clid : -1; | |
92cb6c5b | 205 | __entry->task_id = task->tk_pid; |
82b0a4c3 TM |
206 | __entry->action = action; |
207 | __entry->runstate = task->tk_runstate; | |
208 | __entry->status = task->tk_status; | |
209 | __entry->flags = task->tk_flags; | |
210 | ), | |
211 | ||
09686219 | 212 | TP_printk("task:%u@%d flags=%s runstate=%s status=%d action=%ps", |
92cb6c5b | 213 | __entry->task_id, __entry->client_id, |
6f701383 CL |
214 | rpc_show_task_flags(__entry->flags), |
215 | rpc_show_runstate(__entry->runstate), | |
82b0a4c3 TM |
216 | __entry->status, |
217 | __entry->action | |
218 | ) | |
219 | ); | |
dc5820bd CL |
220 | #define DEFINE_RPC_RUNNING_EVENT(name) \ |
221 | DEFINE_EVENT(rpc_task_running, rpc_task_##name, \ | |
222 | TP_PROTO( \ | |
223 | const struct rpc_task *task, \ | |
224 | const void *action \ | |
225 | ), \ | |
226 | TP_ARGS(task, action)) | |
82b0a4c3 | 227 | |
dc5820bd CL |
228 | DEFINE_RPC_RUNNING_EVENT(begin); |
229 | DEFINE_RPC_RUNNING_EVENT(run_action); | |
230 | DEFINE_RPC_RUNNING_EVENT(complete); | |
abf8af78 | 231 | DEFINE_RPC_RUNNING_EVENT(signalled); |
a264abad | 232 | DEFINE_RPC_RUNNING_EVENT(end); |
82b0a4c3 TM |
233 | |
234 | DECLARE_EVENT_CLASS(rpc_task_queued, | |
235 | ||
e671edb9 | 236 | TP_PROTO(const struct rpc_task *task, const struct rpc_wait_queue *q), |
82b0a4c3 | 237 | |
e671edb9 | 238 | TP_ARGS(task, q), |
82b0a4c3 TM |
239 | |
240 | TP_STRUCT__entry( | |
92cb6c5b TM |
241 | __field(unsigned int, task_id) |
242 | __field(unsigned int, client_id) | |
82b0a4c3 TM |
243 | __field(unsigned long, timeout) |
244 | __field(unsigned long, runstate) | |
245 | __field(int, status) | |
246 | __field(unsigned short, flags) | |
85c0d24f | 247 | __string(q_name, rpc_qname(q)) |
82b0a4c3 TM |
248 | ), |
249 | ||
250 | TP_fast_assign( | |
e671edb9 CL |
251 | __entry->client_id = task->tk_client ? |
252 | task->tk_client->cl_clid : -1; | |
92cb6c5b | 253 | __entry->task_id = task->tk_pid; |
5efd1876 | 254 | __entry->timeout = rpc_task_timeout(task); |
82b0a4c3 TM |
255 | __entry->runstate = task->tk_runstate; |
256 | __entry->status = task->tk_status; | |
257 | __entry->flags = task->tk_flags; | |
85c0d24f | 258 | __assign_str(q_name, rpc_qname(q)); |
82b0a4c3 TM |
259 | ), |
260 | ||
6f701383 | 261 | TP_printk("task:%u@%d flags=%s runstate=%s status=%d timeout=%lu queue=%s", |
92cb6c5b | 262 | __entry->task_id, __entry->client_id, |
6f701383 CL |
263 | rpc_show_task_flags(__entry->flags), |
264 | rpc_show_runstate(__entry->runstate), | |
82b0a4c3 TM |
265 | __entry->status, |
266 | __entry->timeout, | |
85c0d24f | 267 | __get_str(q_name) |
82b0a4c3 TM |
268 | ) |
269 | ); | |
dc5820bd CL |
270 | #define DEFINE_RPC_QUEUED_EVENT(name) \ |
271 | DEFINE_EVENT(rpc_task_queued, rpc_task_##name, \ | |
272 | TP_PROTO( \ | |
273 | const struct rpc_task *task, \ | |
274 | const struct rpc_wait_queue *q \ | |
275 | ), \ | |
276 | TP_ARGS(task, q)) | |
82b0a4c3 | 277 | |
dc5820bd CL |
278 | DEFINE_RPC_QUEUED_EVENT(sleep); |
279 | DEFINE_RPC_QUEUED_EVENT(wakeup); | |
82b0a4c3 | 280 | |
e8680a24 CL |
281 | DECLARE_EVENT_CLASS(rpc_failure, |
282 | ||
283 | TP_PROTO(const struct rpc_task *task), | |
284 | ||
285 | TP_ARGS(task), | |
286 | ||
287 | TP_STRUCT__entry( | |
288 | __field(unsigned int, task_id) | |
289 | __field(unsigned int, client_id) | |
290 | ), | |
291 | ||
292 | TP_fast_assign( | |
293 | __entry->task_id = task->tk_pid; | |
294 | __entry->client_id = task->tk_client->cl_clid; | |
295 | ), | |
296 | ||
297 | TP_printk("task:%u@%u", | |
298 | __entry->task_id, __entry->client_id) | |
299 | ); | |
300 | ||
301 | #define DEFINE_RPC_FAILURE(name) \ | |
302 | DEFINE_EVENT(rpc_failure, rpc_bad_##name, \ | |
303 | TP_PROTO( \ | |
304 | const struct rpc_task *task \ | |
305 | ), \ | |
306 | TP_ARGS(task)) | |
307 | ||
308 | DEFINE_RPC_FAILURE(callhdr); | |
7f5667a5 CL |
309 | DEFINE_RPC_FAILURE(verifier); |
310 | ||
311 | DECLARE_EVENT_CLASS(rpc_reply_event, | |
312 | ||
313 | TP_PROTO( | |
314 | const struct rpc_task *task | |
315 | ), | |
316 | ||
317 | TP_ARGS(task), | |
318 | ||
319 | TP_STRUCT__entry( | |
320 | __field(unsigned int, task_id) | |
321 | __field(unsigned int, client_id) | |
322 | __field(u32, xid) | |
323 | __string(progname, task->tk_client->cl_program->name) | |
324 | __field(u32, version) | |
325 | __string(procname, rpc_proc_name(task)) | |
326 | __string(servername, task->tk_xprt->servername) | |
327 | ), | |
328 | ||
329 | TP_fast_assign( | |
330 | __entry->task_id = task->tk_pid; | |
331 | __entry->client_id = task->tk_client->cl_clid; | |
332 | __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid); | |
333 | __assign_str(progname, task->tk_client->cl_program->name) | |
334 | __entry->version = task->tk_client->cl_vers; | |
335 | __assign_str(procname, rpc_proc_name(task)) | |
336 | __assign_str(servername, task->tk_xprt->servername) | |
337 | ), | |
338 | ||
339 | TP_printk("task:%u@%d server=%s xid=0x%08x %sv%d %s", | |
340 | __entry->task_id, __entry->client_id, __get_str(servername), | |
341 | __entry->xid, __get_str(progname), __entry->version, | |
342 | __get_str(procname)) | |
343 | ) | |
344 | ||
345 | #define DEFINE_RPC_REPLY_EVENT(name) \ | |
346 | DEFINE_EVENT(rpc_reply_event, rpc__##name, \ | |
347 | TP_PROTO( \ | |
348 | const struct rpc_task *task \ | |
349 | ), \ | |
350 | TP_ARGS(task)) | |
351 | ||
352 | DEFINE_RPC_REPLY_EVENT(prog_unavail); | |
353 | DEFINE_RPC_REPLY_EVENT(prog_mismatch); | |
354 | DEFINE_RPC_REPLY_EVENT(proc_unavail); | |
355 | DEFINE_RPC_REPLY_EVENT(garbage_args); | |
356 | DEFINE_RPC_REPLY_EVENT(unparsable); | |
357 | DEFINE_RPC_REPLY_EVENT(mismatch); | |
358 | DEFINE_RPC_REPLY_EVENT(stale_creds); | |
359 | DEFINE_RPC_REPLY_EVENT(bad_creds); | |
360 | DEFINE_RPC_REPLY_EVENT(auth_tooweak); | |
e8680a24 | 361 | |
40bf7eb3 CL |
362 | TRACE_EVENT(rpc_stats_latency, |
363 | ||
364 | TP_PROTO( | |
365 | const struct rpc_task *task, | |
366 | ktime_t backlog, | |
367 | ktime_t rtt, | |
368 | ktime_t execute | |
369 | ), | |
370 | ||
371 | TP_ARGS(task, backlog, rtt, execute), | |
372 | ||
373 | TP_STRUCT__entry( | |
98eb6cf2 CL |
374 | __field(unsigned int, task_id) |
375 | __field(unsigned int, client_id) | |
40bf7eb3 CL |
376 | __field(u32, xid) |
377 | __field(int, version) | |
378 | __string(progname, task->tk_client->cl_program->name) | |
379 | __string(procname, rpc_proc_name(task)) | |
380 | __field(unsigned long, backlog) | |
381 | __field(unsigned long, rtt) | |
382 | __field(unsigned long, execute) | |
40bf7eb3 CL |
383 | ), |
384 | ||
385 | TP_fast_assign( | |
98eb6cf2 CL |
386 | __entry->client_id = task->tk_client->cl_clid; |
387 | __entry->task_id = task->tk_pid; | |
40bf7eb3 CL |
388 | __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid); |
389 | __entry->version = task->tk_client->cl_vers; | |
390 | __assign_str(progname, task->tk_client->cl_program->name) | |
391 | __assign_str(procname, rpc_proc_name(task)) | |
392 | __entry->backlog = ktime_to_us(backlog); | |
393 | __entry->rtt = ktime_to_us(rtt); | |
394 | __entry->execute = ktime_to_us(execute); | |
40bf7eb3 CL |
395 | ), |
396 | ||
98eb6cf2 CL |
397 | TP_printk("task:%u@%d xid=0x%08x %sv%d %s backlog=%lu rtt=%lu execute=%lu", |
398 | __entry->task_id, __entry->client_id, __entry->xid, | |
40bf7eb3 CL |
399 | __get_str(progname), __entry->version, __get_str(procname), |
400 | __entry->backlog, __entry->rtt, __entry->execute) | |
401 | ); | |
402 | ||
5582863f CL |
403 | TRACE_EVENT(rpc_xdr_overflow, |
404 | TP_PROTO( | |
405 | const struct xdr_stream *xdr, | |
406 | size_t requested | |
407 | ), | |
408 | ||
409 | TP_ARGS(xdr, requested), | |
410 | ||
411 | TP_STRUCT__entry( | |
412 | __field(unsigned int, task_id) | |
413 | __field(unsigned int, client_id) | |
414 | __field(int, version) | |
415 | __field(size_t, requested) | |
416 | __field(const void *, end) | |
417 | __field(const void *, p) | |
418 | __field(const void *, head_base) | |
419 | __field(size_t, head_len) | |
420 | __field(const void *, tail_base) | |
421 | __field(size_t, tail_len) | |
422 | __field(unsigned int, page_len) | |
423 | __field(unsigned int, len) | |
424 | __string(progname, | |
425 | xdr->rqst->rq_task->tk_client->cl_program->name) | |
426 | __string(procedure, | |
427 | xdr->rqst->rq_task->tk_msg.rpc_proc->p_name) | |
428 | ), | |
429 | ||
430 | TP_fast_assign( | |
431 | if (xdr->rqst) { | |
432 | const struct rpc_task *task = xdr->rqst->rq_task; | |
433 | ||
434 | __entry->task_id = task->tk_pid; | |
435 | __entry->client_id = task->tk_client->cl_clid; | |
436 | __assign_str(progname, | |
437 | task->tk_client->cl_program->name) | |
438 | __entry->version = task->tk_client->cl_vers; | |
439 | __assign_str(procedure, task->tk_msg.rpc_proc->p_name) | |
440 | } else { | |
441 | __entry->task_id = 0; | |
442 | __entry->client_id = 0; | |
443 | __assign_str(progname, "unknown") | |
444 | __entry->version = 0; | |
445 | __assign_str(procedure, "unknown") | |
446 | } | |
447 | __entry->requested = requested; | |
448 | __entry->end = xdr->end; | |
449 | __entry->p = xdr->p; | |
450 | __entry->head_base = xdr->buf->head[0].iov_base, | |
451 | __entry->head_len = xdr->buf->head[0].iov_len, | |
452 | __entry->page_len = xdr->buf->page_len, | |
453 | __entry->tail_base = xdr->buf->tail[0].iov_base, | |
454 | __entry->tail_len = xdr->buf->tail[0].iov_len, | |
455 | __entry->len = xdr->buf->len; | |
456 | ), | |
457 | ||
458 | TP_printk( | |
459 | "task:%u@%u %sv%d %s requested=%zu p=%p end=%p xdr=[%p,%zu]/%u/[%p,%zu]/%u\n", | |
460 | __entry->task_id, __entry->client_id, | |
461 | __get_str(progname), __entry->version, __get_str(procedure), | |
462 | __entry->requested, __entry->p, __entry->end, | |
463 | __entry->head_base, __entry->head_len, | |
464 | __entry->page_len, | |
465 | __entry->tail_base, __entry->tail_len, | |
466 | __entry->len | |
467 | ) | |
468 | ); | |
469 | ||
7be9cea3 CL |
470 | TRACE_EVENT(rpc_xdr_alignment, |
471 | TP_PROTO( | |
472 | const struct xdr_stream *xdr, | |
473 | size_t offset, | |
474 | unsigned int copied | |
475 | ), | |
476 | ||
477 | TP_ARGS(xdr, offset, copied), | |
478 | ||
479 | TP_STRUCT__entry( | |
480 | __field(unsigned int, task_id) | |
481 | __field(unsigned int, client_id) | |
482 | __field(int, version) | |
483 | __field(size_t, offset) | |
484 | __field(unsigned int, copied) | |
485 | __field(const void *, head_base) | |
486 | __field(size_t, head_len) | |
487 | __field(const void *, tail_base) | |
488 | __field(size_t, tail_len) | |
489 | __field(unsigned int, page_len) | |
490 | __field(unsigned int, len) | |
491 | __string(progname, | |
492 | xdr->rqst->rq_task->tk_client->cl_program->name) | |
493 | __string(procedure, | |
494 | xdr->rqst->rq_task->tk_msg.rpc_proc->p_name) | |
495 | ), | |
496 | ||
497 | TP_fast_assign( | |
498 | const struct rpc_task *task = xdr->rqst->rq_task; | |
499 | ||
500 | __entry->task_id = task->tk_pid; | |
501 | __entry->client_id = task->tk_client->cl_clid; | |
502 | __assign_str(progname, | |
503 | task->tk_client->cl_program->name) | |
504 | __entry->version = task->tk_client->cl_vers; | |
505 | __assign_str(procedure, task->tk_msg.rpc_proc->p_name) | |
506 | ||
507 | __entry->offset = offset; | |
508 | __entry->copied = copied; | |
509 | __entry->head_base = xdr->buf->head[0].iov_base, | |
510 | __entry->head_len = xdr->buf->head[0].iov_len, | |
511 | __entry->page_len = xdr->buf->page_len, | |
512 | __entry->tail_base = xdr->buf->tail[0].iov_base, | |
513 | __entry->tail_len = xdr->buf->tail[0].iov_len, | |
514 | __entry->len = xdr->buf->len; | |
515 | ), | |
516 | ||
517 | TP_printk( | |
518 | "task:%u@%u %sv%d %s offset=%zu copied=%u xdr=[%p,%zu]/%u/[%p,%zu]/%u\n", | |
519 | __entry->task_id, __entry->client_id, | |
520 | __get_str(progname), __entry->version, __get_str(procedure), | |
521 | __entry->offset, __entry->copied, | |
522 | __entry->head_base, __entry->head_len, | |
523 | __entry->page_len, | |
524 | __entry->tail_base, __entry->tail_len, | |
525 | __entry->len | |
526 | ) | |
527 | ); | |
528 | ||
cf500bac CL |
529 | TRACE_EVENT(rpc_reply_pages, |
530 | TP_PROTO( | |
531 | const struct rpc_rqst *req | |
532 | ), | |
533 | ||
534 | TP_ARGS(req), | |
535 | ||
536 | TP_STRUCT__entry( | |
537 | __field(unsigned int, task_id) | |
538 | __field(unsigned int, client_id) | |
539 | __field(const void *, head_base) | |
540 | __field(size_t, head_len) | |
541 | __field(const void *, tail_base) | |
542 | __field(size_t, tail_len) | |
543 | __field(unsigned int, page_len) | |
544 | ), | |
545 | ||
546 | TP_fast_assign( | |
547 | __entry->task_id = req->rq_task->tk_pid; | |
548 | __entry->client_id = req->rq_task->tk_client->cl_clid; | |
549 | ||
550 | __entry->head_base = req->rq_rcv_buf.head[0].iov_base; | |
551 | __entry->head_len = req->rq_rcv_buf.head[0].iov_len; | |
552 | __entry->page_len = req->rq_rcv_buf.page_len; | |
553 | __entry->tail_base = req->rq_rcv_buf.tail[0].iov_base; | |
554 | __entry->tail_len = req->rq_rcv_buf.tail[0].iov_len; | |
555 | ), | |
556 | ||
557 | TP_printk( | |
558 | "task:%u@%u xdr=[%p,%zu]/%u/[%p,%zu]\n", | |
559 | __entry->task_id, __entry->client_id, | |
560 | __entry->head_base, __entry->head_len, | |
561 | __entry->page_len, | |
562 | __entry->tail_base, __entry->tail_len | |
563 | ) | |
564 | ); | |
565 | ||
6ba16eef SRRH |
566 | /* |
567 | * First define the enums in the below macros to be exported to userspace | |
568 | * via TRACE_DEFINE_ENUM(). | |
569 | */ | |
570 | #undef EM | |
571 | #undef EMe | |
572 | #define EM(a, b) TRACE_DEFINE_ENUM(a); | |
573 | #define EMe(a, b) TRACE_DEFINE_ENUM(a); | |
574 | ||
575 | #define RPC_SHOW_SOCKET \ | |
576 | EM( SS_FREE, "FREE" ) \ | |
577 | EM( SS_UNCONNECTED, "UNCONNECTED" ) \ | |
578 | EM( SS_CONNECTING, "CONNECTING," ) \ | |
579 | EM( SS_CONNECTED, "CONNECTED," ) \ | |
580 | EMe(SS_DISCONNECTING, "DISCONNECTING" ) | |
581 | ||
40b5ea0c | 582 | #define rpc_show_socket_state(state) \ |
6ba16eef SRRH |
583 | __print_symbolic(state, RPC_SHOW_SOCKET) |
584 | ||
585 | RPC_SHOW_SOCKET | |
586 | ||
587 | #define RPC_SHOW_SOCK \ | |
588 | EM( TCP_ESTABLISHED, "ESTABLISHED" ) \ | |
589 | EM( TCP_SYN_SENT, "SYN_SENT" ) \ | |
590 | EM( TCP_SYN_RECV, "SYN_RECV" ) \ | |
591 | EM( TCP_FIN_WAIT1, "FIN_WAIT1" ) \ | |
592 | EM( TCP_FIN_WAIT2, "FIN_WAIT2" ) \ | |
593 | EM( TCP_TIME_WAIT, "TIME_WAIT" ) \ | |
594 | EM( TCP_CLOSE, "CLOSE" ) \ | |
595 | EM( TCP_CLOSE_WAIT, "CLOSE_WAIT" ) \ | |
596 | EM( TCP_LAST_ACK, "LAST_ACK" ) \ | |
597 | EM( TCP_LISTEN, "LISTEN" ) \ | |
598 | EMe( TCP_CLOSING, "CLOSING" ) | |
40b5ea0c TM |
599 | |
600 | #define rpc_show_sock_state(state) \ | |
6ba16eef SRRH |
601 | __print_symbolic(state, RPC_SHOW_SOCK) |
602 | ||
603 | RPC_SHOW_SOCK | |
604 | ||
605 | /* | |
606 | * Now redefine the EM() and EMe() macros to map the enums to the strings | |
607 | * that will be printed in the output. | |
608 | */ | |
609 | #undef EM | |
610 | #undef EMe | |
611 | #define EM(a, b) {a, b}, | |
612 | #define EMe(a, b) {a, b} | |
40b5ea0c TM |
613 | |
614 | DECLARE_EVENT_CLASS(xs_socket_event, | |
615 | ||
616 | TP_PROTO( | |
617 | struct rpc_xprt *xprt, | |
618 | struct socket *socket | |
619 | ), | |
620 | ||
621 | TP_ARGS(xprt, socket), | |
622 | ||
623 | TP_STRUCT__entry( | |
624 | __field(unsigned int, socket_state) | |
625 | __field(unsigned int, sock_state) | |
626 | __field(unsigned long long, ino) | |
627 | __string(dstaddr, | |
628 | xprt->address_strings[RPC_DISPLAY_ADDR]) | |
629 | __string(dstport, | |
630 | xprt->address_strings[RPC_DISPLAY_PORT]) | |
631 | ), | |
632 | ||
633 | TP_fast_assign( | |
634 | struct inode *inode = SOCK_INODE(socket); | |
635 | __entry->socket_state = socket->state; | |
636 | __entry->sock_state = socket->sk->sk_state; | |
637 | __entry->ino = (unsigned long long)inode->i_ino; | |
638 | __assign_str(dstaddr, | |
639 | xprt->address_strings[RPC_DISPLAY_ADDR]); | |
640 | __assign_str(dstport, | |
641 | xprt->address_strings[RPC_DISPLAY_PORT]); | |
642 | ), | |
643 | ||
644 | TP_printk( | |
645 | "socket:[%llu] dstaddr=%s/%s " | |
646 | "state=%u (%s) sk_state=%u (%s)", | |
647 | __entry->ino, __get_str(dstaddr), __get_str(dstport), | |
648 | __entry->socket_state, | |
649 | rpc_show_socket_state(__entry->socket_state), | |
650 | __entry->sock_state, | |
651 | rpc_show_sock_state(__entry->sock_state) | |
652 | ) | |
653 | ); | |
654 | #define DEFINE_RPC_SOCKET_EVENT(name) \ | |
655 | DEFINE_EVENT(xs_socket_event, name, \ | |
656 | TP_PROTO( \ | |
657 | struct rpc_xprt *xprt, \ | |
658 | struct socket *socket \ | |
659 | ), \ | |
660 | TP_ARGS(xprt, socket)) | |
661 | ||
662 | DECLARE_EVENT_CLASS(xs_socket_event_done, | |
663 | ||
664 | TP_PROTO( | |
665 | struct rpc_xprt *xprt, | |
666 | struct socket *socket, | |
667 | int error | |
668 | ), | |
669 | ||
670 | TP_ARGS(xprt, socket, error), | |
671 | ||
672 | TP_STRUCT__entry( | |
673 | __field(int, error) | |
674 | __field(unsigned int, socket_state) | |
675 | __field(unsigned int, sock_state) | |
676 | __field(unsigned long long, ino) | |
677 | __string(dstaddr, | |
678 | xprt->address_strings[RPC_DISPLAY_ADDR]) | |
679 | __string(dstport, | |
680 | xprt->address_strings[RPC_DISPLAY_PORT]) | |
681 | ), | |
682 | ||
683 | TP_fast_assign( | |
684 | struct inode *inode = SOCK_INODE(socket); | |
685 | __entry->socket_state = socket->state; | |
686 | __entry->sock_state = socket->sk->sk_state; | |
687 | __entry->ino = (unsigned long long)inode->i_ino; | |
688 | __entry->error = error; | |
689 | __assign_str(dstaddr, | |
690 | xprt->address_strings[RPC_DISPLAY_ADDR]); | |
691 | __assign_str(dstport, | |
692 | xprt->address_strings[RPC_DISPLAY_PORT]); | |
693 | ), | |
694 | ||
695 | TP_printk( | |
696 | "error=%d socket:[%llu] dstaddr=%s/%s " | |
697 | "state=%u (%s) sk_state=%u (%s)", | |
698 | __entry->error, | |
699 | __entry->ino, __get_str(dstaddr), __get_str(dstport), | |
700 | __entry->socket_state, | |
701 | rpc_show_socket_state(__entry->socket_state), | |
702 | __entry->sock_state, | |
703 | rpc_show_sock_state(__entry->sock_state) | |
704 | ) | |
705 | ); | |
706 | #define DEFINE_RPC_SOCKET_EVENT_DONE(name) \ | |
707 | DEFINE_EVENT(xs_socket_event_done, name, \ | |
708 | TP_PROTO( \ | |
709 | struct rpc_xprt *xprt, \ | |
710 | struct socket *socket, \ | |
711 | int error \ | |
712 | ), \ | |
713 | TP_ARGS(xprt, socket, error)) | |
714 | ||
715 | DEFINE_RPC_SOCKET_EVENT(rpc_socket_state_change); | |
716 | DEFINE_RPC_SOCKET_EVENT_DONE(rpc_socket_connect); | |
e8353c76 | 717 | DEFINE_RPC_SOCKET_EVENT_DONE(rpc_socket_error); |
40b5ea0c TM |
718 | DEFINE_RPC_SOCKET_EVENT_DONE(rpc_socket_reset_connection); |
719 | DEFINE_RPC_SOCKET_EVENT(rpc_socket_close); | |
720 | DEFINE_RPC_SOCKET_EVENT(rpc_socket_shutdown); | |
721 | ||
3705ad64 | 722 | DECLARE_EVENT_CLASS(rpc_xprt_event, |
dc5820bd CL |
723 | TP_PROTO( |
724 | const struct rpc_xprt *xprt, | |
725 | __be32 xid, | |
726 | int status | |
727 | ), | |
3705ad64 JL |
728 | |
729 | TP_ARGS(xprt, xid, status), | |
730 | ||
731 | TP_STRUCT__entry( | |
a30ccf1a | 732 | __field(u32, xid) |
3705ad64 JL |
733 | __field(int, status) |
734 | __string(addr, xprt->address_strings[RPC_DISPLAY_ADDR]) | |
735 | __string(port, xprt->address_strings[RPC_DISPLAY_PORT]) | |
736 | ), | |
737 | ||
738 | TP_fast_assign( | |
a30ccf1a | 739 | __entry->xid = be32_to_cpu(xid); |
3705ad64 JL |
740 | __entry->status = status; |
741 | __assign_str(addr, xprt->address_strings[RPC_DISPLAY_ADDR]); | |
742 | __assign_str(port, xprt->address_strings[RPC_DISPLAY_PORT]); | |
743 | ), | |
744 | ||
a30ccf1a CL |
745 | TP_printk("peer=[%s]:%s xid=0x%08x status=%d", __get_str(addr), |
746 | __get_str(port), __entry->xid, | |
3705ad64 JL |
747 | __entry->status) |
748 | ); | |
dc5820bd CL |
749 | #define DEFINE_RPC_XPRT_EVENT(name) \ |
750 | DEFINE_EVENT(rpc_xprt_event, xprt_##name, \ | |
751 | TP_PROTO( \ | |
752 | const struct rpc_xprt *xprt, \ | |
753 | __be32 xid, \ | |
754 | int status \ | |
755 | ), \ | |
756 | TP_ARGS(xprt, xid, status)) | |
3705ad64 | 757 | |
dc5820bd CL |
758 | DEFINE_RPC_XPRT_EVENT(timer); |
759 | DEFINE_RPC_XPRT_EVENT(lookup_rqst); | |
dc5820bd | 760 | DEFINE_RPC_XPRT_EVENT(complete_rqst); |
3705ad64 | 761 | |
0c77668d CL |
762 | TRACE_EVENT(xprt_transmit, |
763 | TP_PROTO( | |
764 | const struct rpc_rqst *rqst, | |
765 | int status | |
766 | ), | |
767 | ||
768 | TP_ARGS(rqst, status), | |
769 | ||
770 | TP_STRUCT__entry( | |
771 | __field(unsigned int, task_id) | |
772 | __field(unsigned int, client_id) | |
773 | __field(u32, xid) | |
774 | __field(u32, seqno) | |
775 | __field(int, status) | |
776 | ), | |
777 | ||
778 | TP_fast_assign( | |
779 | __entry->task_id = rqst->rq_task->tk_pid; | |
f87b543a OK |
780 | __entry->client_id = rqst->rq_task->tk_client ? |
781 | rqst->rq_task->tk_client->cl_clid : -1; | |
0c77668d CL |
782 | __entry->xid = be32_to_cpu(rqst->rq_xid); |
783 | __entry->seqno = rqst->rq_seqno; | |
784 | __entry->status = status; | |
785 | ), | |
786 | ||
787 | TP_printk( | |
788 | "task:%u@%u xid=0x%08x seqno=%u status=%d", | |
789 | __entry->task_id, __entry->client_id, __entry->xid, | |
790 | __entry->seqno, __entry->status) | |
791 | ); | |
792 | ||
793 | TRACE_EVENT(xprt_enq_xmit, | |
794 | TP_PROTO( | |
795 | const struct rpc_task *task, | |
796 | int stage | |
797 | ), | |
798 | ||
799 | TP_ARGS(task, stage), | |
800 | ||
801 | TP_STRUCT__entry( | |
802 | __field(unsigned int, task_id) | |
803 | __field(unsigned int, client_id) | |
804 | __field(u32, xid) | |
805 | __field(u32, seqno) | |
806 | __field(int, stage) | |
807 | ), | |
808 | ||
809 | TP_fast_assign( | |
810 | __entry->task_id = task->tk_pid; | |
f87b543a OK |
811 | __entry->client_id = task->tk_client ? |
812 | task->tk_client->cl_clid : -1; | |
0c77668d CL |
813 | __entry->xid = be32_to_cpu(task->tk_rqstp->rq_xid); |
814 | __entry->seqno = task->tk_rqstp->rq_seqno; | |
815 | __entry->stage = stage; | |
816 | ), | |
817 | ||
818 | TP_printk( | |
819 | "task:%u@%u xid=0x%08x seqno=%u stage=%d", | |
820 | __entry->task_id, __entry->client_id, __entry->xid, | |
821 | __entry->seqno, __entry->stage) | |
822 | ); | |
823 | ||
a25a4cb3 CL |
824 | TRACE_EVENT(xprt_ping, |
825 | TP_PROTO(const struct rpc_xprt *xprt, int status), | |
826 | ||
827 | TP_ARGS(xprt, status), | |
828 | ||
829 | TP_STRUCT__entry( | |
830 | __field(int, status) | |
831 | __string(addr, xprt->address_strings[RPC_DISPLAY_ADDR]) | |
832 | __string(port, xprt->address_strings[RPC_DISPLAY_PORT]) | |
833 | ), | |
834 | ||
835 | TP_fast_assign( | |
836 | __entry->status = status; | |
837 | __assign_str(addr, xprt->address_strings[RPC_DISPLAY_ADDR]); | |
838 | __assign_str(port, xprt->address_strings[RPC_DISPLAY_PORT]); | |
839 | ), | |
840 | ||
841 | TP_printk("peer=[%s]:%s status=%d", | |
842 | __get_str(addr), __get_str(port), __entry->status) | |
843 | ); | |
844 | ||
bf7ca707 CL |
845 | DECLARE_EVENT_CLASS(xprt_writelock_event, |
846 | TP_PROTO( | |
847 | const struct rpc_xprt *xprt, const struct rpc_task *task | |
848 | ), | |
849 | ||
850 | TP_ARGS(xprt, task), | |
851 | ||
852 | TP_STRUCT__entry( | |
853 | __field(unsigned int, task_id) | |
854 | __field(unsigned int, client_id) | |
855 | __field(unsigned int, snd_task_id) | |
856 | ), | |
857 | ||
858 | TP_fast_assign( | |
859 | if (task) { | |
860 | __entry->task_id = task->tk_pid; | |
861 | __entry->client_id = task->tk_client ? | |
862 | task->tk_client->cl_clid : -1; | |
863 | } else { | |
864 | __entry->task_id = -1; | |
865 | __entry->client_id = -1; | |
866 | } | |
867 | __entry->snd_task_id = xprt->snd_task ? | |
868 | xprt->snd_task->tk_pid : -1; | |
869 | ), | |
870 | ||
871 | TP_printk("task:%u@%u snd_task:%u", | |
872 | __entry->task_id, __entry->client_id, | |
873 | __entry->snd_task_id) | |
874 | ); | |
875 | ||
876 | #define DEFINE_WRITELOCK_EVENT(name) \ | |
877 | DEFINE_EVENT(xprt_writelock_event, xprt_##name, \ | |
878 | TP_PROTO( \ | |
879 | const struct rpc_xprt *xprt, \ | |
880 | const struct rpc_task *task \ | |
881 | ), \ | |
882 | TP_ARGS(xprt, task)) | |
883 | ||
884 | DEFINE_WRITELOCK_EVENT(reserve_xprt); | |
885 | DEFINE_WRITELOCK_EVENT(release_xprt); | |
886 | ||
887 | DECLARE_EVENT_CLASS(xprt_cong_event, | |
888 | TP_PROTO( | |
889 | const struct rpc_xprt *xprt, const struct rpc_task *task | |
890 | ), | |
891 | ||
892 | TP_ARGS(xprt, task), | |
893 | ||
894 | TP_STRUCT__entry( | |
895 | __field(unsigned int, task_id) | |
896 | __field(unsigned int, client_id) | |
897 | __field(unsigned int, snd_task_id) | |
898 | __field(unsigned long, cong) | |
899 | __field(unsigned long, cwnd) | |
900 | __field(bool, wait) | |
901 | ), | |
902 | ||
903 | TP_fast_assign( | |
904 | if (task) { | |
905 | __entry->task_id = task->tk_pid; | |
906 | __entry->client_id = task->tk_client ? | |
907 | task->tk_client->cl_clid : -1; | |
908 | } else { | |
909 | __entry->task_id = -1; | |
910 | __entry->client_id = -1; | |
911 | } | |
912 | __entry->snd_task_id = xprt->snd_task ? | |
913 | xprt->snd_task->tk_pid : -1; | |
914 | __entry->cong = xprt->cong; | |
915 | __entry->cwnd = xprt->cwnd; | |
916 | __entry->wait = test_bit(XPRT_CWND_WAIT, &xprt->state); | |
917 | ), | |
918 | ||
919 | TP_printk("task:%u@%u snd_task:%u cong=%lu cwnd=%lu%s", | |
920 | __entry->task_id, __entry->client_id, | |
921 | __entry->snd_task_id, __entry->cong, __entry->cwnd, | |
922 | __entry->wait ? " (wait)" : "") | |
923 | ); | |
924 | ||
925 | #define DEFINE_CONG_EVENT(name) \ | |
926 | DEFINE_EVENT(xprt_cong_event, xprt_##name, \ | |
927 | TP_PROTO( \ | |
928 | const struct rpc_xprt *xprt, \ | |
929 | const struct rpc_task *task \ | |
930 | ), \ | |
931 | TP_ARGS(xprt, task)) | |
932 | ||
933 | DEFINE_CONG_EVENT(reserve_cong); | |
934 | DEFINE_CONG_EVENT(release_cong); | |
935 | DEFINE_CONG_EVENT(get_cong); | |
936 | DEFINE_CONG_EVENT(put_cong); | |
937 | ||
c50b8ee0 TM |
938 | TRACE_EVENT(xs_stream_read_data, |
939 | TP_PROTO(struct rpc_xprt *xprt, ssize_t err, size_t total), | |
3705ad64 JL |
940 | |
941 | TP_ARGS(xprt, err, total), | |
942 | ||
943 | TP_STRUCT__entry( | |
c50b8ee0 TM |
944 | __field(ssize_t, err) |
945 | __field(size_t, total) | |
3705ad64 JL |
946 | __string(addr, xprt ? xprt->address_strings[RPC_DISPLAY_ADDR] : |
947 | "(null)") | |
948 | __string(port, xprt ? xprt->address_strings[RPC_DISPLAY_PORT] : | |
949 | "(null)") | |
950 | ), | |
951 | ||
952 | TP_fast_assign( | |
953 | __entry->err = err; | |
954 | __entry->total = total; | |
955 | __assign_str(addr, xprt ? | |
956 | xprt->address_strings[RPC_DISPLAY_ADDR] : "(null)"); | |
957 | __assign_str(port, xprt ? | |
958 | xprt->address_strings[RPC_DISPLAY_PORT] : "(null)"); | |
959 | ), | |
960 | ||
c50b8ee0 | 961 | TP_printk("peer=[%s]:%s err=%zd total=%zu", __get_str(addr), |
3705ad64 JL |
962 | __get_str(port), __entry->err, __entry->total) |
963 | ); | |
964 | ||
c50b8ee0 | 965 | TRACE_EVENT(xs_stream_read_request, |
1a867a08 JL |
966 | TP_PROTO(struct sock_xprt *xs), |
967 | ||
968 | TP_ARGS(xs), | |
969 | ||
970 | TP_STRUCT__entry( | |
971 | __string(addr, xs->xprt.address_strings[RPC_DISPLAY_ADDR]) | |
972 | __string(port, xs->xprt.address_strings[RPC_DISPLAY_PORT]) | |
a30ccf1a | 973 | __field(u32, xid) |
1a867a08 JL |
974 | __field(unsigned long, copied) |
975 | __field(unsigned int, reclen) | |
c50b8ee0 | 976 | __field(unsigned int, offset) |
1a867a08 JL |
977 | ), |
978 | ||
979 | TP_fast_assign( | |
980 | __assign_str(addr, xs->xprt.address_strings[RPC_DISPLAY_ADDR]); | |
981 | __assign_str(port, xs->xprt.address_strings[RPC_DISPLAY_PORT]); | |
d1109aa5 | 982 | __entry->xid = be32_to_cpu(xs->recv.xid); |
d1109aa5 TM |
983 | __entry->copied = xs->recv.copied; |
984 | __entry->reclen = xs->recv.len; | |
985 | __entry->offset = xs->recv.offset; | |
1a867a08 JL |
986 | ), |
987 | ||
c50b8ee0 | 988 | TP_printk("peer=[%s]:%s xid=0x%08x copied=%lu reclen=%u offset=%u", |
a30ccf1a | 989 | __get_str(addr), __get_str(port), __entry->xid, |
1a867a08 JL |
990 | __entry->copied, __entry->reclen, __entry->offset) |
991 | ); | |
992 | ||
30660e04 JL |
993 | #define show_rqstp_flags(flags) \ |
994 | __print_flags(flags, "|", \ | |
995 | { (1UL << RQ_SECURE), "RQ_SECURE"}, \ | |
996 | { (1UL << RQ_LOCAL), "RQ_LOCAL"}, \ | |
78b65eb3 | 997 | { (1UL << RQ_USEDEFERRAL), "RQ_USEDEFERRAL"}, \ |
779fb0f3 | 998 | { (1UL << RQ_DROPME), "RQ_DROPME"}, \ |
81244386 | 999 | { (1UL << RQ_SPLICE_OK), "RQ_SPLICE_OK"}, \ |
b1691bc0 JL |
1000 | { (1UL << RQ_VICTIM), "RQ_VICTIM"}, \ |
1001 | { (1UL << RQ_BUSY), "RQ_BUSY"}) | |
4d152e2c | 1002 | |
860a0d9e | 1003 | TRACE_EVENT(svc_recv, |
41f306d0 | 1004 | TP_PROTO(struct svc_rqst *rqst, int len), |
860a0d9e | 1005 | |
41f306d0 | 1006 | TP_ARGS(rqst, len), |
860a0d9e JL |
1007 | |
1008 | TP_STRUCT__entry( | |
a30ccf1a | 1009 | __field(u32, xid) |
41f306d0 | 1010 | __field(int, len) |
4d152e2c | 1011 | __field(unsigned long, flags) |
ece200dd | 1012 | __string(addr, rqst->rq_xprt->xpt_remotebuf) |
860a0d9e JL |
1013 | ), |
1014 | ||
1015 | TP_fast_assign( | |
41f306d0 CL |
1016 | __entry->xid = be32_to_cpu(rqst->rq_xid); |
1017 | __entry->len = len; | |
4d152e2c | 1018 | __entry->flags = rqst->rq_flags; |
ece200dd | 1019 | __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); |
860a0d9e JL |
1020 | ), |
1021 | ||
ece200dd CL |
1022 | TP_printk("addr=%s xid=0x%08x len=%d flags=%s", |
1023 | __get_str(addr), __entry->xid, __entry->len, | |
4d152e2c | 1024 | show_rqstp_flags(__entry->flags)) |
860a0d9e JL |
1025 | ); |
1026 | ||
ff27e9f7 CL |
1027 | #define svc_show_status(status) \ |
1028 | __print_symbolic(status, \ | |
1029 | { SVC_GARBAGE, "SVC_GARBAGE" }, \ | |
1030 | { SVC_SYSERR, "SVC_SYSERR" }, \ | |
1031 | { SVC_VALID, "SVC_VALID" }, \ | |
1032 | { SVC_NEGATIVE, "SVC_NEGATIVE" }, \ | |
1033 | { SVC_OK, "SVC_OK" }, \ | |
1034 | { SVC_DROP, "SVC_DROP" }, \ | |
1035 | { SVC_CLOSE, "SVC_CLOSE" }, \ | |
1036 | { SVC_DENIED, "SVC_DENIED" }, \ | |
1037 | { SVC_PENDING, "SVC_PENDING" }, \ | |
1038 | { SVC_COMPLETE, "SVC_COMPLETE" }) | |
1039 | ||
1040 | TRACE_EVENT(svc_authenticate, | |
1041 | TP_PROTO(const struct svc_rqst *rqst, int auth_res, __be32 auth_stat), | |
1042 | ||
1043 | TP_ARGS(rqst, auth_res, auth_stat), | |
1044 | ||
1045 | TP_STRUCT__entry( | |
1046 | __field(u32, xid) | |
1047 | __field(unsigned long, svc_status) | |
1048 | __field(unsigned long, auth_stat) | |
1049 | ), | |
1050 | ||
1051 | TP_fast_assign( | |
1052 | __entry->xid = be32_to_cpu(rqst->rq_xid); | |
1053 | __entry->svc_status = auth_res; | |
1054 | __entry->auth_stat = be32_to_cpu(auth_stat); | |
1055 | ), | |
1056 | ||
1057 | TP_printk("xid=0x%08x auth_res=%s auth_stat=%s", | |
1058 | __entry->xid, svc_show_status(__entry->svc_status), | |
1059 | rpc_show_auth_stat(__entry->auth_stat)) | |
1060 | ); | |
1061 | ||
0b9547bf CL |
1062 | TRACE_EVENT(svc_process, |
1063 | TP_PROTO(const struct svc_rqst *rqst, const char *name), | |
1064 | ||
1065 | TP_ARGS(rqst, name), | |
1066 | ||
1067 | TP_STRUCT__entry( | |
1068 | __field(u32, xid) | |
1069 | __field(u32, vers) | |
1070 | __field(u32, proc) | |
1071 | __string(service, name) | |
d4b09acf VA |
1072 | __string(addr, rqst->rq_xprt ? |
1073 | rqst->rq_xprt->xpt_remotebuf : "(null)") | |
0b9547bf CL |
1074 | ), |
1075 | ||
1076 | TP_fast_assign( | |
1077 | __entry->xid = be32_to_cpu(rqst->rq_xid); | |
1078 | __entry->vers = rqst->rq_vers; | |
1079 | __entry->proc = rqst->rq_proc; | |
1080 | __assign_str(service, name); | |
d4b09acf VA |
1081 | __assign_str(addr, rqst->rq_xprt ? |
1082 | rqst->rq_xprt->xpt_remotebuf : "(null)"); | |
0b9547bf CL |
1083 | ), |
1084 | ||
1085 | TP_printk("addr=%s xid=0x%08x service=%s vers=%u proc=%u", | |
1086 | __get_str(addr), __entry->xid, | |
1087 | __get_str(service), __entry->vers, __entry->proc) | |
1088 | ); | |
1089 | ||
104f6351 TM |
1090 | DECLARE_EVENT_CLASS(svc_rqst_event, |
1091 | ||
dc5820bd CL |
1092 | TP_PROTO( |
1093 | const struct svc_rqst *rqst | |
1094 | ), | |
104f6351 TM |
1095 | |
1096 | TP_ARGS(rqst), | |
1097 | ||
1098 | TP_STRUCT__entry( | |
a30ccf1a | 1099 | __field(u32, xid) |
104f6351 | 1100 | __field(unsigned long, flags) |
ece200dd | 1101 | __string(addr, rqst->rq_xprt->xpt_remotebuf) |
104f6351 TM |
1102 | ), |
1103 | ||
1104 | TP_fast_assign( | |
a30ccf1a | 1105 | __entry->xid = be32_to_cpu(rqst->rq_xid); |
104f6351 | 1106 | __entry->flags = rqst->rq_flags; |
ece200dd | 1107 | __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); |
104f6351 TM |
1108 | ), |
1109 | ||
ece200dd CL |
1110 | TP_printk("addr=%s xid=0x%08x flags=%s", |
1111 | __get_str(addr), __entry->xid, | |
1112 | show_rqstp_flags(__entry->flags)) | |
104f6351 | 1113 | ); |
dc5820bd CL |
1114 | #define DEFINE_SVC_RQST_EVENT(name) \ |
1115 | DEFINE_EVENT(svc_rqst_event, svc_##name, \ | |
1116 | TP_PROTO( \ | |
1117 | const struct svc_rqst *rqst \ | |
1118 | ), \ | |
1119 | TP_ARGS(rqst)) | |
104f6351 | 1120 | |
dc5820bd CL |
1121 | DEFINE_SVC_RQST_EVENT(defer); |
1122 | DEFINE_SVC_RQST_EVENT(drop); | |
104f6351 | 1123 | |
860a0d9e JL |
1124 | DECLARE_EVENT_CLASS(svc_rqst_status, |
1125 | ||
1126 | TP_PROTO(struct svc_rqst *rqst, int status), | |
1127 | ||
1128 | TP_ARGS(rqst, status), | |
1129 | ||
1130 | TP_STRUCT__entry( | |
a30ccf1a | 1131 | __field(u32, xid) |
860a0d9e | 1132 | __field(int, status) |
4d152e2c | 1133 | __field(unsigned long, flags) |
ece200dd | 1134 | __string(addr, rqst->rq_xprt->xpt_remotebuf) |
860a0d9e JL |
1135 | ), |
1136 | ||
1137 | TP_fast_assign( | |
a30ccf1a | 1138 | __entry->xid = be32_to_cpu(rqst->rq_xid); |
860a0d9e | 1139 | __entry->status = status; |
4d152e2c | 1140 | __entry->flags = rqst->rq_flags; |
ece200dd | 1141 | __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); |
860a0d9e JL |
1142 | ), |
1143 | ||
ece200dd CL |
1144 | TP_printk("addr=%s xid=0x%08x status=%d flags=%s", |
1145 | __get_str(addr), __entry->xid, | |
1146 | __entry->status, show_rqstp_flags(__entry->flags)) | |
860a0d9e JL |
1147 | ); |
1148 | ||
860a0d9e JL |
1149 | DEFINE_EVENT(svc_rqst_status, svc_send, |
1150 | TP_PROTO(struct svc_rqst *rqst, int status), | |
1151 | TP_ARGS(rqst, status)); | |
1152 | ||
83a712e0 JL |
1153 | #define show_svc_xprt_flags(flags) \ |
1154 | __print_flags(flags, "|", \ | |
1155 | { (1UL << XPT_BUSY), "XPT_BUSY"}, \ | |
1156 | { (1UL << XPT_CONN), "XPT_CONN"}, \ | |
1157 | { (1UL << XPT_CLOSE), "XPT_CLOSE"}, \ | |
1158 | { (1UL << XPT_DATA), "XPT_DATA"}, \ | |
1159 | { (1UL << XPT_TEMP), "XPT_TEMP"}, \ | |
1160 | { (1UL << XPT_DEAD), "XPT_DEAD"}, \ | |
1161 | { (1UL << XPT_CHNGBUF), "XPT_CHNGBUF"}, \ | |
1162 | { (1UL << XPT_DEFERRED), "XPT_DEFERRED"}, \ | |
1163 | { (1UL << XPT_OLD), "XPT_OLD"}, \ | |
1164 | { (1UL << XPT_LISTENER), "XPT_LISTENER"}, \ | |
1165 | { (1UL << XPT_CACHE_AUTH), "XPT_CACHE_AUTH"}, \ | |
03edb90f CL |
1166 | { (1UL << XPT_LOCAL), "XPT_LOCAL"}, \ |
1167 | { (1UL << XPT_KILL_TEMP), "XPT_KILL_TEMP"}, \ | |
1168 | { (1UL << XPT_CONG_CTRL), "XPT_CONG_CTRL"}) | |
83a712e0 | 1169 | |
4b8f380e CL |
1170 | TRACE_EVENT(svc_xprt_create_err, |
1171 | TP_PROTO( | |
1172 | const char *program, | |
1173 | const char *protocol, | |
1174 | struct sockaddr *sap, | |
1175 | const struct svc_xprt *xprt | |
1176 | ), | |
1177 | ||
1178 | TP_ARGS(program, protocol, sap, xprt), | |
1179 | ||
1180 | TP_STRUCT__entry( | |
1181 | __field(long, error) | |
1182 | __string(program, program) | |
1183 | __string(protocol, protocol) | |
1184 | __array(unsigned char, addr, sizeof(struct sockaddr_in6)) | |
1185 | ), | |
1186 | ||
1187 | TP_fast_assign( | |
1188 | __entry->error = PTR_ERR(xprt); | |
1189 | __assign_str(program, program); | |
1190 | __assign_str(protocol, protocol); | |
1191 | memcpy(__entry->addr, sap, sizeof(__entry->addr)); | |
1192 | ), | |
1193 | ||
1194 | TP_printk("addr=%pISpc program=%s protocol=%s error=%ld", | |
1195 | __entry->addr, __get_str(program), __get_str(protocol), | |
1196 | __entry->error) | |
1197 | ); | |
1198 | ||
83a712e0 JL |
1199 | TRACE_EVENT(svc_xprt_do_enqueue, |
1200 | TP_PROTO(struct svc_xprt *xprt, struct svc_rqst *rqst), | |
1201 | ||
1202 | TP_ARGS(xprt, rqst), | |
1203 | ||
1204 | TP_STRUCT__entry( | |
051ac384 PA |
1205 | __field(int, pid) |
1206 | __field(unsigned long, flags) | |
ece200dd | 1207 | __string(addr, xprt->xpt_remotebuf) |
83a712e0 JL |
1208 | ), |
1209 | ||
1210 | TP_fast_assign( | |
051ac384 | 1211 | __entry->pid = rqst? rqst->rq_task->pid : 0; |
ece200dd CL |
1212 | __entry->flags = xprt->xpt_flags; |
1213 | __assign_str(addr, xprt->xpt_remotebuf); | |
83a712e0 JL |
1214 | ), |
1215 | ||
e3e67621 CL |
1216 | TP_printk("addr=%s pid=%d flags=%s", __get_str(addr), |
1217 | __entry->pid, show_svc_xprt_flags(__entry->flags)) | |
83a712e0 JL |
1218 | ); |
1219 | ||
82ea2d76 | 1220 | DECLARE_EVENT_CLASS(svc_xprt_event, |
83a712e0 JL |
1221 | TP_PROTO(struct svc_xprt *xprt), |
1222 | ||
1223 | TP_ARGS(xprt), | |
1224 | ||
1225 | TP_STRUCT__entry( | |
83a712e0 | 1226 | __field(unsigned long, flags) |
ece200dd | 1227 | __string(addr, xprt->xpt_remotebuf) |
83a712e0 JL |
1228 | ), |
1229 | ||
1230 | TP_fast_assign( | |
caa3e106 | 1231 | __entry->flags = xprt->xpt_flags; |
ece200dd | 1232 | __assign_str(addr, xprt->xpt_remotebuf); |
83a712e0 JL |
1233 | ), |
1234 | ||
e3e67621 CL |
1235 | TP_printk("addr=%s flags=%s", __get_str(addr), |
1236 | show_svc_xprt_flags(__entry->flags)) | |
83a712e0 JL |
1237 | ); |
1238 | ||
82ea2d76 TM |
1239 | DEFINE_EVENT(svc_xprt_event, svc_xprt_no_write_space, |
1240 | TP_PROTO(struct svc_xprt *xprt), | |
1241 | TP_ARGS(xprt)); | |
1242 | ||
55f5088c CL |
1243 | TRACE_EVENT(svc_xprt_dequeue, |
1244 | TP_PROTO(struct svc_rqst *rqst), | |
1245 | ||
1246 | TP_ARGS(rqst), | |
1247 | ||
1248 | TP_STRUCT__entry( | |
55f5088c CL |
1249 | __field(unsigned long, flags) |
1250 | __field(unsigned long, wakeup) | |
1251 | __string(addr, rqst->rq_xprt->xpt_remotebuf) | |
1252 | ), | |
1253 | ||
1254 | TP_fast_assign( | |
55f5088c CL |
1255 | __entry->flags = rqst->rq_xprt->xpt_flags; |
1256 | __entry->wakeup = ktime_to_us(ktime_sub(ktime_get(), | |
1257 | rqst->rq_qtime)); | |
1258 | __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); | |
1259 | ), | |
1260 | ||
e3e67621 CL |
1261 | TP_printk("addr=%s flags=%s wakeup-us=%lu", __get_str(addr), |
1262 | show_svc_xprt_flags(__entry->flags), __entry->wakeup) | |
55f5088c CL |
1263 | ); |
1264 | ||
83a712e0 JL |
1265 | TRACE_EVENT(svc_wake_up, |
1266 | TP_PROTO(int pid), | |
1267 | ||
1268 | TP_ARGS(pid), | |
1269 | ||
1270 | TP_STRUCT__entry( | |
1271 | __field(int, pid) | |
1272 | ), | |
1273 | ||
1274 | TP_fast_assign( | |
1275 | __entry->pid = pid; | |
1276 | ), | |
1277 | ||
1278 | TP_printk("pid=%d", __entry->pid) | |
1279 | ); | |
1280 | ||
1281 | TRACE_EVENT(svc_handle_xprt, | |
1282 | TP_PROTO(struct svc_xprt *xprt, int len), | |
1283 | ||
1284 | TP_ARGS(xprt, len), | |
1285 | ||
1286 | TP_STRUCT__entry( | |
83a712e0 | 1287 | __field(int, len) |
051ac384 | 1288 | __field(unsigned long, flags) |
ece200dd | 1289 | __string(addr, xprt->xpt_remotebuf) |
83a712e0 JL |
1290 | ), |
1291 | ||
1292 | TP_fast_assign( | |
83a712e0 | 1293 | __entry->len = len; |
ece200dd CL |
1294 | __entry->flags = xprt->xpt_flags; |
1295 | __assign_str(addr, xprt->xpt_remotebuf); | |
83a712e0 JL |
1296 | ), |
1297 | ||
e3e67621 | 1298 | TP_printk("addr=%s len=%d flags=%s", __get_str(addr), |
051ac384 | 1299 | __entry->len, show_svc_xprt_flags(__entry->flags)) |
83a712e0 | 1300 | ); |
104f6351 | 1301 | |
aaba72cd CL |
1302 | TRACE_EVENT(svc_stats_latency, |
1303 | TP_PROTO(const struct svc_rqst *rqst), | |
1304 | ||
1305 | TP_ARGS(rqst), | |
1306 | ||
1307 | TP_STRUCT__entry( | |
1308 | __field(u32, xid) | |
1309 | __field(unsigned long, execute) | |
1310 | __string(addr, rqst->rq_xprt->xpt_remotebuf) | |
1311 | ), | |
1312 | ||
1313 | TP_fast_assign( | |
1314 | __entry->xid = be32_to_cpu(rqst->rq_xid); | |
1315 | __entry->execute = ktime_to_us(ktime_sub(ktime_get(), | |
1316 | rqst->rq_stime)); | |
1317 | __assign_str(addr, rqst->rq_xprt->xpt_remotebuf); | |
1318 | ), | |
1319 | ||
1320 | TP_printk("addr=%s xid=0x%08x execute-us=%lu", | |
1321 | __get_str(addr), __entry->xid, __entry->execute) | |
1322 | ); | |
104f6351 TM |
1323 | |
1324 | DECLARE_EVENT_CLASS(svc_deferred_event, | |
dc5820bd CL |
1325 | TP_PROTO( |
1326 | const struct svc_deferred_req *dr | |
1327 | ), | |
104f6351 TM |
1328 | |
1329 | TP_ARGS(dr), | |
1330 | ||
1331 | TP_STRUCT__entry( | |
a30ccf1a | 1332 | __field(u32, xid) |
ece200dd | 1333 | __string(addr, dr->xprt->xpt_remotebuf) |
104f6351 TM |
1334 | ), |
1335 | ||
1336 | TP_fast_assign( | |
a30ccf1a CL |
1337 | __entry->xid = be32_to_cpu(*(__be32 *)(dr->args + |
1338 | (dr->xprt_hlen>>2))); | |
ece200dd | 1339 | __assign_str(addr, dr->xprt->xpt_remotebuf); |
104f6351 TM |
1340 | ), |
1341 | ||
ece200dd | 1342 | TP_printk("addr=%s xid=0x%08x", __get_str(addr), __entry->xid) |
104f6351 | 1343 | ); |
dc5820bd CL |
1344 | #define DEFINE_SVC_DEFERRED_EVENT(name) \ |
1345 | DEFINE_EVENT(svc_deferred_event, svc_##name##_deferred, \ | |
1346 | TP_PROTO( \ | |
1347 | const struct svc_deferred_req *dr \ | |
1348 | ), \ | |
1349 | TP_ARGS(dr)) | |
1350 | ||
1351 | DEFINE_SVC_DEFERRED_EVENT(drop); | |
1352 | DEFINE_SVC_DEFERRED_EVENT(revisit); | |
104f6351 | 1353 | |
78a947f5 TM |
1354 | DECLARE_EVENT_CLASS(cache_event, |
1355 | TP_PROTO( | |
1356 | const struct cache_detail *cd, | |
1357 | const struct cache_head *h | |
1358 | ), | |
1359 | ||
1360 | TP_ARGS(cd, h), | |
1361 | ||
1362 | TP_STRUCT__entry( | |
1363 | __field(const struct cache_head *, h) | |
1364 | __string(name, cd->name) | |
1365 | ), | |
1366 | ||
1367 | TP_fast_assign( | |
1368 | __entry->h = h; | |
1369 | __assign_str(name, cd->name); | |
1370 | ), | |
1371 | ||
1372 | TP_printk("cache=%s entry=%p", __get_str(name), __entry->h) | |
1373 | ); | |
1374 | #define DEFINE_CACHE_EVENT(name) \ | |
1375 | DEFINE_EVENT(cache_event, name, \ | |
1376 | TP_PROTO( \ | |
1377 | const struct cache_detail *cd, \ | |
1378 | const struct cache_head *h \ | |
1379 | ), \ | |
1380 | TP_ARGS(cd, h)) | |
1381 | DEFINE_CACHE_EVENT(cache_entry_expired); | |
1382 | DEFINE_CACHE_EVENT(cache_entry_upcall); | |
1383 | DEFINE_CACHE_EVENT(cache_entry_update); | |
1384 | DEFINE_CACHE_EVENT(cache_entry_make_negative); | |
1385 | DEFINE_CACHE_EVENT(cache_entry_no_listener); | |
1386 | ||
82b0a4c3 TM |
1387 | #endif /* _TRACE_SUNRPC_H */ |
1388 | ||
1389 | #include <trace/define_trace.h> |