Linux Audio

Check our new training course

Loading...
Note: File does not exist in v5.4.
  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>