xref: /linux/include/trace/events/netfs.h (revision e00827a4d0cfebf8d78dfd0a9a024237f57c9273)
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_read_gaps,		"READ-GAPS")	\
24 	EM(netfs_read_trace_read_single,	"READ-SNGL")	\
25 	EM(netfs_read_trace_prefetch_for_write,	"PREFETCHW")	\
26 	E_(netfs_read_trace_write_begin,	"WRITEBEGN")
27 
28 #define netfs_write_traces					\
29 	EM(netfs_write_trace_copy_to_cache,	"COPY2CACH")	\
30 	EM(netfs_write_trace_dio_write,		"DIO-WRITE")	\
31 	EM(netfs_write_trace_unbuffered_write,	"UNB-WRITE")	\
32 	EM(netfs_write_trace_writeback,		"WRITEBACK")	\
33 	EM(netfs_write_trace_writeback_single,	"WB-SINGLE") \
34 	E_(netfs_write_trace_writethrough,	"WRITETHRU")
35 
36 #define netfs_rreq_origins					\
37 	EM(NETFS_READAHEAD,			"RA")		\
38 	EM(NETFS_READPAGE,			"RP")		\
39 	EM(NETFS_READ_GAPS,			"RG")		\
40 	EM(NETFS_READ_SINGLE,			"R1")		\
41 	EM(NETFS_READ_FOR_WRITE,		"RW")		\
42 	EM(NETFS_UNBUFFERED_READ,		"UR")		\
43 	EM(NETFS_DIO_READ,			"DR")		\
44 	EM(NETFS_WRITEBACK,			"WB")		\
45 	EM(NETFS_WRITEBACK_SINGLE,		"W1")		\
46 	EM(NETFS_WRITETHROUGH,			"WT")		\
47 	EM(NETFS_UNBUFFERED_WRITE,		"UW")		\
48 	EM(NETFS_DIO_WRITE,			"DW")		\
49 	E_(NETFS_PGPRIV2_COPY_TO_CACHE,		"2C")
50 
51 #define netfs_rreq_traces					\
52 	EM(netfs_rreq_trace_assess,		"ASSESS ")	\
53 	EM(netfs_rreq_trace_collect,		"COLLECT")	\
54 	EM(netfs_rreq_trace_complete,		"COMPLET")	\
55 	EM(netfs_rreq_trace_copy,		"COPY   ")	\
56 	EM(netfs_rreq_trace_dirty,		"DIRTY  ")	\
57 	EM(netfs_rreq_trace_done,		"DONE   ")	\
58 	EM(netfs_rreq_trace_end_copy_to_cache,	"END-C2C")	\
59 	EM(netfs_rreq_trace_free,		"FREE   ")	\
60 	EM(netfs_rreq_trace_intr,		"INTR   ")	\
61 	EM(netfs_rreq_trace_ki_complete,	"KI-CMPL")	\
62 	EM(netfs_rreq_trace_ra_put_ref,		"RA-PUT ")	\
63 	EM(netfs_rreq_trace_recollect,		"RECLLCT")	\
64 	EM(netfs_rreq_trace_redirty,		"REDIRTY")	\
65 	EM(netfs_rreq_trace_resubmit,		"RESUBMT")	\
66 	EM(netfs_rreq_trace_set_abandon,	"S-ABNDN")	\
67 	EM(netfs_rreq_trace_set_pause,		"PAUSE  ")	\
68 	EM(netfs_rreq_trace_unlock,		"UNLOCK ")	\
69 	EM(netfs_rreq_trace_unlock_pgpriv2,	"UNLCK-2")	\
70 	EM(netfs_rreq_trace_unmark,		"UNMARK ")	\
71 	EM(netfs_rreq_trace_unpause,		"UNPAUSE")	\
72 	EM(netfs_rreq_trace_wait_ip,		"WAIT-IP")	\
73 	EM(netfs_rreq_trace_wait_pause,		"--PAUSED--")	\
74 	EM(netfs_rreq_trace_wait_put_ra_refs,	"WAIT-P-RA")	\
75 	EM(netfs_rreq_trace_wait_quiesce,	"WAIT-QUIESCE")	\
76 	EM(netfs_rreq_trace_waited_ip,		"DONE-IP")	\
77 	EM(netfs_rreq_trace_waited_pause,	"--UNPAUSED--")	\
78 	EM(netfs_rreq_trace_waited_put_ra_refs,	"DONE-P-RA")	\
79 	EM(netfs_rreq_trace_waited_quiesce,	"DONE-QUIESCE")	\
80 	EM(netfs_rreq_trace_wake_ip,		"WAKE-IP")	\
81 	EM(netfs_rreq_trace_wake_queue,		"WAKE-Q ")	\
82 	E_(netfs_rreq_trace_write_done,		"WR-DONE")
83 
84 #define netfs_sreq_sources					\
85 	EM(NETFS_SOURCE_UNKNOWN,		"----")		\
86 	EM(NETFS_FILL_WITH_ZEROES,		"ZERO")		\
87 	EM(NETFS_DOWNLOAD_FROM_SERVER,		"DOWN")		\
88 	EM(NETFS_READ_FROM_CACHE,		"READ")		\
89 	EM(NETFS_INVALID_READ,			"INVL")		\
90 	EM(NETFS_UPLOAD_TO_SERVER,		"UPLD")		\
91 	E_(NETFS_WRITE_TO_CACHE,		"WRIT")
92 
93 #define netfs_sreq_traces					\
94 	EM(netfs_sreq_trace_abandoned,		"ABNDN")	\
95 	EM(netfs_sreq_trace_add_donations,	"+DON ")	\
96 	EM(netfs_sreq_trace_added,		"ADD  ")	\
97 	EM(netfs_sreq_trace_cache_nowrite,	"CA-NW")	\
98 	EM(netfs_sreq_trace_cache_prepare,	"CA-PR")	\
99 	EM(netfs_sreq_trace_cache_write,	"CA-WR")	\
100 	EM(netfs_sreq_trace_cancel,		"CANCL")	\
101 	EM(netfs_sreq_trace_clear,		"CLEAR")	\
102 	EM(netfs_sreq_trace_consumed,		"CONSM")	\
103 	EM(netfs_sreq_trace_discard,		"DSCRD")	\
104 	EM(netfs_sreq_trace_donate_to_prev,	"DON-P")	\
105 	EM(netfs_sreq_trace_donate_to_next,	"DON-N")	\
106 	EM(netfs_sreq_trace_download_instead,	"RDOWN")	\
107 	EM(netfs_sreq_trace_fail,		"FAIL ")	\
108 	EM(netfs_sreq_trace_free,		"FREE ")	\
109 	EM(netfs_sreq_trace_hit_eof,		"EOF  ")	\
110 	EM(netfs_sreq_trace_io_bad,		"I-BAD")	\
111 	EM(netfs_sreq_trace_io_malformed,	"I-MLF")	\
112 	EM(netfs_sreq_trace_io_unknown,		"I-UNK")	\
113 	EM(netfs_sreq_trace_io_progress,	"I-OK ")	\
114 	EM(netfs_sreq_trace_io_req_submitted,	"I-RSB")	\
115 	EM(netfs_sreq_trace_io_retry_needed,	"I-RTR")	\
116 	EM(netfs_sreq_trace_limited,		"LIMIT")	\
117 	EM(netfs_sreq_trace_need_clear,		"N-CLR")	\
118 	EM(netfs_sreq_trace_partial_read,	"PARTR")	\
119 	EM(netfs_sreq_trace_need_retry,		"ND-RT")	\
120 	EM(netfs_sreq_trace_prepare,		"PREP ")	\
121 	EM(netfs_sreq_trace_prep_failed,	"PRPFL")	\
122 	EM(netfs_sreq_trace_progress,		"PRGRS")	\
123 	EM(netfs_sreq_trace_reprep_failed,	"REPFL")	\
124 	EM(netfs_sreq_trace_retry,		"RETRY")	\
125 	EM(netfs_sreq_trace_short,		"SHORT")	\
126 	EM(netfs_sreq_trace_split,		"SPLIT")	\
127 	EM(netfs_sreq_trace_submit,		"SUBMT")	\
128 	EM(netfs_sreq_trace_superfluous,	"SPRFL")	\
129 	EM(netfs_sreq_trace_terminated,		"TERM ")	\
130 	EM(netfs_sreq_trace_wait_for,		"_WAIT")	\
131 	EM(netfs_sreq_trace_write,		"WRITE")	\
132 	EM(netfs_sreq_trace_write_skip,		"SKIP ")	\
133 	E_(netfs_sreq_trace_write_term,		"WTERM")
134 
135 #define netfs_failures							\
136 	EM(netfs_fail_check_write_begin,	"check-write-begin")	\
137 	EM(netfs_fail_copy_to_cache,		"copy-to-cache")	\
138 	EM(netfs_fail_dio_read_short,		"dio-read-short")	\
139 	EM(netfs_fail_dio_read_zero,		"dio-read-zero")	\
140 	EM(netfs_fail_read,			"read")			\
141 	EM(netfs_fail_short_read,		"short-read")		\
142 	EM(netfs_fail_prepare_write,		"prep-write")		\
143 	E_(netfs_fail_write,			"write")
144 
145 #define netfs_rreq_ref_traces					\
146 	EM(netfs_rreq_trace_get_for_outstanding,"GET OUTSTND")	\
147 	EM(netfs_rreq_trace_get_subreq,		"GET SUBREQ ")	\
148 	EM(netfs_rreq_trace_put_complete,	"PUT COMPLT ")	\
149 	EM(netfs_rreq_trace_put_discard,	"PUT DISCARD")	\
150 	EM(netfs_rreq_trace_put_failed,		"PUT FAILED ")	\
151 	EM(netfs_rreq_trace_put_no_submit,	"PUT NO-SUBM")	\
152 	EM(netfs_rreq_trace_put_return,		"PUT RETURN ")	\
153 	EM(netfs_rreq_trace_put_subreq,		"PUT SUBREQ ")	\
154 	EM(netfs_rreq_trace_put_work_ip,	"PUT WORK IP ")	\
155 	EM(netfs_rreq_trace_see_work,		"SEE WORK   ")	\
156 	EM(netfs_rreq_trace_see_work_complete,	"SEE WORK CP")	\
157 	E_(netfs_rreq_trace_new,		"NEW        ")
158 
159 #define netfs_sreq_ref_traces					\
160 	EM(netfs_sreq_trace_get_copy_to_cache,	"GET COPY2C ")	\
161 	EM(netfs_sreq_trace_get_resubmit,	"GET RESUBMT")	\
162 	EM(netfs_sreq_trace_get_submit,		"GET SUBMIT ")	\
163 	EM(netfs_sreq_trace_get_short_read,	"GET SHORTRD")	\
164 	EM(netfs_sreq_trace_new,		"NEW        ")	\
165 	EM(netfs_sreq_trace_put_abandon,	"PUT ABANDON")	\
166 	EM(netfs_sreq_trace_put_cancel,		"PUT CANCEL ")	\
167 	EM(netfs_sreq_trace_put_clear,		"PUT CLEAR  ")	\
168 	EM(netfs_sreq_trace_put_consumed,	"PUT CONSUME")	\
169 	EM(netfs_sreq_trace_put_done,		"PUT DONE   ")	\
170 	EM(netfs_sreq_trace_put_failed,		"PUT FAILED ")	\
171 	EM(netfs_sreq_trace_put_merged,		"PUT MERGED ")	\
172 	EM(netfs_sreq_trace_put_no_copy,	"PUT NO COPY")	\
173 	EM(netfs_sreq_trace_put_oom,		"PUT OOM    ")	\
174 	EM(netfs_sreq_trace_put_wip,		"PUT WIP    ")	\
175 	EM(netfs_sreq_trace_put_work,		"PUT WORK   ")	\
176 	EM(netfs_sreq_trace_put_terminated,	"PUT TERM   ")	\
177 	E_(netfs_sreq_trace_see_failed,		"SEE FAILED ")
178 
179 #define netfs_folio_traces					\
180 	EM(netfs_folio_is_uptodate,		"mod-uptodate")	\
181 	EM(netfs_just_prefetch,			"mod-prefetch")	\
182 	EM(netfs_whole_folio_modify,		"mod-whole-f")	\
183 	EM(netfs_whole_folio_modify_efault,	"mod-whole-f!")	\
184 	EM(netfs_whole_folio_modify_filled,	"mod-whole-f+")	\
185 	EM(netfs_whole_folio_modify_filled_efault, "mod-whole-f+!") \
186 	EM(netfs_modify_and_clear,		"mod-n-clear")	\
187 	EM(netfs_modify_and_clear_rm_finfo,	"mod-n-clear+")	\
188 	EM(netfs_streaming_write,		"mod-streamw")	\
189 	EM(netfs_streaming_write_cont,		"mod-streamw+")	\
190 	EM(netfs_flush_content,			"flush")	\
191 	EM(netfs_streaming_filled_page,		"mod-streamw-f") \
192 	EM(netfs_streaming_cont_filled_page,	"mod-streamw-f+") \
193 	EM(netfs_folio_trace_abandon,		"abandon")	\
194 	EM(netfs_folio_trace_alloc_buffer,	"alloc-buf")	\
195 	EM(netfs_folio_trace_cancel_copy,	"cancel-copy")	\
196 	EM(netfs_folio_trace_cancel_store,	"cancel-store")	\
197 	EM(netfs_folio_trace_clear,		"clear")	\
198 	EM(netfs_folio_trace_clear_cc,		"clear-cc")	\
199 	EM(netfs_folio_trace_clear_g,		"clear-g")	\
200 	EM(netfs_folio_trace_clear_s,		"clear-s")	\
201 	EM(netfs_folio_trace_end_copy,		"end-copy")	\
202 	EM(netfs_folio_trace_filled_gaps,	"filled-gaps")	\
203 	EM(netfs_folio_trace_invalidate_all,	"inval-all")	\
204 	EM(netfs_folio_trace_invalidate_front,	"inval-front")	\
205 	EM(netfs_folio_trace_invalidate_middle,	"inval-mid")	\
206 	EM(netfs_folio_trace_invalidate_tail,	"inval-tail")	\
207 	EM(netfs_folio_trace_kill,		"kill")		\
208 	EM(netfs_folio_trace_kill_cc,		"kill-cc")	\
209 	EM(netfs_folio_trace_kill_g,		"kill-g")	\
210 	EM(netfs_folio_trace_kill_s,		"kill-s")	\
211 	EM(netfs_folio_trace_mark_copy,		"mark-copy")	\
212 	EM(netfs_folio_trace_mkwrite,		"mkwrite")	\
213 	EM(netfs_folio_trace_mkwrite_plus,	"mkwrite+")	\
214 	EM(netfs_folio_trace_not_locked,	"!locked")	\
215 	EM(netfs_folio_trace_not_under_wback,	"!wback")	\
216 	EM(netfs_folio_trace_pgpriv2_copy,	"pgpriv2-copy")	\
217 	EM(netfs_folio_trace_put,		"put")		\
218 	EM(netfs_folio_trace_read,		"read")		\
219 	EM(netfs_folio_trace_read_done,		"read-done")	\
220 	EM(netfs_folio_trace_read_gaps,		"read-gaps")	\
221 	EM(netfs_folio_trace_read_unlock,	"read-unlock")	\
222 	EM(netfs_folio_trace_redirtied,		"redirtied")	\
223 	EM(netfs_folio_trace_sched_copy,	"sched-copy")	\
224 	EM(netfs_folio_trace_store,		"store")	\
225 	EM(netfs_folio_trace_store_copy,	"store-copy")	\
226 	EM(netfs_folio_trace_store_plus,	"store+")	\
227 	EM(netfs_folio_trace_wthru,		"wthru")	\
228 	E_(netfs_folio_trace_wthru_plus,	"wthru+")
229 
230 #define netfs_collect_contig_traces				\
231 	EM(netfs_contig_trace_collect,		"Collect")	\
232 	EM(netfs_contig_trace_jump,		"-->JUMP-->")	\
233 	E_(netfs_contig_trace_unlock,		"Unlock")
234 
235 #define netfs_donate_traces					\
236 	EM(netfs_trace_donate_tail_to_prev,	"tail-to-prev")	\
237 	EM(netfs_trace_donate_to_prev,		"to-prev")	\
238 	EM(netfs_trace_donate_to_next,		"to-next")	\
239 	E_(netfs_trace_donate_to_deferred_next,	"defer-next")
240 
241 #define netfs_folioq_traces					\
242 	EM(netfs_trace_folioq_alloc_buffer,	"alloc-buf")	\
243 	EM(netfs_trace_folioq_clear,		"clear")	\
244 	EM(netfs_trace_folioq_delete,		"delete")	\
245 	EM(netfs_trace_folioq_make_space,	"make-space")	\
246 	EM(netfs_trace_folioq_rollbuf_init,	"roll-init")	\
247 	E_(netfs_trace_folioq_read_progress,	"r-progress")
248 
249 #ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
250 #define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
251 
252 #undef EM
253 #undef E_
254 #define EM(a, b) a,
255 #define E_(a, b) a
256 
257 enum netfs_read_trace { netfs_read_traces } __mode(byte);
258 enum netfs_write_trace { netfs_write_traces } __mode(byte);
259 enum netfs_rreq_trace { netfs_rreq_traces } __mode(byte);
260 enum netfs_sreq_trace { netfs_sreq_traces } __mode(byte);
261 enum netfs_failure { netfs_failures } __mode(byte);
262 enum netfs_rreq_ref_trace { netfs_rreq_ref_traces } __mode(byte);
263 enum netfs_sreq_ref_trace { netfs_sreq_ref_traces } __mode(byte);
264 enum netfs_folio_trace { netfs_folio_traces } __mode(byte);
265 enum netfs_collect_contig_trace { netfs_collect_contig_traces } __mode(byte);
266 enum netfs_donate_trace { netfs_donate_traces } __mode(byte);
267 enum netfs_folioq_trace { netfs_folioq_traces } __mode(byte);
268 
269 #endif
270 
271 /*
272  * Export enum symbols via userspace.
273  */
274 #undef EM
275 #undef E_
276 #define EM(a, b) TRACE_DEFINE_ENUM(a);
277 #define E_(a, b) TRACE_DEFINE_ENUM(a);
278 
279 netfs_read_traces;
280 netfs_write_traces;
281 netfs_rreq_origins;
282 netfs_rreq_traces;
283 netfs_sreq_sources;
284 netfs_sreq_traces;
285 netfs_failures;
286 netfs_rreq_ref_traces;
287 netfs_sreq_ref_traces;
288 netfs_folio_traces;
289 netfs_collect_contig_traces;
290 netfs_donate_traces;
291 netfs_folioq_traces;
292 
293 /*
294  * Now redefine the EM() and E_() macros to map the enums to the strings that
295  * will be printed in the output.
296  */
297 #undef EM
298 #undef E_
299 #define EM(a, b)	{ a, b },
300 #define E_(a, b)	{ a, b }
301 
302 TRACE_EVENT(netfs_read,
303 	    TP_PROTO(struct netfs_io_request *rreq,
304 		     loff_t start, size_t len,
305 		     enum netfs_read_trace what),
306 
307 	    TP_ARGS(rreq, start, len, what),
308 
309 	    TP_STRUCT__entry(
310 		    __field(unsigned int,		rreq)
311 		    __field(unsigned int,		cookie)
312 		    __field(loff_t,			i_size)
313 		    __field(loff_t,			start)
314 		    __field(size_t,			len)
315 		    __field(enum netfs_read_trace,	what)
316 		    __field(u64,			netfs_inode)
317 			     ),
318 
319 	    TP_fast_assign(
320 		    __entry->rreq	= rreq->debug_id;
321 		    __entry->cookie	= rreq->cache_resources.debug_id;
322 		    __entry->i_size	= rreq->i_size;
323 		    __entry->start	= start;
324 		    __entry->len	= len;
325 		    __entry->what	= what;
326 		    __entry->netfs_inode = rreq->inode->i_ino;
327 			   ),
328 
329 	    TP_printk("R=%08x %s c=%08x ni=%llx s=%llx l=%zx sz=%llx",
330 		      __entry->rreq,
331 		      __print_symbolic(__entry->what, netfs_read_traces),
332 		      __entry->cookie,
333 		      __entry->netfs_inode,
334 		      __entry->start, __entry->len, __entry->i_size)
335 	    );
336 
337 TRACE_EVENT(netfs_rreq,
338 	    TP_PROTO(struct netfs_io_request *rreq,
339 		     enum netfs_rreq_trace what),
340 
341 	    TP_ARGS(rreq, what),
342 
343 	    TP_STRUCT__entry(
344 		    __field(unsigned int,		rreq)
345 		    __field(unsigned int,		flags)
346 		    __field(enum netfs_io_origin,	origin)
347 		    __field(enum netfs_rreq_trace,	what)
348 			     ),
349 
350 	    TP_fast_assign(
351 		    __entry->rreq	= rreq->debug_id;
352 		    __entry->flags	= rreq->flags;
353 		    __entry->origin	= rreq->origin;
354 		    __entry->what	= what;
355 			   ),
356 
357 	    TP_printk("R=%08x %s %s f=%02x",
358 		      __entry->rreq,
359 		      __print_symbolic(__entry->origin, netfs_rreq_origins),
360 		      __print_symbolic(__entry->what, netfs_rreq_traces),
361 		      __entry->flags)
362 	    );
363 
364 TRACE_EVENT(netfs_sreq,
365 	    TP_PROTO(struct netfs_io_subrequest *sreq,
366 		     enum netfs_sreq_trace what),
367 
368 	    TP_ARGS(sreq, what),
369 
370 	    TP_STRUCT__entry(
371 		    __field(unsigned int,		rreq)
372 		    __field(unsigned short,		index)
373 		    __field(short,			error)
374 		    __field(unsigned short,		flags)
375 		    __field(enum netfs_io_source,	source)
376 		    __field(enum netfs_sreq_trace,	what)
377 		    __field(u8,				slot)
378 		    __field(size_t,			len)
379 		    __field(size_t,			transferred)
380 		    __field(loff_t,			start)
381 			     ),
382 
383 	    TP_fast_assign(
384 		    __entry->rreq	= sreq->rreq->debug_id;
385 		    __entry->index	= sreq->debug_index;
386 		    __entry->error	= sreq->error;
387 		    __entry->flags	= sreq->flags;
388 		    __entry->source	= sreq->source;
389 		    __entry->what	= what;
390 		    __entry->len	= sreq->len;
391 		    __entry->transferred = sreq->transferred;
392 		    __entry->start	= sreq->start;
393 		    __entry->slot	= sreq->io_iter.folioq_slot;
394 			   ),
395 
396 	    TP_printk("R=%08x[%x] %s %s f=%03x s=%llx %zx/%zx s=%u e=%d",
397 		      __entry->rreq, __entry->index,
398 		      __print_symbolic(__entry->source, netfs_sreq_sources),
399 		      __print_symbolic(__entry->what, netfs_sreq_traces),
400 		      __entry->flags,
401 		      __entry->start, __entry->transferred, __entry->len,
402 		      __entry->slot, __entry->error)
403 	    );
404 
405 TRACE_EVENT(netfs_failure,
406 	    TP_PROTO(struct netfs_io_request *rreq,
407 		     struct netfs_io_subrequest *sreq,
408 		     int error, enum netfs_failure what),
409 
410 	    TP_ARGS(rreq, sreq, error, what),
411 
412 	    TP_STRUCT__entry(
413 		    __field(unsigned int,		rreq)
414 		    __field(short,			index)
415 		    __field(short,			error)
416 		    __field(unsigned short,		flags)
417 		    __field(enum netfs_io_source,	source)
418 		    __field(enum netfs_failure,		what)
419 		    __field(size_t,			len)
420 		    __field(size_t,			transferred)
421 		    __field(loff_t,			start)
422 			     ),
423 
424 	    TP_fast_assign(
425 		    __entry->rreq	= rreq->debug_id;
426 		    __entry->index	= sreq ? sreq->debug_index : -1;
427 		    __entry->error	= error;
428 		    __entry->flags	= sreq ? sreq->flags : 0;
429 		    __entry->source	= sreq ? sreq->source : NETFS_INVALID_READ;
430 		    __entry->what	= what;
431 		    __entry->len	= sreq ? sreq->len : rreq->len;
432 		    __entry->transferred = sreq ? sreq->transferred : 0;
433 		    __entry->start	= sreq ? sreq->start : 0;
434 			   ),
435 
436 	    TP_printk("R=%08x[%x] %s f=%02x s=%llx %zx/%zx %s e=%d",
437 		      __entry->rreq, __entry->index,
438 		      __print_symbolic(__entry->source, netfs_sreq_sources),
439 		      __entry->flags,
440 		      __entry->start, __entry->transferred, __entry->len,
441 		      __print_symbolic(__entry->what, netfs_failures),
442 		      __entry->error)
443 	    );
444 
445 TRACE_EVENT(netfs_rreq_ref,
446 	    TP_PROTO(unsigned int rreq_debug_id, int ref,
447 		     enum netfs_rreq_ref_trace what),
448 
449 	    TP_ARGS(rreq_debug_id, ref, what),
450 
451 	    TP_STRUCT__entry(
452 		    __field(unsigned int,		rreq)
453 		    __field(int,			ref)
454 		    __field(enum netfs_rreq_ref_trace,	what)
455 			     ),
456 
457 	    TP_fast_assign(
458 		    __entry->rreq	= rreq_debug_id;
459 		    __entry->ref	= ref;
460 		    __entry->what	= what;
461 			   ),
462 
463 	    TP_printk("R=%08x %s r=%u",
464 		      __entry->rreq,
465 		      __print_symbolic(__entry->what, netfs_rreq_ref_traces),
466 		      __entry->ref)
467 	    );
468 
469 TRACE_EVENT(netfs_sreq_ref,
470 	    TP_PROTO(unsigned int rreq_debug_id, unsigned int subreq_debug_index,
471 		     int ref, enum netfs_sreq_ref_trace what),
472 
473 	    TP_ARGS(rreq_debug_id, subreq_debug_index, ref, what),
474 
475 	    TP_STRUCT__entry(
476 		    __field(unsigned int,		rreq)
477 		    __field(unsigned int,		subreq)
478 		    __field(int,			ref)
479 		    __field(enum netfs_sreq_ref_trace,	what)
480 			     ),
481 
482 	    TP_fast_assign(
483 		    __entry->rreq	= rreq_debug_id;
484 		    __entry->subreq	= subreq_debug_index;
485 		    __entry->ref	= ref;
486 		    __entry->what	= what;
487 			   ),
488 
489 	    TP_printk("R=%08x[%x] %s r=%u",
490 		      __entry->rreq,
491 		      __entry->subreq,
492 		      __print_symbolic(__entry->what, netfs_sreq_ref_traces),
493 		      __entry->ref)
494 	    );
495 
496 TRACE_EVENT(netfs_folio,
497 	    TP_PROTO(struct folio *folio, enum netfs_folio_trace why),
498 
499 	    TP_ARGS(folio, why),
500 
501 	    TP_STRUCT__entry(
502 		    __field(u64,			ino)
503 		    __field(pgoff_t,			index)
504 		    __field(unsigned int,		nr)
505 		    __field(enum netfs_folio_trace,	why)
506 			     ),
507 
508 	    TP_fast_assign(
509 		    struct address_space *__m = READ_ONCE(folio->mapping);
510 		    __entry->ino = __m ? __m->host->i_ino : 0;
511 		    __entry->why = why;
512 		    __entry->index = folio->index;
513 		    __entry->nr = folio_nr_pages(folio);
514 			   ),
515 
516 	    TP_printk("i=%05llx ix=%05lx-%05lx %s",
517 		      __entry->ino, __entry->index, __entry->index + __entry->nr - 1,
518 		      __print_symbolic(__entry->why, netfs_folio_traces))
519 	    );
520 
521 TRACE_EVENT(netfs_write_iter,
522 	    TP_PROTO(const struct kiocb *iocb, const struct iov_iter *from),
523 
524 	    TP_ARGS(iocb, from),
525 
526 	    TP_STRUCT__entry(
527 		    __field(unsigned long long,		start)
528 		    __field(size_t,			len)
529 		    __field(unsigned int,		flags)
530 		    __field(unsigned int,		ino)
531 			     ),
532 
533 	    TP_fast_assign(
534 		    __entry->start	= iocb->ki_pos;
535 		    __entry->len	= iov_iter_count(from);
536 		    __entry->ino	= iocb->ki_filp->f_inode->i_ino;
537 		    __entry->flags	= iocb->ki_flags;
538 			   ),
539 
540 	    TP_printk("WRITE-ITER i=%x s=%llx l=%zx f=%x",
541 		      __entry->ino, __entry->start, __entry->len, __entry->flags)
542 	    );
543 
544 TRACE_EVENT(netfs_write,
545 	    TP_PROTO(const struct netfs_io_request *wreq,
546 		     enum netfs_write_trace what),
547 
548 	    TP_ARGS(wreq, what),
549 
550 	    TP_STRUCT__entry(
551 		    __field(unsigned int,		wreq)
552 		    __field(unsigned int,		cookie)
553 		    __field(unsigned int,		ino)
554 		    __field(enum netfs_write_trace,	what)
555 		    __field(unsigned long long,		start)
556 		    __field(unsigned long long,		len)
557 			     ),
558 
559 	    TP_fast_assign(
560 		    struct netfs_inode *__ctx = netfs_inode(wreq->inode);
561 		    struct fscache_cookie *__cookie = netfs_i_cookie(__ctx);
562 		    __entry->wreq	= wreq->debug_id;
563 		    __entry->cookie	= __cookie ? __cookie->debug_id : 0;
564 		    __entry->ino	= wreq->inode->i_ino;
565 		    __entry->what	= what;
566 		    __entry->start	= wreq->start;
567 		    __entry->len	= wreq->len;
568 			   ),
569 
570 	    TP_printk("R=%08x %s c=%08x i=%x by=%llx-%llx",
571 		      __entry->wreq,
572 		      __print_symbolic(__entry->what, netfs_write_traces),
573 		      __entry->cookie,
574 		      __entry->ino,
575 		      __entry->start, __entry->start + __entry->len - 1)
576 	    );
577 
578 TRACE_EVENT(netfs_copy2cache,
579 	    TP_PROTO(const struct netfs_io_request *rreq,
580 		     const struct netfs_io_request *creq),
581 
582 	    TP_ARGS(rreq, creq),
583 
584 	    TP_STRUCT__entry(
585 		    __field(unsigned int,		rreq)
586 		    __field(unsigned int,		creq)
587 		    __field(unsigned int,		cookie)
588 		    __field(unsigned int,		ino)
589 			     ),
590 
591 	    TP_fast_assign(
592 		    struct netfs_inode *__ctx = netfs_inode(rreq->inode);
593 		    struct fscache_cookie *__cookie = netfs_i_cookie(__ctx);
594 		    __entry->rreq	= rreq->debug_id;
595 		    __entry->creq	= creq->debug_id;
596 		    __entry->cookie	= __cookie ? __cookie->debug_id : 0;
597 		    __entry->ino	= rreq->inode->i_ino;
598 			   ),
599 
600 	    TP_printk("R=%08x CR=%08x c=%08x i=%x ",
601 		      __entry->rreq,
602 		      __entry->creq,
603 		      __entry->cookie,
604 		      __entry->ino)
605 	    );
606 
607 TRACE_EVENT(netfs_collect,
608 	    TP_PROTO(const struct netfs_io_request *wreq),
609 
610 	    TP_ARGS(wreq),
611 
612 	    TP_STRUCT__entry(
613 		    __field(unsigned int,		wreq)
614 		    __field(unsigned int,		len)
615 		    __field(unsigned long long,		transferred)
616 		    __field(unsigned long long,		start)
617 			     ),
618 
619 	    TP_fast_assign(
620 		    __entry->wreq	= wreq->debug_id;
621 		    __entry->start	= wreq->start;
622 		    __entry->len	= wreq->len;
623 		    __entry->transferred = wreq->transferred;
624 			   ),
625 
626 	    TP_printk("R=%08x s=%llx-%llx",
627 		      __entry->wreq,
628 		      __entry->start + __entry->transferred,
629 		      __entry->start + __entry->len)
630 	    );
631 
632 TRACE_EVENT(netfs_collect_sreq,
633 	    TP_PROTO(const struct netfs_io_request *wreq,
634 		     const struct netfs_io_subrequest *subreq),
635 
636 	    TP_ARGS(wreq, subreq),
637 
638 	    TP_STRUCT__entry(
639 		    __field(unsigned int,		wreq)
640 		    __field(unsigned int,		subreq)
641 		    __field(unsigned int,		stream)
642 		    __field(unsigned int,		len)
643 		    __field(unsigned int,		transferred)
644 		    __field(unsigned long long,		start)
645 			     ),
646 
647 	    TP_fast_assign(
648 		    __entry->wreq	= wreq->debug_id;
649 		    __entry->subreq	= subreq->debug_index;
650 		    __entry->stream	= subreq->stream_nr;
651 		    __entry->start	= subreq->start;
652 		    __entry->len	= subreq->len;
653 		    __entry->transferred = subreq->transferred;
654 			   ),
655 
656 	    TP_printk("R=%08x[%u:%02x] s=%llx t=%x/%x",
657 		      __entry->wreq, __entry->stream, __entry->subreq,
658 		      __entry->start, __entry->transferred, __entry->len)
659 	    );
660 
661 TRACE_EVENT(netfs_collect_folio,
662 	    TP_PROTO(const struct netfs_io_request *wreq,
663 		     const struct folio *folio,
664 		     unsigned long long fend,
665 		     unsigned long long collected_to),
666 
667 	    TP_ARGS(wreq, folio, fend, collected_to),
668 
669 	    TP_STRUCT__entry(
670 		    __field(unsigned int,	wreq)
671 		    __field(unsigned long,	index)
672 		    __field(unsigned long long,	fend)
673 		    __field(unsigned long long,	cleaned_to)
674 		    __field(unsigned long long,	collected_to)
675 			     ),
676 
677 	    TP_fast_assign(
678 		    __entry->wreq	= wreq->debug_id;
679 		    __entry->index	= folio->index;
680 		    __entry->fend	= fend;
681 		    __entry->cleaned_to	= wreq->cleaned_to;
682 		    __entry->collected_to = collected_to;
683 			   ),
684 
685 	    TP_printk("R=%08x ix=%05lx r=%llx-%llx t=%llx/%llx",
686 		      __entry->wreq, __entry->index,
687 		      (unsigned long long)__entry->index * PAGE_SIZE, __entry->fend,
688 		      __entry->cleaned_to, __entry->collected_to)
689 	    );
690 
691 TRACE_EVENT(netfs_collect_state,
692 	    TP_PROTO(const struct netfs_io_request *wreq,
693 		     unsigned long long collected_to,
694 		     unsigned int notes),
695 
696 	    TP_ARGS(wreq, collected_to, notes),
697 
698 	    TP_STRUCT__entry(
699 		    __field(unsigned int,	wreq)
700 		    __field(unsigned int,	notes)
701 		    __field(unsigned long long,	collected_to)
702 		    __field(unsigned long long,	cleaned_to)
703 			     ),
704 
705 	    TP_fast_assign(
706 		    __entry->wreq	= wreq->debug_id;
707 		    __entry->notes	= notes;
708 		    __entry->collected_to = collected_to;
709 		    __entry->cleaned_to	= wreq->cleaned_to;
710 			   ),
711 
712 	    TP_printk("R=%08x col=%llx cln=%llx n=%x",
713 		      __entry->wreq, __entry->collected_to,
714 		      __entry->cleaned_to,
715 		      __entry->notes)
716 	    );
717 
718 TRACE_EVENT(netfs_collect_gap,
719 	    TP_PROTO(const struct netfs_io_request *wreq,
720 		     const struct netfs_io_stream *stream,
721 		     unsigned long long jump_to, char type),
722 
723 	    TP_ARGS(wreq, stream, jump_to, type),
724 
725 	    TP_STRUCT__entry(
726 		    __field(unsigned int,	wreq)
727 		    __field(unsigned char,	stream)
728 		    __field(unsigned char,	type)
729 		    __field(unsigned long long,	from)
730 		    __field(unsigned long long,	to)
731 			     ),
732 
733 	    TP_fast_assign(
734 		    __entry->wreq	= wreq->debug_id;
735 		    __entry->stream	= stream->stream_nr;
736 		    __entry->from	= stream->collected_to;
737 		    __entry->to		= jump_to;
738 		    __entry->type	= type;
739 			   ),
740 
741 	    TP_printk("R=%08x[%x:] %llx->%llx %c",
742 		      __entry->wreq, __entry->stream,
743 		      __entry->from, __entry->to, __entry->type)
744 	    );
745 
746 TRACE_EVENT(netfs_collect_stream,
747 	    TP_PROTO(const struct netfs_io_request *wreq,
748 		     const struct netfs_io_stream *stream),
749 
750 	    TP_ARGS(wreq, stream),
751 
752 	    TP_STRUCT__entry(
753 		    __field(unsigned int,	wreq)
754 		    __field(unsigned char,	stream)
755 		    __field(unsigned long long,	collected_to)
756 		    __field(unsigned long long,	issued_to)
757 			     ),
758 
759 	    TP_fast_assign(
760 		    __entry->wreq	= wreq->debug_id;
761 		    __entry->stream	= stream->stream_nr;
762 		    __entry->collected_to = stream->collected_to;
763 		    __entry->issued_to	= atomic64_read(&wreq->issued_to);
764 			   ),
765 
766 	    TP_printk("R=%08x[%x:] cto=%llx ito=%llx",
767 		      __entry->wreq, __entry->stream,
768 		      __entry->collected_to, __entry->issued_to)
769 	    );
770 
771 TRACE_EVENT(netfs_folioq,
772 	    TP_PROTO(const struct folio_queue *fq,
773 		     enum netfs_folioq_trace trace),
774 
775 	    TP_ARGS(fq, trace),
776 
777 	    TP_STRUCT__entry(
778 		    __field(unsigned int,		rreq)
779 		    __field(unsigned int,		id)
780 		    __field(enum netfs_folioq_trace,	trace)
781 			     ),
782 
783 	    TP_fast_assign(
784 		    __entry->rreq	= fq ? fq->rreq_id : 0;
785 		    __entry->id		= fq ? fq->debug_id : 0;
786 		    __entry->trace	= trace;
787 			   ),
788 
789 	    TP_printk("R=%08x fq=%x %s",
790 		      __entry->rreq, __entry->id,
791 		      __print_symbolic(__entry->trace, netfs_folioq_traces))
792 	    );
793 
794 TRACE_EVENT(netfs_read_progress_at,
795 	    TP_PROTO(const struct netfs_io_request *rreq),
796 
797 	    TP_ARGS(rreq),
798 
799 	    TP_STRUCT__entry(
800 		    __field(unsigned int,	rreq)
801 		    __field(size_t,		progress_at)
802 		    __field(size_t,		cleaned_to)
803 			     ),
804 
805 	    TP_fast_assign(
806 		    __entry->rreq	= rreq->debug_id;
807 		    __entry->cleaned_to	= rreq->cleaned_to - rreq->start;
808 		    __entry->progress_at = rreq->progress_at;
809 			   ),
810 
811 	    TP_printk("R=%08x cln=%zx prg=%zx",
812 		      __entry->rreq, __entry->cleaned_to, __entry->progress_at)
813 	    );
814 
815 #undef EM
816 #undef E_
817 #endif /* _TRACE_NETFS_H */
818 
819 /* This part must be outside protection */
820 #include <trace/define_trace.h>
821