xref: /linux/include/trace/events/netfs.h (revision e846be0fba85603d2ad6fc8db6810958d7b6bed1)
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_copy_to_cache,	"COPY2CACH")	\
28 	EM(netfs_write_trace_dio_write,		"DIO-WRITE")	\
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_COPY_TO_CACHE,			"CC")		\
38 	EM(NETFS_WRITEBACK,			"WB")		\
39 	EM(NETFS_WRITETHROUGH,			"WT")		\
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_collect,		"COLLECT")	\
48 	EM(netfs_rreq_trace_done,		"DONE   ")	\
49 	EM(netfs_rreq_trace_free,		"FREE   ")	\
50 	EM(netfs_rreq_trace_redirty,		"REDIRTY")	\
51 	EM(netfs_rreq_trace_resubmit,		"RESUBMT")	\
52 	EM(netfs_rreq_trace_set_pause,		"PAUSE  ")	\
53 	EM(netfs_rreq_trace_unlock,		"UNLOCK ")	\
54 	EM(netfs_rreq_trace_unlock_pgpriv2,	"UNLCK-2")	\
55 	EM(netfs_rreq_trace_unmark,		"UNMARK ")	\
56 	EM(netfs_rreq_trace_wait_ip,		"WAIT-IP")	\
57 	EM(netfs_rreq_trace_wait_pause,		"WT-PAUS")	\
58 	EM(netfs_rreq_trace_wake_ip,		"WAKE-IP")	\
59 	EM(netfs_rreq_trace_unpause,		"UNPAUSE")	\
60 	E_(netfs_rreq_trace_write_done,		"WR-DONE")
61 
62 #define netfs_sreq_sources					\
63 	EM(NETFS_FILL_WITH_ZEROES,		"ZERO")		\
64 	EM(NETFS_DOWNLOAD_FROM_SERVER,		"DOWN")		\
65 	EM(NETFS_READ_FROM_CACHE,		"READ")		\
66 	EM(NETFS_INVALID_READ,			"INVL")		\
67 	EM(NETFS_UPLOAD_TO_SERVER,		"UPLD")		\
68 	EM(NETFS_WRITE_TO_CACHE,		"WRIT")		\
69 	E_(NETFS_INVALID_WRITE,			"INVL")
70 
71 #define netfs_sreq_traces					\
72 	EM(netfs_sreq_trace_discard,		"DSCRD")	\
73 	EM(netfs_sreq_trace_download_instead,	"RDOWN")	\
74 	EM(netfs_sreq_trace_fail,		"FAIL ")	\
75 	EM(netfs_sreq_trace_free,		"FREE ")	\
76 	EM(netfs_sreq_trace_limited,		"LIMIT")	\
77 	EM(netfs_sreq_trace_prepare,		"PREP ")	\
78 	EM(netfs_sreq_trace_prep_failed,	"PRPFL")	\
79 	EM(netfs_sreq_trace_resubmit_short,	"SHORT")	\
80 	EM(netfs_sreq_trace_retry,		"RETRY")	\
81 	EM(netfs_sreq_trace_submit,		"SUBMT")	\
82 	EM(netfs_sreq_trace_terminated,		"TERM ")	\
83 	EM(netfs_sreq_trace_write,		"WRITE")	\
84 	EM(netfs_sreq_trace_write_skip,		"SKIP ")	\
85 	E_(netfs_sreq_trace_write_term,		"WTERM")
86 
87 #define netfs_failures							\
88 	EM(netfs_fail_check_write_begin,	"check-write-begin")	\
89 	EM(netfs_fail_copy_to_cache,		"copy-to-cache")	\
90 	EM(netfs_fail_dio_read_short,		"dio-read-short")	\
91 	EM(netfs_fail_dio_read_zero,		"dio-read-zero")	\
92 	EM(netfs_fail_read,			"read")			\
93 	EM(netfs_fail_short_read,		"short-read")		\
94 	EM(netfs_fail_prepare_write,		"prep-write")		\
95 	E_(netfs_fail_write,			"write")
96 
97 #define netfs_rreq_ref_traces					\
98 	EM(netfs_rreq_trace_get_for_outstanding,"GET OUTSTND")	\
99 	EM(netfs_rreq_trace_get_subreq,		"GET SUBREQ ")	\
100 	EM(netfs_rreq_trace_get_work,		"GET WORK   ")	\
101 	EM(netfs_rreq_trace_put_complete,	"PUT COMPLT ")	\
102 	EM(netfs_rreq_trace_put_discard,	"PUT DISCARD")	\
103 	EM(netfs_rreq_trace_put_failed,		"PUT FAILED ")	\
104 	EM(netfs_rreq_trace_put_no_submit,	"PUT NO-SUBM")	\
105 	EM(netfs_rreq_trace_put_return,		"PUT RETURN ")	\
106 	EM(netfs_rreq_trace_put_subreq,		"PUT SUBREQ ")	\
107 	EM(netfs_rreq_trace_put_work,		"PUT WORK   ")	\
108 	EM(netfs_rreq_trace_put_work_complete,	"PUT WORK CP")	\
109 	EM(netfs_rreq_trace_put_work_nq,	"PUT WORK NQ")	\
110 	EM(netfs_rreq_trace_see_work,		"SEE WORK   ")	\
111 	E_(netfs_rreq_trace_new,		"NEW        ")
112 
113 #define netfs_sreq_ref_traces					\
114 	EM(netfs_sreq_trace_get_copy_to_cache,	"GET COPY2C ")	\
115 	EM(netfs_sreq_trace_get_resubmit,	"GET RESUBMIT")	\
116 	EM(netfs_sreq_trace_get_submit,		"GET SUBMIT")	\
117 	EM(netfs_sreq_trace_get_short_read,	"GET SHORTRD")	\
118 	EM(netfs_sreq_trace_new,		"NEW        ")	\
119 	EM(netfs_sreq_trace_put_cancel,		"PUT CANCEL ")	\
120 	EM(netfs_sreq_trace_put_clear,		"PUT CLEAR  ")	\
121 	EM(netfs_sreq_trace_put_discard,	"PUT DISCARD")	\
122 	EM(netfs_sreq_trace_put_done,		"PUT DONE   ")	\
123 	EM(netfs_sreq_trace_put_failed,		"PUT FAILED ")	\
124 	EM(netfs_sreq_trace_put_merged,		"PUT MERGED ")	\
125 	EM(netfs_sreq_trace_put_no_copy,	"PUT NO COPY")	\
126 	EM(netfs_sreq_trace_put_oom,		"PUT OOM    ")	\
127 	EM(netfs_sreq_trace_put_wip,		"PUT WIP    ")	\
128 	EM(netfs_sreq_trace_put_work,		"PUT WORK   ")	\
129 	E_(netfs_sreq_trace_put_terminated,	"PUT TERM   ")
130 
131 #define netfs_folio_traces					\
132 	/* The first few correspond to enum netfs_how_to_modify */	\
133 	EM(netfs_folio_is_uptodate,		"mod-uptodate")	\
134 	EM(netfs_just_prefetch,			"mod-prefetch")	\
135 	EM(netfs_whole_folio_modify,		"mod-whole-f")	\
136 	EM(netfs_modify_and_clear,		"mod-n-clear")	\
137 	EM(netfs_streaming_write,		"mod-streamw")	\
138 	EM(netfs_streaming_write_cont,		"mod-streamw+")	\
139 	EM(netfs_flush_content,			"flush")	\
140 	EM(netfs_streaming_filled_page,		"mod-streamw-f") \
141 	EM(netfs_streaming_cont_filled_page,	"mod-streamw-f+") \
142 	/* The rest are for writeback */			\
143 	EM(netfs_folio_trace_cancel_copy,	"cancel-copy")	\
144 	EM(netfs_folio_trace_clear,		"clear")	\
145 	EM(netfs_folio_trace_clear_cc,		"clear-cc")	\
146 	EM(netfs_folio_trace_clear_g,		"clear-g")	\
147 	EM(netfs_folio_trace_clear_s,		"clear-s")	\
148 	EM(netfs_folio_trace_copy_to_cache,	"mark-copy")	\
149 	EM(netfs_folio_trace_end_copy,		"end-copy")	\
150 	EM(netfs_folio_trace_filled_gaps,	"filled-gaps")	\
151 	EM(netfs_folio_trace_kill,		"kill")		\
152 	EM(netfs_folio_trace_kill_cc,		"kill-cc")	\
153 	EM(netfs_folio_trace_kill_g,		"kill-g")	\
154 	EM(netfs_folio_trace_kill_s,		"kill-s")	\
155 	EM(netfs_folio_trace_mkwrite,		"mkwrite")	\
156 	EM(netfs_folio_trace_mkwrite_plus,	"mkwrite+")	\
157 	EM(netfs_folio_trace_not_under_wback,	"!wback")	\
158 	EM(netfs_folio_trace_read_gaps,		"read-gaps")	\
159 	EM(netfs_folio_trace_redirtied,		"redirtied")	\
160 	EM(netfs_folio_trace_store,		"store")	\
161 	EM(netfs_folio_trace_store_copy,	"store-copy")	\
162 	EM(netfs_folio_trace_store_plus,	"store+")	\
163 	EM(netfs_folio_trace_wthru,		"wthru")	\
164 	E_(netfs_folio_trace_wthru_plus,	"wthru+")
165 
166 #define netfs_collect_contig_traces				\
167 	EM(netfs_contig_trace_collect,		"Collect")	\
168 	EM(netfs_contig_trace_jump,		"-->JUMP-->")	\
169 	E_(netfs_contig_trace_unlock,		"Unlock")
170 
171 #ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
172 #define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
173 
174 #undef EM
175 #undef E_
176 #define EM(a, b) a,
177 #define E_(a, b) a
178 
179 enum netfs_read_trace { netfs_read_traces } __mode(byte);
180 enum netfs_write_trace { netfs_write_traces } __mode(byte);
181 enum netfs_rreq_trace { netfs_rreq_traces } __mode(byte);
182 enum netfs_sreq_trace { netfs_sreq_traces } __mode(byte);
183 enum netfs_failure { netfs_failures } __mode(byte);
184 enum netfs_rreq_ref_trace { netfs_rreq_ref_traces } __mode(byte);
185 enum netfs_sreq_ref_trace { netfs_sreq_ref_traces } __mode(byte);
186 enum netfs_folio_trace { netfs_folio_traces } __mode(byte);
187 enum netfs_collect_contig_trace { netfs_collect_contig_traces } __mode(byte);
188 
189 #endif
190 
191 /*
192  * Export enum symbols via userspace.
193  */
194 #undef EM
195 #undef E_
196 #define EM(a, b) TRACE_DEFINE_ENUM(a);
197 #define E_(a, b) TRACE_DEFINE_ENUM(a);
198 
199 netfs_read_traces;
200 netfs_write_traces;
201 netfs_rreq_origins;
202 netfs_rreq_traces;
203 netfs_sreq_sources;
204 netfs_sreq_traces;
205 netfs_failures;
206 netfs_rreq_ref_traces;
207 netfs_sreq_ref_traces;
208 netfs_folio_traces;
209 netfs_collect_contig_traces;
210 
211 /*
212  * Now redefine the EM() and E_() macros to map the enums to the strings that
213  * will be printed in the output.
214  */
215 #undef EM
216 #undef E_
217 #define EM(a, b)	{ a, b },
218 #define E_(a, b)	{ a, b }
219 
220 TRACE_EVENT(netfs_read,
221 	    TP_PROTO(struct netfs_io_request *rreq,
222 		     loff_t start, size_t len,
223 		     enum netfs_read_trace what),
224 
225 	    TP_ARGS(rreq, start, len, what),
226 
227 	    TP_STRUCT__entry(
228 		    __field(unsigned int,		rreq		)
229 		    __field(unsigned int,		cookie		)
230 		    __field(loff_t,			start		)
231 		    __field(size_t,			len		)
232 		    __field(enum netfs_read_trace,	what		)
233 		    __field(unsigned int,		netfs_inode	)
234 			     ),
235 
236 	    TP_fast_assign(
237 		    __entry->rreq	= rreq->debug_id;
238 		    __entry->cookie	= rreq->cache_resources.debug_id;
239 		    __entry->start	= start;
240 		    __entry->len	= len;
241 		    __entry->what	= what;
242 		    __entry->netfs_inode = rreq->inode->i_ino;
243 			   ),
244 
245 	    TP_printk("R=%08x %s c=%08x ni=%x s=%llx %zx",
246 		      __entry->rreq,
247 		      __print_symbolic(__entry->what, netfs_read_traces),
248 		      __entry->cookie,
249 		      __entry->netfs_inode,
250 		      __entry->start, __entry->len)
251 	    );
252 
253 TRACE_EVENT(netfs_rreq,
254 	    TP_PROTO(struct netfs_io_request *rreq,
255 		     enum netfs_rreq_trace what),
256 
257 	    TP_ARGS(rreq, what),
258 
259 	    TP_STRUCT__entry(
260 		    __field(unsigned int,		rreq		)
261 		    __field(unsigned int,		flags		)
262 		    __field(enum netfs_io_origin,	origin		)
263 		    __field(enum netfs_rreq_trace,	what		)
264 			     ),
265 
266 	    TP_fast_assign(
267 		    __entry->rreq	= rreq->debug_id;
268 		    __entry->flags	= rreq->flags;
269 		    __entry->origin	= rreq->origin;
270 		    __entry->what	= what;
271 			   ),
272 
273 	    TP_printk("R=%08x %s %s f=%02x",
274 		      __entry->rreq,
275 		      __print_symbolic(__entry->origin, netfs_rreq_origins),
276 		      __print_symbolic(__entry->what, netfs_rreq_traces),
277 		      __entry->flags)
278 	    );
279 
280 TRACE_EVENT(netfs_sreq,
281 	    TP_PROTO(struct netfs_io_subrequest *sreq,
282 		     enum netfs_sreq_trace what),
283 
284 	    TP_ARGS(sreq, what),
285 
286 	    TP_STRUCT__entry(
287 		    __field(unsigned int,		rreq		)
288 		    __field(unsigned short,		index		)
289 		    __field(short,			error		)
290 		    __field(unsigned short,		flags		)
291 		    __field(enum netfs_io_source,	source		)
292 		    __field(enum netfs_sreq_trace,	what		)
293 		    __field(size_t,			len		)
294 		    __field(size_t,			transferred	)
295 		    __field(loff_t,			start		)
296 			     ),
297 
298 	    TP_fast_assign(
299 		    __entry->rreq	= sreq->rreq->debug_id;
300 		    __entry->index	= sreq->debug_index;
301 		    __entry->error	= sreq->error;
302 		    __entry->flags	= sreq->flags;
303 		    __entry->source	= sreq->source;
304 		    __entry->what	= what;
305 		    __entry->len	= sreq->len;
306 		    __entry->transferred = sreq->transferred;
307 		    __entry->start	= sreq->start;
308 			   ),
309 
310 	    TP_printk("R=%08x[%x] %s %s f=%02x s=%llx %zx/%zx e=%d",
311 		      __entry->rreq, __entry->index,
312 		      __print_symbolic(__entry->source, netfs_sreq_sources),
313 		      __print_symbolic(__entry->what, netfs_sreq_traces),
314 		      __entry->flags,
315 		      __entry->start, __entry->transferred, __entry->len,
316 		      __entry->error)
317 	    );
318 
319 TRACE_EVENT(netfs_failure,
320 	    TP_PROTO(struct netfs_io_request *rreq,
321 		     struct netfs_io_subrequest *sreq,
322 		     int error, enum netfs_failure what),
323 
324 	    TP_ARGS(rreq, sreq, error, what),
325 
326 	    TP_STRUCT__entry(
327 		    __field(unsigned int,		rreq		)
328 		    __field(short,			index		)
329 		    __field(short,			error		)
330 		    __field(unsigned short,		flags		)
331 		    __field(enum netfs_io_source,	source		)
332 		    __field(enum netfs_failure,		what		)
333 		    __field(size_t,			len		)
334 		    __field(size_t,			transferred	)
335 		    __field(loff_t,			start		)
336 			     ),
337 
338 	    TP_fast_assign(
339 		    __entry->rreq	= rreq->debug_id;
340 		    __entry->index	= sreq ? sreq->debug_index : -1;
341 		    __entry->error	= error;
342 		    __entry->flags	= sreq ? sreq->flags : 0;
343 		    __entry->source	= sreq ? sreq->source : NETFS_INVALID_READ;
344 		    __entry->what	= what;
345 		    __entry->len	= sreq ? sreq->len : rreq->len;
346 		    __entry->transferred = sreq ? sreq->transferred : 0;
347 		    __entry->start	= sreq ? sreq->start : 0;
348 			   ),
349 
350 	    TP_printk("R=%08x[%x] %s f=%02x s=%llx %zx/%zx %s e=%d",
351 		      __entry->rreq, __entry->index,
352 		      __print_symbolic(__entry->source, netfs_sreq_sources),
353 		      __entry->flags,
354 		      __entry->start, __entry->transferred, __entry->len,
355 		      __print_symbolic(__entry->what, netfs_failures),
356 		      __entry->error)
357 	    );
358 
359 TRACE_EVENT(netfs_rreq_ref,
360 	    TP_PROTO(unsigned int rreq_debug_id, int ref,
361 		     enum netfs_rreq_ref_trace what),
362 
363 	    TP_ARGS(rreq_debug_id, ref, what),
364 
365 	    TP_STRUCT__entry(
366 		    __field(unsigned int,		rreq		)
367 		    __field(int,			ref		)
368 		    __field(enum netfs_rreq_ref_trace,	what		)
369 			     ),
370 
371 	    TP_fast_assign(
372 		    __entry->rreq	= rreq_debug_id;
373 		    __entry->ref	= ref;
374 		    __entry->what	= what;
375 			   ),
376 
377 	    TP_printk("R=%08x %s r=%u",
378 		      __entry->rreq,
379 		      __print_symbolic(__entry->what, netfs_rreq_ref_traces),
380 		      __entry->ref)
381 	    );
382 
383 TRACE_EVENT(netfs_sreq_ref,
384 	    TP_PROTO(unsigned int rreq_debug_id, unsigned int subreq_debug_index,
385 		     int ref, enum netfs_sreq_ref_trace what),
386 
387 	    TP_ARGS(rreq_debug_id, subreq_debug_index, ref, what),
388 
389 	    TP_STRUCT__entry(
390 		    __field(unsigned int,		rreq		)
391 		    __field(unsigned int,		subreq		)
392 		    __field(int,			ref		)
393 		    __field(enum netfs_sreq_ref_trace,	what		)
394 			     ),
395 
396 	    TP_fast_assign(
397 		    __entry->rreq	= rreq_debug_id;
398 		    __entry->subreq	= subreq_debug_index;
399 		    __entry->ref	= ref;
400 		    __entry->what	= what;
401 			   ),
402 
403 	    TP_printk("R=%08x[%x] %s r=%u",
404 		      __entry->rreq,
405 		      __entry->subreq,
406 		      __print_symbolic(__entry->what, netfs_sreq_ref_traces),
407 		      __entry->ref)
408 	    );
409 
410 TRACE_EVENT(netfs_folio,
411 	    TP_PROTO(struct folio *folio, enum netfs_folio_trace why),
412 
413 	    TP_ARGS(folio, why),
414 
415 	    TP_STRUCT__entry(
416 		    __field(ino_t,			ino)
417 		    __field(pgoff_t,			index)
418 		    __field(unsigned int,		nr)
419 		    __field(enum netfs_folio_trace,	why)
420 			     ),
421 
422 	    TP_fast_assign(
423 		    __entry->ino = folio->mapping->host->i_ino;
424 		    __entry->why = why;
425 		    __entry->index = folio_index(folio);
426 		    __entry->nr = folio_nr_pages(folio);
427 			   ),
428 
429 	    TP_printk("i=%05lx ix=%05lx-%05lx %s",
430 		      __entry->ino, __entry->index, __entry->index + __entry->nr - 1,
431 		      __print_symbolic(__entry->why, netfs_folio_traces))
432 	    );
433 
434 TRACE_EVENT(netfs_write_iter,
435 	    TP_PROTO(const struct kiocb *iocb, const struct iov_iter *from),
436 
437 	    TP_ARGS(iocb, from),
438 
439 	    TP_STRUCT__entry(
440 		    __field(unsigned long long,		start		)
441 		    __field(size_t,			len		)
442 		    __field(unsigned int,		flags		)
443 		    __field(unsigned int,		ino		)
444 			     ),
445 
446 	    TP_fast_assign(
447 		    __entry->start	= iocb->ki_pos;
448 		    __entry->len	= iov_iter_count(from);
449 		    __entry->ino	= iocb->ki_filp->f_inode->i_ino;
450 		    __entry->flags	= iocb->ki_flags;
451 			   ),
452 
453 	    TP_printk("WRITE-ITER i=%x s=%llx l=%zx f=%x",
454 		      __entry->ino, __entry->start, __entry->len, __entry->flags)
455 	    );
456 
457 TRACE_EVENT(netfs_write,
458 	    TP_PROTO(const struct netfs_io_request *wreq,
459 		     enum netfs_write_trace what),
460 
461 	    TP_ARGS(wreq, what),
462 
463 	    TP_STRUCT__entry(
464 		    __field(unsigned int,		wreq		)
465 		    __field(unsigned int,		cookie		)
466 		    __field(unsigned int,		ino		)
467 		    __field(enum netfs_write_trace,	what		)
468 		    __field(unsigned long long,		start		)
469 		    __field(unsigned long long,		len		)
470 			     ),
471 
472 	    TP_fast_assign(
473 		    struct netfs_inode *__ctx = netfs_inode(wreq->inode);
474 		    struct fscache_cookie *__cookie = netfs_i_cookie(__ctx);
475 		    __entry->wreq	= wreq->debug_id;
476 		    __entry->cookie	= __cookie ? __cookie->debug_id : 0;
477 		    __entry->ino	= wreq->inode->i_ino;
478 		    __entry->what	= what;
479 		    __entry->start	= wreq->start;
480 		    __entry->len	= wreq->len;
481 			   ),
482 
483 	    TP_printk("R=%08x %s c=%08x i=%x by=%llx-%llx",
484 		      __entry->wreq,
485 		      __print_symbolic(__entry->what, netfs_write_traces),
486 		      __entry->cookie,
487 		      __entry->ino,
488 		      __entry->start, __entry->start + __entry->len - 1)
489 	    );
490 
491 TRACE_EVENT(netfs_collect,
492 	    TP_PROTO(const struct netfs_io_request *wreq),
493 
494 	    TP_ARGS(wreq),
495 
496 	    TP_STRUCT__entry(
497 		    __field(unsigned int,		wreq		)
498 		    __field(unsigned int,		len		)
499 		    __field(unsigned long long,		transferred	)
500 		    __field(unsigned long long,		start		)
501 			     ),
502 
503 	    TP_fast_assign(
504 		    __entry->wreq	= wreq->debug_id;
505 		    __entry->start	= wreq->start;
506 		    __entry->len	= wreq->len;
507 		    __entry->transferred = wreq->transferred;
508 			   ),
509 
510 	    TP_printk("R=%08x s=%llx-%llx",
511 		      __entry->wreq,
512 		      __entry->start + __entry->transferred,
513 		      __entry->start + __entry->len)
514 	    );
515 
516 TRACE_EVENT(netfs_collect_contig,
517 	    TP_PROTO(const struct netfs_io_request *wreq, unsigned long long to,
518 		     enum netfs_collect_contig_trace type),
519 
520 	    TP_ARGS(wreq, to, type),
521 
522 	    TP_STRUCT__entry(
523 		    __field(unsigned int,		wreq)
524 		    __field(enum netfs_collect_contig_trace, type)
525 		    __field(unsigned long long,		contiguity)
526 		    __field(unsigned long long,		to)
527 			     ),
528 
529 	    TP_fast_assign(
530 		    __entry->wreq	= wreq->debug_id;
531 		    __entry->type	= type;
532 		    __entry->contiguity	= wreq->contiguity;
533 		    __entry->to		= to;
534 			   ),
535 
536 	    TP_printk("R=%08x %llx -> %llx %s",
537 		      __entry->wreq,
538 		      __entry->contiguity,
539 		      __entry->to,
540 		      __print_symbolic(__entry->type, netfs_collect_contig_traces))
541 	    );
542 
543 TRACE_EVENT(netfs_collect_sreq,
544 	    TP_PROTO(const struct netfs_io_request *wreq,
545 		     const struct netfs_io_subrequest *subreq),
546 
547 	    TP_ARGS(wreq, subreq),
548 
549 	    TP_STRUCT__entry(
550 		    __field(unsigned int,		wreq		)
551 		    __field(unsigned int,		subreq		)
552 		    __field(unsigned int,		stream		)
553 		    __field(unsigned int,		len		)
554 		    __field(unsigned int,		transferred	)
555 		    __field(unsigned long long,		start		)
556 			     ),
557 
558 	    TP_fast_assign(
559 		    __entry->wreq	= wreq->debug_id;
560 		    __entry->subreq	= subreq->debug_index;
561 		    __entry->stream	= subreq->stream_nr;
562 		    __entry->start	= subreq->start;
563 		    __entry->len	= subreq->len;
564 		    __entry->transferred = subreq->transferred;
565 			   ),
566 
567 	    TP_printk("R=%08x[%u:%02x] s=%llx t=%x/%x",
568 		      __entry->wreq, __entry->stream, __entry->subreq,
569 		      __entry->start, __entry->transferred, __entry->len)
570 	    );
571 
572 TRACE_EVENT(netfs_collect_folio,
573 	    TP_PROTO(const struct netfs_io_request *wreq,
574 		     const struct folio *folio,
575 		     unsigned long long fend,
576 		     unsigned long long collected_to),
577 
578 	    TP_ARGS(wreq, folio, fend, collected_to),
579 
580 	    TP_STRUCT__entry(
581 		    __field(unsigned int,	wreq		)
582 		    __field(unsigned long,	index		)
583 		    __field(unsigned long long,	fend		)
584 		    __field(unsigned long long,	cleaned_to	)
585 		    __field(unsigned long long,	collected_to	)
586 			     ),
587 
588 	    TP_fast_assign(
589 		    __entry->wreq	= wreq->debug_id;
590 		    __entry->index	= folio->index;
591 		    __entry->fend	= fend;
592 		    __entry->cleaned_to	= wreq->cleaned_to;
593 		    __entry->collected_to = collected_to;
594 			   ),
595 
596 	    TP_printk("R=%08x ix=%05lx r=%llx-%llx t=%llx/%llx",
597 		      __entry->wreq, __entry->index,
598 		      (unsigned long long)__entry->index * PAGE_SIZE, __entry->fend,
599 		      __entry->cleaned_to, __entry->collected_to)
600 	    );
601 
602 TRACE_EVENT(netfs_collect_state,
603 	    TP_PROTO(const struct netfs_io_request *wreq,
604 		     unsigned long long collected_to,
605 		     unsigned int notes),
606 
607 	    TP_ARGS(wreq, collected_to, notes),
608 
609 	    TP_STRUCT__entry(
610 		    __field(unsigned int,	wreq		)
611 		    __field(unsigned int,	notes		)
612 		    __field(unsigned long long,	collected_to	)
613 		    __field(unsigned long long,	cleaned_to	)
614 		    __field(unsigned long long,	contiguity	)
615 			     ),
616 
617 	    TP_fast_assign(
618 		    __entry->wreq	= wreq->debug_id;
619 		    __entry->notes	= notes;
620 		    __entry->collected_to = collected_to;
621 		    __entry->cleaned_to	= wreq->cleaned_to;
622 		    __entry->contiguity = wreq->contiguity;
623 			   ),
624 
625 	    TP_printk("R=%08x cto=%llx fto=%llx ctg=%llx n=%x",
626 		      __entry->wreq, __entry->collected_to,
627 		      __entry->cleaned_to, __entry->contiguity,
628 		      __entry->notes)
629 	    );
630 
631 TRACE_EVENT(netfs_collect_gap,
632 	    TP_PROTO(const struct netfs_io_request *wreq,
633 		     const struct netfs_io_stream *stream,
634 		     unsigned long long jump_to, char type),
635 
636 	    TP_ARGS(wreq, stream, jump_to, type),
637 
638 	    TP_STRUCT__entry(
639 		    __field(unsigned int,	wreq)
640 		    __field(unsigned char,	stream)
641 		    __field(unsigned char,	type)
642 		    __field(unsigned long long,	from)
643 		    __field(unsigned long long,	to)
644 			     ),
645 
646 	    TP_fast_assign(
647 		    __entry->wreq	= wreq->debug_id;
648 		    __entry->stream	= stream->stream_nr;
649 		    __entry->from	= stream->collected_to;
650 		    __entry->to		= jump_to;
651 		    __entry->type	= type;
652 			   ),
653 
654 	    TP_printk("R=%08x[%x:] %llx->%llx %c",
655 		      __entry->wreq, __entry->stream,
656 		      __entry->from, __entry->to, __entry->type)
657 	    );
658 
659 TRACE_EVENT(netfs_collect_stream,
660 	    TP_PROTO(const struct netfs_io_request *wreq,
661 		     const struct netfs_io_stream *stream),
662 
663 	    TP_ARGS(wreq, stream),
664 
665 	    TP_STRUCT__entry(
666 		    __field(unsigned int,	wreq)
667 		    __field(unsigned char,	stream)
668 		    __field(unsigned long long,	collected_to)
669 		    __field(unsigned long long,	front)
670 			     ),
671 
672 	    TP_fast_assign(
673 		    __entry->wreq	= wreq->debug_id;
674 		    __entry->stream	= stream->stream_nr;
675 		    __entry->collected_to = stream->collected_to;
676 		    __entry->front	= stream->front ? stream->front->start : UINT_MAX;
677 			   ),
678 
679 	    TP_printk("R=%08x[%x:] cto=%llx frn=%llx",
680 		      __entry->wreq, __entry->stream,
681 		      __entry->collected_to, __entry->front)
682 	    );
683 
684 #undef EM
685 #undef E_
686 #endif /* _TRACE_NETFS_H */
687 
688 /* This part must be outside protection */
689 #include <trace/define_trace.h>
690