Linux Audio

Check our new training course

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