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 #ifndef __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
19 #define __NETFS_DECLARE_TRACE_ENUMS_ONCE_ONLY
21 enum netfs_read_trace {
22 netfs_read_trace_expanded,
23 netfs_read_trace_readahead,
24 netfs_read_trace_readpage,
25 netfs_read_trace_write_begin,
28 enum netfs_rreq_trace {
29 netfs_rreq_trace_assess,
30 netfs_rreq_trace_done,
31 netfs_rreq_trace_free,
32 netfs_rreq_trace_resubmit,
33 netfs_rreq_trace_unlock,
34 netfs_rreq_trace_unmark,
35 netfs_rreq_trace_write,
38 enum netfs_sreq_trace {
39 netfs_sreq_trace_download_instead,
40 netfs_sreq_trace_free,
41 netfs_sreq_trace_prepare,
42 netfs_sreq_trace_resubmit_short,
43 netfs_sreq_trace_submit,
44 netfs_sreq_trace_terminated,
45 netfs_sreq_trace_write,
46 netfs_sreq_trace_write_skip,
47 netfs_sreq_trace_write_term,
51 netfs_fail_check_write_begin,
52 netfs_fail_copy_to_cache,
54 netfs_fail_short_readpage,
55 netfs_fail_short_write_begin,
56 netfs_fail_prepare_write,
61 #define netfs_read_traces \
62 EM(netfs_read_trace_expanded, "EXPANDED ") \
63 EM(netfs_read_trace_readahead, "READAHEAD") \
64 EM(netfs_read_trace_readpage, "READPAGE ") \
65 E_(netfs_read_trace_write_begin, "WRITEBEGN")
67 #define netfs_rreq_traces \
68 EM(netfs_rreq_trace_assess, "ASSESS") \
69 EM(netfs_rreq_trace_done, "DONE ") \
70 EM(netfs_rreq_trace_free, "FREE ") \
71 EM(netfs_rreq_trace_resubmit, "RESUBM") \
72 EM(netfs_rreq_trace_unlock, "UNLOCK") \
73 EM(netfs_rreq_trace_unmark, "UNMARK") \
74 E_(netfs_rreq_trace_write, "WRITE ")
76 #define netfs_sreq_sources \
77 EM(NETFS_FILL_WITH_ZEROES, "ZERO") \
78 EM(NETFS_DOWNLOAD_FROM_SERVER, "DOWN") \
79 EM(NETFS_READ_FROM_CACHE, "READ") \
80 E_(NETFS_INVALID_READ, "INVL") \
82 #define netfs_sreq_traces \
83 EM(netfs_sreq_trace_download_instead, "RDOWN") \
84 EM(netfs_sreq_trace_free, "FREE ") \
85 EM(netfs_sreq_trace_prepare, "PREP ") \
86 EM(netfs_sreq_trace_resubmit_short, "SHORT") \
87 EM(netfs_sreq_trace_submit, "SUBMT") \
88 EM(netfs_sreq_trace_terminated, "TERM ") \
89 EM(netfs_sreq_trace_write, "WRITE") \
90 EM(netfs_sreq_trace_write_skip, "SKIP ") \
91 E_(netfs_sreq_trace_write_term, "WTERM")
93 #define netfs_failures \
94 EM(netfs_fail_check_write_begin, "check-write-begin") \
95 EM(netfs_fail_copy_to_cache, "copy-to-cache") \
96 EM(netfs_fail_read, "read") \
97 EM(netfs_fail_short_readpage, "short-readpage") \
98 EM(netfs_fail_short_write_begin, "short-write-begin") \
99 E_(netfs_fail_prepare_write, "prep-write")
103 * Export enum symbols via userspace.
107 #define EM(a, b) TRACE_DEFINE_ENUM(a);
108 #define E_(a, b) TRACE_DEFINE_ENUM(a);
117 * Now redefine the EM() and E_() macros to map the enums to the strings that
118 * will be printed in the output.
122 #define EM(a, b) { a, b },
123 #define E_(a, b) { a, b }
125 TRACE_EVENT(netfs_read,
126 TP_PROTO(struct netfs_read_request *rreq,
127 loff_t start, size_t len,
128 enum netfs_read_trace what),
130 TP_ARGS(rreq, start, len, what),
133 __field(unsigned int, rreq )
134 __field(unsigned int, cookie )
135 __field(loff_t, start )
136 __field(size_t, len )
137 __field(enum netfs_read_trace, what )
138 __field(unsigned int, netfs_inode )
142 __entry->rreq = rreq->debug_id;
143 __entry->cookie = rreq->cache_resources.debug_id;
144 __entry->start = start;
146 __entry->what = what;
147 __entry->netfs_inode = rreq->inode->i_ino;
150 TP_printk("R=%08x %s c=%08x ni=%x s=%llx %zx",
152 __print_symbolic(__entry->what, netfs_read_traces),
154 __entry->netfs_inode,
155 __entry->start, __entry->len)
158 TRACE_EVENT(netfs_rreq,
159 TP_PROTO(struct netfs_read_request *rreq,
160 enum netfs_rreq_trace what),
165 __field(unsigned int, rreq )
166 __field(unsigned short, flags )
167 __field(enum netfs_rreq_trace, what )
171 __entry->rreq = rreq->debug_id;
172 __entry->flags = rreq->flags;
173 __entry->what = what;
176 TP_printk("R=%08x %s f=%02x",
178 __print_symbolic(__entry->what, netfs_rreq_traces),
182 TRACE_EVENT(netfs_sreq,
183 TP_PROTO(struct netfs_read_subrequest *sreq,
184 enum netfs_sreq_trace what),
189 __field(unsigned int, rreq )
190 __field(unsigned short, index )
191 __field(short, error )
192 __field(unsigned short, flags )
193 __field(enum netfs_read_source, source )
194 __field(enum netfs_sreq_trace, what )
195 __field(size_t, len )
196 __field(size_t, transferred )
197 __field(loff_t, start )
201 __entry->rreq = sreq->rreq->debug_id;
202 __entry->index = sreq->debug_index;
203 __entry->error = sreq->error;
204 __entry->flags = sreq->flags;
205 __entry->source = sreq->source;
206 __entry->what = what;
207 __entry->len = sreq->len;
208 __entry->transferred = sreq->transferred;
209 __entry->start = sreq->start;
212 TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx/%zx e=%d",
213 __entry->rreq, __entry->index,
214 __print_symbolic(__entry->what, netfs_sreq_traces),
215 __print_symbolic(__entry->source, netfs_sreq_sources),
217 __entry->start, __entry->transferred, __entry->len,
221 TRACE_EVENT(netfs_failure,
222 TP_PROTO(struct netfs_read_request *rreq,
223 struct netfs_read_subrequest *sreq,
224 int error, enum netfs_failure what),
226 TP_ARGS(rreq, sreq, error, what),
229 __field(unsigned int, rreq )
230 __field(unsigned short, index )
231 __field(short, error )
232 __field(unsigned short, flags )
233 __field(enum netfs_read_source, source )
234 __field(enum netfs_failure, what )
235 __field(size_t, len )
236 __field(size_t, transferred )
237 __field(loff_t, start )
241 __entry->rreq = rreq->debug_id;
242 __entry->index = sreq ? sreq->debug_index : 0;
243 __entry->error = error;
244 __entry->flags = sreq ? sreq->flags : 0;
245 __entry->source = sreq ? sreq->source : NETFS_INVALID_READ;
246 __entry->what = what;
247 __entry->len = sreq ? sreq->len : 0;
248 __entry->transferred = sreq ? sreq->transferred : 0;
249 __entry->start = sreq ? sreq->start : 0;
252 TP_printk("R=%08x[%u] %s f=%02x s=%llx %zx/%zx %s e=%d",
253 __entry->rreq, __entry->index,
254 __print_symbolic(__entry->source, netfs_sreq_sources),
256 __entry->start, __entry->transferred, __entry->len,
257 __print_symbolic(__entry->what, netfs_failures),
261 #endif /* _TRACE_NETFS_H */
263 /* This part must be outside protection */
264 #include <trace/define_trace.h>