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