1/* SPDX-License-Identifier: GPL-2.0-or-later */
2/* Network filesystem support module tracepoints
3 *
4 * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
6 */
7#undef TRACE_SYSTEM
8#define TRACE_SYSTEM netfs
9
10#if !defined(_TRACE_NETFS_H) || defined(TRACE_HEADER_MULTI_READ)
11#define _TRACE_NETFS_H
12
13#include <linux/tracepoint.h>
14
15/*
16 * Define enums for tracing information.
17 */
18#define netfs_read_traces \
19 EM(netfs_read_trace_dio_read, "DIO-READ ") \
20 EM(netfs_read_trace_expanded, "EXPANDED ") \
21 EM(netfs_read_trace_readahead, "READAHEAD") \
22 EM(netfs_read_trace_readpage, "READPAGE ") \
23 EM(netfs_read_trace_prefetch_for_write, "PREFETCHW") \
24 E_(netfs_read_trace_write_begin, "WRITEBEGN")
25
26#define netfs_write_traces \
27 EM(netfs_write_trace_dio_write, "DIO-WRITE") \
28 EM(netfs_write_trace_launder, "LAUNDER ") \
29 EM(netfs_write_trace_unbuffered_write, "UNB-WRITE") \
30 EM(netfs_write_trace_writeback, "WRITEBACK") \
31 E_(netfs_write_trace_writethrough, "WRITETHRU")
32
33#define netfs_rreq_origins \
34 EM(NETFS_READAHEAD, "RA") \
35 EM(NETFS_READPAGE, "RP") \
36 EM(NETFS_READ_FOR_WRITE, "RW") \
37 EM(NETFS_WRITEBACK, "WB") \
38 EM(NETFS_WRITETHROUGH, "WT") \
39 EM(NETFS_LAUNDER_WRITE, "LW") \
40 EM(NETFS_UNBUFFERED_WRITE, "UW") \
41 EM(NETFS_DIO_READ, "DR") \
42 E_(NETFS_DIO_WRITE, "DW")
43
44#define netfs_rreq_traces \
45 EM(netfs_rreq_trace_assess, "ASSESS ") \
46 EM(netfs_rreq_trace_copy, "COPY ") \
47 EM(netfs_rreq_trace_done, "DONE ") \
48 EM(netfs_rreq_trace_free, "FREE ") \
49 EM(netfs_rreq_trace_redirty, "REDIRTY") \
50 EM(netfs_rreq_trace_resubmit, "RESUBMT") \
51 EM(netfs_rreq_trace_unlock, "UNLOCK ") \
52 EM(netfs_rreq_trace_unmark, "UNMARK ") \
53 EM(netfs_rreq_trace_wait_ip, "WAIT-IP") \
54 EM(netfs_rreq_trace_wake_ip, "WAKE-IP") \
55 E_(netfs_rreq_trace_write_done, "WR-DONE")
56
57#define netfs_sreq_sources \
58 EM(NETFS_FILL_WITH_ZEROES, "ZERO") \
59 EM(NETFS_DOWNLOAD_FROM_SERVER, "DOWN") \
60 EM(NETFS_READ_FROM_CACHE, "READ") \
61 EM(NETFS_INVALID_READ, "INVL") \
62 EM(NETFS_UPLOAD_TO_SERVER, "UPLD") \
63 EM(NETFS_WRITE_TO_CACHE, "WRIT") \
64 E_(NETFS_INVALID_WRITE, "INVL")
65
66#define netfs_sreq_traces \
67 EM(netfs_sreq_trace_download_instead, "RDOWN") \
68 EM(netfs_sreq_trace_free, "FREE ") \
69 EM(netfs_sreq_trace_limited, "LIMIT") \
70 EM(netfs_sreq_trace_prepare, "PREP ") \
71 EM(netfs_sreq_trace_resubmit_short, "SHORT") \
72 EM(netfs_sreq_trace_submit, "SUBMT") \
73 EM(netfs_sreq_trace_terminated, "TERM ") \
74 EM(netfs_sreq_trace_write, "WRITE") \
75 EM(netfs_sreq_trace_write_skip, "SKIP ") \
76 E_(netfs_sreq_trace_write_term, "WTERM")
77
78#define netfs_failures \
79 EM(netfs_fail_check_write_begin, "check-write-begin") \
80 EM(netfs_fail_copy_to_cache, "copy-to-cache") \
81 EM(netfs_fail_dio_read_short, "dio-read-short") \
82 EM(netfs_fail_dio_read_zero, "dio-read-zero") \
83 EM(netfs_fail_read, "read") \
84 EM(netfs_fail_short_read, "short-read") \
85 EM(netfs_fail_prepare_write, "prep-write") \
86 E_(netfs_fail_write, "write")
87
88#define netfs_rreq_ref_traces \
89 EM(netfs_rreq_trace_get_for_outstanding,"GET OUTSTND") \
90 EM(netfs_rreq_trace_get_subreq, "GET SUBREQ ") \
91 EM(netfs_rreq_trace_put_complete, "PUT COMPLT ") \
92 EM(netfs_rreq_trace_put_discard, "PUT DISCARD") \
93 EM(netfs_rreq_trace_put_failed, "PUT FAILED ") \
94 EM(netfs_rreq_trace_put_no_submit, "PUT NO-SUBM") \
95 EM(netfs_rreq_trace_put_return, "PUT RETURN ") \
96 EM(netfs_rreq_trace_put_subreq, "PUT SUBREQ ") \
97 EM(netfs_rreq_trace_put_work, "PUT WORK ") \
98 EM(netfs_rreq_trace_see_work, "SEE WORK ") \
99 E_(netfs_rreq_trace_new, "NEW ")
100
101#define netfs_sreq_ref_traces \
102 EM(netfs_sreq_trace_get_copy_to_cache, "GET COPY2C ") \
103 EM(netfs_sreq_trace_get_resubmit, "GET RESUBMIT") \
104 EM(netfs_sreq_trace_get_short_read, "GET SHORTRD") \
105 EM(netfs_sreq_trace_new, "NEW ") \
106 EM(netfs_sreq_trace_put_clear, "PUT CLEAR ") \
107 EM(netfs_sreq_trace_put_discard, "PUT DISCARD") \
108 EM(netfs_sreq_trace_put_failed, "PUT FAILED ") \
109 EM(netfs_sreq_trace_put_merged, "PUT MERGED ") \
110 EM(netfs_sreq_trace_put_no_copy, "PUT NO COPY") \
111 EM(netfs_sreq_trace_put_wip, "PUT WIP ") \
112 EM(netfs_sreq_trace_put_work, "PUT WORK ") \
113 E_(netfs_sreq_trace_put_terminated, "PUT TERM ")
114
115#define netfs_folio_traces \
116 /* The first few correspond to enum netfs_how_to_modify */ \
117 EM(netfs_folio_is_uptodate, "mod-uptodate") \
118 EM(netfs_just_prefetch, "mod-prefetch") \
119 EM(netfs_whole_folio_modify, "mod-whole-f") \
120 EM(netfs_modify_and_clear, "mod-n-clear") \
121 EM(netfs_streaming_write, "mod-streamw") \
122 EM(netfs_streaming_write_cont, "mod-streamw+") \
123 EM(netfs_flush_content, "flush") \
124 EM(netfs_streaming_filled_page, "mod-streamw-f") \
125 EM(netfs_streaming_cont_filled_page, "mod-streamw-f+") \
126 /* The rest are for writeback */ \
127 EM(netfs_folio_trace_clear, "clear") \
128 EM(netfs_folio_trace_clear_s, "clear-s") \
129 EM(netfs_folio_trace_clear_g, "clear-g") \
130 EM(netfs_folio_trace_copy_to_cache, "copy") \
131 EM(netfs_folio_trace_end_copy, "end-copy") \
132 EM(netfs_folio_trace_filled_gaps, "filled-gaps") \
133 EM(netfs_folio_trace_kill, "kill") \
134 EM(netfs_folio_trace_launder, "launder") \
135 EM(netfs_folio_trace_mkwrite, "mkwrite") \
136 EM(netfs_folio_trace_mkwrite_plus, "mkwrite+") \
137 EM(netfs_folio_trace_read_gaps, "read-gaps") \
138 EM(netfs_folio_trace_redirty, "redirty") \
139 EM(netfs_folio_trace_redirtied, "redirtied") \
140 EM(netfs_folio_trace_store, "store") \
141 EM(netfs_folio_trace_store_plus, "store+") \
142 EM(netfs_folio_trace_wthru, "wthru") \
143 E_(netfs_folio_trace_wthru_plus, "wthru+")
144
145#ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
146#define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
147
148#undef EM
149#undef E_
150#define EM(a, b) a,
151#define E_(a, b) a
152
153enum netfs_read_trace { netfs_read_traces } __mode(byte);
154enum netfs_write_trace { netfs_write_traces } __mode(byte);
155enum netfs_rreq_trace { netfs_rreq_traces } __mode(byte);
156enum netfs_sreq_trace { netfs_sreq_traces } __mode(byte);
157enum netfs_failure { netfs_failures } __mode(byte);
158enum netfs_rreq_ref_trace { netfs_rreq_ref_traces } __mode(byte);
159enum netfs_sreq_ref_trace { netfs_sreq_ref_traces } __mode(byte);
160enum netfs_folio_trace { netfs_folio_traces } __mode(byte);
161
162#endif
163
164/*
165 * Export enum symbols via userspace.
166 */
167#undef EM
168#undef E_
169#define EM(a, b) TRACE_DEFINE_ENUM(a);
170#define E_(a, b) TRACE_DEFINE_ENUM(a);
171
172netfs_read_traces;
173netfs_write_traces;
174netfs_rreq_origins;
175netfs_rreq_traces;
176netfs_sreq_sources;
177netfs_sreq_traces;
178netfs_failures;
179netfs_rreq_ref_traces;
180netfs_sreq_ref_traces;
181netfs_folio_traces;
182
183/*
184 * Now redefine the EM() and E_() macros to map the enums to the strings that
185 * will be printed in the output.
186 */
187#undef EM
188#undef E_
189#define EM(a, b) { a, b },
190#define E_(a, b) { a, b }
191
192TRACE_EVENT(netfs_read,
193 TP_PROTO(struct netfs_io_request *rreq,
194 loff_t start, size_t len,
195 enum netfs_read_trace what),
196
197 TP_ARGS(rreq, start, len, what),
198
199 TP_STRUCT__entry(
200 __field(unsigned int, rreq )
201 __field(unsigned int, cookie )
202 __field(loff_t, start )
203 __field(size_t, len )
204 __field(enum netfs_read_trace, what )
205 __field(unsigned int, netfs_inode )
206 ),
207
208 TP_fast_assign(
209 __entry->rreq = rreq->debug_id;
210 __entry->cookie = rreq->cache_resources.debug_id;
211 __entry->start = start;
212 __entry->len = len;
213 __entry->what = what;
214 __entry->netfs_inode = rreq->inode->i_ino;
215 ),
216
217 TP_printk("R=%08x %s c=%08x ni=%x s=%llx %zx",
218 __entry->rreq,
219 __print_symbolic(__entry->what, netfs_read_traces),
220 __entry->cookie,
221 __entry->netfs_inode,
222 __entry->start, __entry->len)
223 );
224
225TRACE_EVENT(netfs_rreq,
226 TP_PROTO(struct netfs_io_request *rreq,
227 enum netfs_rreq_trace what),
228
229 TP_ARGS(rreq, what),
230
231 TP_STRUCT__entry(
232 __field(unsigned int, rreq )
233 __field(unsigned int, flags )
234 __field(enum netfs_io_origin, origin )
235 __field(enum netfs_rreq_trace, what )
236 ),
237
238 TP_fast_assign(
239 __entry->rreq = rreq->debug_id;
240 __entry->flags = rreq->flags;
241 __entry->origin = rreq->origin;
242 __entry->what = what;
243 ),
244
245 TP_printk("R=%08x %s %s f=%02x",
246 __entry->rreq,
247 __print_symbolic(__entry->origin, netfs_rreq_origins),
248 __print_symbolic(__entry->what, netfs_rreq_traces),
249 __entry->flags)
250 );
251
252TRACE_EVENT(netfs_sreq,
253 TP_PROTO(struct netfs_io_subrequest *sreq,
254 enum netfs_sreq_trace what),
255
256 TP_ARGS(sreq, what),
257
258 TP_STRUCT__entry(
259 __field(unsigned int, rreq )
260 __field(unsigned short, index )
261 __field(short, error )
262 __field(unsigned short, flags )
263 __field(enum netfs_io_source, source )
264 __field(enum netfs_sreq_trace, what )
265 __field(size_t, len )
266 __field(size_t, transferred )
267 __field(loff_t, start )
268 ),
269
270 TP_fast_assign(
271 __entry->rreq = sreq->rreq->debug_id;
272 __entry->index = sreq->debug_index;
273 __entry->error = sreq->error;
274 __entry->flags = sreq->flags;
275 __entry->source = sreq->source;
276 __entry->what = what;
277 __entry->len = sreq->len;
278 __entry->transferred = sreq->transferred;
279 __entry->start = sreq->start;
280 ),
281
282 TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx/%zx e=%d",
283 __entry->rreq, __entry->index,
284 __print_symbolic(__entry->source, netfs_sreq_sources),
285 __print_symbolic(__entry->what, netfs_sreq_traces),
286 __entry->flags,
287 __entry->start, __entry->transferred, __entry->len,
288 __entry->error)
289 );
290
291TRACE_EVENT(netfs_failure,
292 TP_PROTO(struct netfs_io_request *rreq,
293 struct netfs_io_subrequest *sreq,
294 int error, enum netfs_failure what),
295
296 TP_ARGS(rreq, sreq, error, what),
297
298 TP_STRUCT__entry(
299 __field(unsigned int, rreq )
300 __field(short, index )
301 __field(short, error )
302 __field(unsigned short, flags )
303 __field(enum netfs_io_source, source )
304 __field(enum netfs_failure, what )
305 __field(size_t, len )
306 __field(size_t, transferred )
307 __field(loff_t, start )
308 ),
309
310 TP_fast_assign(
311 __entry->rreq = rreq->debug_id;
312 __entry->index = sreq ? sreq->debug_index : -1;
313 __entry->error = error;
314 __entry->flags = sreq ? sreq->flags : 0;
315 __entry->source = sreq ? sreq->source : NETFS_INVALID_READ;
316 __entry->what = what;
317 __entry->len = sreq ? sreq->len : rreq->len;
318 __entry->transferred = sreq ? sreq->transferred : 0;
319 __entry->start = sreq ? sreq->start : 0;
320 ),
321
322 TP_printk("R=%08x[%d] %s f=%02x s=%llx %zx/%zx %s e=%d",
323 __entry->rreq, __entry->index,
324 __print_symbolic(__entry->source, netfs_sreq_sources),
325 __entry->flags,
326 __entry->start, __entry->transferred, __entry->len,
327 __print_symbolic(__entry->what, netfs_failures),
328 __entry->error)
329 );
330
331TRACE_EVENT(netfs_rreq_ref,
332 TP_PROTO(unsigned int rreq_debug_id, int ref,
333 enum netfs_rreq_ref_trace what),
334
335 TP_ARGS(rreq_debug_id, ref, what),
336
337 TP_STRUCT__entry(
338 __field(unsigned int, rreq )
339 __field(int, ref )
340 __field(enum netfs_rreq_ref_trace, what )
341 ),
342
343 TP_fast_assign(
344 __entry->rreq = rreq_debug_id;
345 __entry->ref = ref;
346 __entry->what = what;
347 ),
348
349 TP_printk("R=%08x %s r=%u",
350 __entry->rreq,
351 __print_symbolic(__entry->what, netfs_rreq_ref_traces),
352 __entry->ref)
353 );
354
355TRACE_EVENT(netfs_sreq_ref,
356 TP_PROTO(unsigned int rreq_debug_id, unsigned int subreq_debug_index,
357 int ref, enum netfs_sreq_ref_trace what),
358
359 TP_ARGS(rreq_debug_id, subreq_debug_index, ref, what),
360
361 TP_STRUCT__entry(
362 __field(unsigned int, rreq )
363 __field(unsigned int, subreq )
364 __field(int, ref )
365 __field(enum netfs_sreq_ref_trace, what )
366 ),
367
368 TP_fast_assign(
369 __entry->rreq = rreq_debug_id;
370 __entry->subreq = subreq_debug_index;
371 __entry->ref = ref;
372 __entry->what = what;
373 ),
374
375 TP_printk("R=%08x[%x] %s r=%u",
376 __entry->rreq,
377 __entry->subreq,
378 __print_symbolic(__entry->what, netfs_sreq_ref_traces),
379 __entry->ref)
380 );
381
382TRACE_EVENT(netfs_folio,
383 TP_PROTO(struct folio *folio, enum netfs_folio_trace why),
384
385 TP_ARGS(folio, why),
386
387 TP_STRUCT__entry(
388 __field(ino_t, ino)
389 __field(pgoff_t, index)
390 __field(unsigned int, nr)
391 __field(enum netfs_folio_trace, why)
392 ),
393
394 TP_fast_assign(
395 __entry->ino = folio->mapping->host->i_ino;
396 __entry->why = why;
397 __entry->index = folio_index(folio);
398 __entry->nr = folio_nr_pages(folio);
399 ),
400
401 TP_printk("i=%05lx ix=%05lx-%05lx %s",
402 __entry->ino, __entry->index, __entry->index + __entry->nr - 1,
403 __print_symbolic(__entry->why, netfs_folio_traces))
404 );
405
406TRACE_EVENT(netfs_write_iter,
407 TP_PROTO(const struct kiocb *iocb, const struct iov_iter *from),
408
409 TP_ARGS(iocb, from),
410
411 TP_STRUCT__entry(
412 __field(unsigned long long, start )
413 __field(size_t, len )
414 __field(unsigned int, flags )
415 ),
416
417 TP_fast_assign(
418 __entry->start = iocb->ki_pos;
419 __entry->len = iov_iter_count(from);
420 __entry->flags = iocb->ki_flags;
421 ),
422
423 TP_printk("WRITE-ITER s=%llx l=%zx f=%x",
424 __entry->start, __entry->len, __entry->flags)
425 );
426
427TRACE_EVENT(netfs_write,
428 TP_PROTO(const struct netfs_io_request *wreq,
429 enum netfs_write_trace what),
430
431 TP_ARGS(wreq, what),
432
433 TP_STRUCT__entry(
434 __field(unsigned int, wreq )
435 __field(unsigned int, cookie )
436 __field(enum netfs_write_trace, what )
437 __field(unsigned long long, start )
438 __field(size_t, len )
439 ),
440
441 TP_fast_assign(
442 struct netfs_inode *__ctx = netfs_inode(wreq->inode);
443 struct fscache_cookie *__cookie = netfs_i_cookie(__ctx);
444 __entry->wreq = wreq->debug_id;
445 __entry->cookie = __cookie ? __cookie->debug_id : 0;
446 __entry->what = what;
447 __entry->start = wreq->start;
448 __entry->len = wreq->len;
449 ),
450
451 TP_printk("R=%08x %s c=%08x by=%llx-%llx",
452 __entry->wreq,
453 __print_symbolic(__entry->what, netfs_write_traces),
454 __entry->cookie,
455 __entry->start, __entry->start + __entry->len - 1)
456 );
457
458#undef EM
459#undef E_
460#endif /* _TRACE_NETFS_H */
461
462/* This part must be outside protection */
463#include <trace/define_trace.h>
464

source code of linux/include/trace/events/netfs.h