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_expanded,		"EXPANDED ")	\
 20	EM(netfs_read_trace_readahead,		"READAHEAD")	\
 21	EM(netfs_read_trace_readpage,		"READPAGE ")	\
 22	E_(netfs_read_trace_write_begin,	"WRITEBEGN")
 23
 24#define netfs_rreq_origins					\
 25	EM(NETFS_READAHEAD,			"RA")		\
 26	EM(NETFS_READPAGE,			"RP")		\
 27	E_(NETFS_READ_FOR_WRITE,		"RW")
 28
 29#define netfs_rreq_traces					\
 30	EM(netfs_rreq_trace_assess,		"ASSESS ")	\
 31	EM(netfs_rreq_trace_copy,		"COPY   ")	\
 32	EM(netfs_rreq_trace_done,		"DONE   ")	\
 33	EM(netfs_rreq_trace_free,		"FREE   ")	\
 34	EM(netfs_rreq_trace_resubmit,		"RESUBMT")	\
 35	EM(netfs_rreq_trace_unlock,		"UNLOCK ")	\
 36	E_(netfs_rreq_trace_unmark,		"UNMARK ")
 37
 38#define netfs_sreq_sources					\
 39	EM(NETFS_FILL_WITH_ZEROES,		"ZERO")		\
 40	EM(NETFS_DOWNLOAD_FROM_SERVER,		"DOWN")		\
 41	EM(NETFS_READ_FROM_CACHE,		"READ")		\
 42	E_(NETFS_INVALID_READ,			"INVL")		\
 43
 44#define netfs_sreq_traces					\
 45	EM(netfs_sreq_trace_download_instead,	"RDOWN")	\
 46	EM(netfs_sreq_trace_free,		"FREE ")	\
 47	EM(netfs_sreq_trace_prepare,		"PREP ")	\
 48	EM(netfs_sreq_trace_resubmit_short,	"SHORT")	\
 49	EM(netfs_sreq_trace_submit,		"SUBMT")	\
 50	EM(netfs_sreq_trace_terminated,		"TERM ")	\
 51	EM(netfs_sreq_trace_write,		"WRITE")	\
 52	EM(netfs_sreq_trace_write_skip,		"SKIP ")	\
 53	E_(netfs_sreq_trace_write_term,		"WTERM")
 54
 55#define netfs_failures							\
 56	EM(netfs_fail_check_write_begin,	"check-write-begin")	\
 57	EM(netfs_fail_copy_to_cache,		"copy-to-cache")	\
 58	EM(netfs_fail_read,			"read")			\
 59	EM(netfs_fail_short_read,		"short-read")		\
 60	E_(netfs_fail_prepare_write,		"prep-write")
 61
 62#define netfs_rreq_ref_traces					\
 63	EM(netfs_rreq_trace_get_hold,		"GET HOLD   ")	\
 64	EM(netfs_rreq_trace_get_subreq,		"GET SUBREQ ")	\
 65	EM(netfs_rreq_trace_put_complete,	"PUT COMPLT ")	\
 66	EM(netfs_rreq_trace_put_discard,	"PUT DISCARD")	\
 67	EM(netfs_rreq_trace_put_failed,		"PUT FAILED ")	\
 68	EM(netfs_rreq_trace_put_hold,		"PUT HOLD   ")	\
 69	EM(netfs_rreq_trace_put_subreq,		"PUT SUBREQ ")	\
 70	EM(netfs_rreq_trace_put_zero_len,	"PUT ZEROLEN")	\
 71	E_(netfs_rreq_trace_new,		"NEW        ")
 72
 73#define netfs_sreq_ref_traces					\
 74	EM(netfs_sreq_trace_get_copy_to_cache,	"GET COPY2C ")	\
 75	EM(netfs_sreq_trace_get_resubmit,	"GET RESUBMIT")	\
 76	EM(netfs_sreq_trace_get_short_read,	"GET SHORTRD")	\
 77	EM(netfs_sreq_trace_new,		"NEW        ")	\
 78	EM(netfs_sreq_trace_put_clear,		"PUT CLEAR  ")	\
 79	EM(netfs_sreq_trace_put_failed,		"PUT FAILED ")	\
 80	EM(netfs_sreq_trace_put_merged,		"PUT MERGED ")	\
 81	EM(netfs_sreq_trace_put_no_copy,	"PUT NO COPY")	\
 82	E_(netfs_sreq_trace_put_terminated,	"PUT TERM   ")
 83
 84#ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
 85#define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
 86
 87#undef EM
 88#undef E_
 89#define EM(a, b) a,
 90#define E_(a, b) a
 91
 92enum netfs_read_trace { netfs_read_traces } __mode(byte);
 93enum netfs_rreq_trace { netfs_rreq_traces } __mode(byte);
 94enum netfs_sreq_trace { netfs_sreq_traces } __mode(byte);
 95enum netfs_failure { netfs_failures } __mode(byte);
 96enum netfs_rreq_ref_trace { netfs_rreq_ref_traces } __mode(byte);
 97enum netfs_sreq_ref_trace { netfs_sreq_ref_traces } __mode(byte);
 98
 99#endif
100
101/*
102 * Export enum symbols via userspace.
103 */
104#undef EM
105#undef E_
106#define EM(a, b) TRACE_DEFINE_ENUM(a);
107#define E_(a, b) TRACE_DEFINE_ENUM(a);
108
109netfs_read_traces;
110netfs_rreq_origins;
111netfs_rreq_traces;
112netfs_sreq_sources;
113netfs_sreq_traces;
114netfs_failures;
115netfs_rreq_ref_traces;
116netfs_sreq_ref_traces;
117
118/*
119 * Now redefine the EM() and E_() macros to map the enums to the strings that
120 * will be printed in the output.
121 */
122#undef EM
123#undef E_
124#define EM(a, b)	{ a, b },
125#define E_(a, b)	{ a, b }
126
127TRACE_EVENT(netfs_read,
128	    TP_PROTO(struct netfs_io_request *rreq,
129		     loff_t start, size_t len,
130		     enum netfs_read_trace what),
131
132	    TP_ARGS(rreq, start, len, what),
133
134	    TP_STRUCT__entry(
135		    __field(unsigned int,		rreq		)
136		    __field(unsigned int,		cookie		)
137		    __field(loff_t,			start		)
138		    __field(size_t,			len		)
139		    __field(enum netfs_read_trace,	what		)
140		    __field(unsigned int,		netfs_inode	)
141			     ),
142
143	    TP_fast_assign(
144		    __entry->rreq	= rreq->debug_id;
145		    __entry->cookie	= rreq->cache_resources.debug_id;
146		    __entry->start	= start;
147		    __entry->len	= len;
148		    __entry->what	= what;
149		    __entry->netfs_inode = rreq->inode->i_ino;
150			   ),
151
152	    TP_printk("R=%08x %s c=%08x ni=%x s=%llx %zx",
153		      __entry->rreq,
154		      __print_symbolic(__entry->what, netfs_read_traces),
155		      __entry->cookie,
156		      __entry->netfs_inode,
157		      __entry->start, __entry->len)
158	    );
159
160TRACE_EVENT(netfs_rreq,
161	    TP_PROTO(struct netfs_io_request *rreq,
162		     enum netfs_rreq_trace what),
163
164	    TP_ARGS(rreq, what),
165
166	    TP_STRUCT__entry(
167		    __field(unsigned int,		rreq		)
168		    __field(unsigned int,		flags		)
169		    __field(enum netfs_io_origin,	origin		)
170		    __field(enum netfs_rreq_trace,	what		)
171			     ),
172
173	    TP_fast_assign(
174		    __entry->rreq	= rreq->debug_id;
175		    __entry->flags	= rreq->flags;
176		    __entry->origin	= rreq->origin;
177		    __entry->what	= what;
178			   ),
179
180	    TP_printk("R=%08x %s %s f=%02x",
181		      __entry->rreq,
182		      __print_symbolic(__entry->origin, netfs_rreq_origins),
183		      __print_symbolic(__entry->what, netfs_rreq_traces),
184		      __entry->flags)
185	    );
186
187TRACE_EVENT(netfs_sreq,
188	    TP_PROTO(struct netfs_io_subrequest *sreq,
189		     enum netfs_sreq_trace what),
190
191	    TP_ARGS(sreq, what),
192
193	    TP_STRUCT__entry(
194		    __field(unsigned int,		rreq		)
195		    __field(unsigned short,		index		)
196		    __field(short,			error		)
197		    __field(unsigned short,		flags		)
198		    __field(enum netfs_io_source,	source		)
199		    __field(enum netfs_sreq_trace,	what		)
200		    __field(size_t,			len		)
201		    __field(size_t,			transferred	)
202		    __field(loff_t,			start		)
203			     ),
204
205	    TP_fast_assign(
206		    __entry->rreq	= sreq->rreq->debug_id;
207		    __entry->index	= sreq->debug_index;
208		    __entry->error	= sreq->error;
209		    __entry->flags	= sreq->flags;
210		    __entry->source	= sreq->source;
211		    __entry->what	= what;
212		    __entry->len	= sreq->len;
213		    __entry->transferred = sreq->transferred;
214		    __entry->start	= sreq->start;
215			   ),
216
217	    TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx/%zx e=%d",
218		      __entry->rreq, __entry->index,
219		      __print_symbolic(__entry->source, netfs_sreq_sources),
220		      __print_symbolic(__entry->what, netfs_sreq_traces),
221		      __entry->flags,
222		      __entry->start, __entry->transferred, __entry->len,
223		      __entry->error)
224	    );
225
226TRACE_EVENT(netfs_failure,
227	    TP_PROTO(struct netfs_io_request *rreq,
228		     struct netfs_io_subrequest *sreq,
229		     int error, enum netfs_failure what),
230
231	    TP_ARGS(rreq, sreq, error, what),
232
233	    TP_STRUCT__entry(
234		    __field(unsigned int,		rreq		)
235		    __field(short,			index		)
236		    __field(short,			error		)
237		    __field(unsigned short,		flags		)
238		    __field(enum netfs_io_source,	source		)
239		    __field(enum netfs_failure,		what		)
240		    __field(size_t,			len		)
241		    __field(size_t,			transferred	)
242		    __field(loff_t,			start		)
243			     ),
244
245	    TP_fast_assign(
246		    __entry->rreq	= rreq->debug_id;
247		    __entry->index	= sreq ? sreq->debug_index : -1;
248		    __entry->error	= error;
249		    __entry->flags	= sreq ? sreq->flags : 0;
250		    __entry->source	= sreq ? sreq->source : NETFS_INVALID_READ;
251		    __entry->what	= what;
252		    __entry->len	= sreq ? sreq->len : rreq->len;
253		    __entry->transferred = sreq ? sreq->transferred : 0;
254		    __entry->start	= sreq ? sreq->start : 0;
255			   ),
256
257	    TP_printk("R=%08x[%d] %s f=%02x s=%llx %zx/%zx %s e=%d",
258		      __entry->rreq, __entry->index,
259		      __print_symbolic(__entry->source, netfs_sreq_sources),
260		      __entry->flags,
261		      __entry->start, __entry->transferred, __entry->len,
262		      __print_symbolic(__entry->what, netfs_failures),
263		      __entry->error)
264	    );
265
266TRACE_EVENT(netfs_rreq_ref,
267	    TP_PROTO(unsigned int rreq_debug_id, int ref,
268		     enum netfs_rreq_ref_trace what),
269
270	    TP_ARGS(rreq_debug_id, ref, what),
271
272	    TP_STRUCT__entry(
273		    __field(unsigned int,		rreq		)
274		    __field(int,			ref		)
275		    __field(enum netfs_rreq_ref_trace,	what		)
276			     ),
277
278	    TP_fast_assign(
279		    __entry->rreq	= rreq_debug_id;
280		    __entry->ref	= ref;
281		    __entry->what	= what;
282			   ),
283
284	    TP_printk("R=%08x %s r=%u",
285		      __entry->rreq,
286		      __print_symbolic(__entry->what, netfs_rreq_ref_traces),
287		      __entry->ref)
288	    );
289
290TRACE_EVENT(netfs_sreq_ref,
291	    TP_PROTO(unsigned int rreq_debug_id, unsigned int subreq_debug_index,
292		     int ref, enum netfs_sreq_ref_trace what),
293
294	    TP_ARGS(rreq_debug_id, subreq_debug_index, ref, what),
295
296	    TP_STRUCT__entry(
297		    __field(unsigned int,		rreq		)
298		    __field(unsigned int,		subreq		)
299		    __field(int,			ref		)
300		    __field(enum netfs_sreq_ref_trace,	what		)
301			     ),
302
303	    TP_fast_assign(
304		    __entry->rreq	= rreq_debug_id;
305		    __entry->subreq	= subreq_debug_index;
306		    __entry->ref	= ref;
307		    __entry->what	= what;
308			   ),
309
310	    TP_printk("R=%08x[%x] %s r=%u",
311		      __entry->rreq,
312		      __entry->subreq,
313		      __print_symbolic(__entry->what, netfs_sreq_ref_traces),
314		      __entry->ref)
315	    );
316
317#undef EM
318#undef E_
319#endif /* _TRACE_NETFS_H */
320
321/* This part must be outside protection */
322#include <trace/define_trace.h>