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>