1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 /* Network filesystem support module tracepoints
4 * Copyright (C) 2021 Red Hat, Inc. All Rights Reserved.
5 * Written by David Howells (dhowells@redhat.com)
8 #define TRACE_SYSTEM netfs
10 #if !defined(_TRACE_NETFS_H) || defined(TRACE_HEADER_MULTI_READ)
11 #define _TRACE_NETFS_H
13 #include <linux/tracepoint.h>
16 * Define enums for tracing information.
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")
24 #define netfs_rreq_origins \
25 EM(NETFS_READAHEAD, "RA") \
26 EM(NETFS_READPAGE, "RP") \
27 E_(NETFS_READ_FOR_WRITE, "RW")
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 ")
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") \
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")
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")
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 ")
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 ")
84 #ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
85 #define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
92 enum netfs_read_trace { netfs_read_traces } __mode(byte);
93 enum netfs_rreq_trace { netfs_rreq_traces } __mode(byte);
94 enum netfs_sreq_trace { netfs_sreq_traces } __mode(byte);
95 enum netfs_failure { netfs_failures } __mode(byte);
96 enum netfs_rreq_ref_trace { netfs_rreq_ref_traces } __mode(byte);
97 enum netfs_sreq_ref_trace { netfs_sreq_ref_traces } __mode(byte);
102 * Export enum symbols via userspace.
106 #define EM(a, b) TRACE_DEFINE_ENUM(a);
107 #define E_(a, b) TRACE_DEFINE_ENUM(a);
115 netfs_rreq_ref_traces;
116 netfs_sreq_ref_traces;
119 * Now redefine the EM() and E_() macros to map the enums to the strings that
120 * will be printed in the output.
124 #define EM(a, b) { a, b },
125 #define E_(a, b) { a, b }
127 TRACE_EVENT(netfs_read,
128 TP_PROTO(struct netfs_io_request *rreq,
129 loff_t start, size_t len,
130 enum netfs_read_trace what),
132 TP_ARGS(rreq, start, len, what),
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 )
144 __entry->rreq = rreq->debug_id;
145 __entry->cookie = rreq->cache_resources.debug_id;
146 __entry->start = start;
148 __entry->what = what;
149 __entry->netfs_inode = rreq->inode->i_ino;
152 TP_printk("R=%08x %s c=%08x ni=%x s=%llx %zx",
154 __print_symbolic(__entry->what, netfs_read_traces),
156 __entry->netfs_inode,
157 __entry->start, __entry->len)
160 TRACE_EVENT(netfs_rreq,
161 TP_PROTO(struct netfs_io_request *rreq,
162 enum netfs_rreq_trace what),
167 __field(unsigned int, rreq )
168 __field(unsigned int, flags )
169 __field(enum netfs_io_origin, origin )
170 __field(enum netfs_rreq_trace, what )
174 __entry->rreq = rreq->debug_id;
175 __entry->flags = rreq->flags;
176 __entry->origin = rreq->origin;
177 __entry->what = what;
180 TP_printk("R=%08x %s %s f=%02x",
182 __print_symbolic(__entry->origin, netfs_rreq_origins),
183 __print_symbolic(__entry->what, netfs_rreq_traces),
187 TRACE_EVENT(netfs_sreq,
188 TP_PROTO(struct netfs_io_subrequest *sreq,
189 enum netfs_sreq_trace what),
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 )
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;
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),
222 __entry->start, __entry->transferred, __entry->len,
226 TRACE_EVENT(netfs_failure,
227 TP_PROTO(struct netfs_io_request *rreq,
228 struct netfs_io_subrequest *sreq,
229 int error, enum netfs_failure what),
231 TP_ARGS(rreq, sreq, error, what),
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 )
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;
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),
261 __entry->start, __entry->transferred, __entry->len,
262 __print_symbolic(__entry->what, netfs_failures),
266 TRACE_EVENT(netfs_rreq_ref,
267 TP_PROTO(unsigned int rreq_debug_id, int ref,
268 enum netfs_rreq_ref_trace what),
270 TP_ARGS(rreq_debug_id, ref, what),
273 __field(unsigned int, rreq )
275 __field(enum netfs_rreq_ref_trace, what )
279 __entry->rreq = rreq_debug_id;
281 __entry->what = what;
284 TP_printk("R=%08x %s r=%u",
286 __print_symbolic(__entry->what, netfs_rreq_ref_traces),
290 TRACE_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),
294 TP_ARGS(rreq_debug_id, subreq_debug_index, ref, what),
297 __field(unsigned int, rreq )
298 __field(unsigned int, subreq )
300 __field(enum netfs_sreq_ref_trace, what )
304 __entry->rreq = rreq_debug_id;
305 __entry->subreq = subreq_debug_index;
307 __entry->what = what;
310 TP_printk("R=%08x[%x] %s r=%u",
313 __print_symbolic(__entry->what, netfs_sreq_ref_traces),
319 #endif /* _TRACE_NETFS_H */
321 /* This part must be outside protection */
322 #include <trace/define_trace.h>