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 )
141 __entry->rreq = rreq->debug_id;
142 __entry->cookie = rreq->cookie_debug_id;
143 __entry->start = start;
145 __entry->what = what;
148 TP_printk("R=%08x %s c=%08x s=%llx %zx",
150 __print_symbolic(__entry->what, netfs_read_traces),
152 __entry->start, __entry->len)
155 TRACE_EVENT(netfs_rreq,
156 TP_PROTO(struct netfs_read_request *rreq,
157 enum netfs_rreq_trace what),
162 __field(unsigned int, rreq )
163 __field(unsigned short, flags )
164 __field(enum netfs_rreq_trace, what )
168 __entry->rreq = rreq->debug_id;
169 __entry->flags = rreq->flags;
170 __entry->what = what;
173 TP_printk("R=%08x %s f=%02x",
175 __print_symbolic(__entry->what, netfs_rreq_traces),
179 TRACE_EVENT(netfs_sreq,
180 TP_PROTO(struct netfs_read_subrequest *sreq,
181 enum netfs_sreq_trace what),
186 __field(unsigned int, rreq )
187 __field(unsigned short, index )
188 __field(short, error )
189 __field(unsigned short, flags )
190 __field(enum netfs_read_source, source )
191 __field(enum netfs_sreq_trace, what )
192 __field(size_t, len )
193 __field(size_t, transferred )
194 __field(loff_t, start )
198 __entry->rreq = sreq->rreq->debug_id;
199 __entry->index = sreq->debug_index;
200 __entry->error = sreq->error;
201 __entry->flags = sreq->flags;
202 __entry->source = sreq->source;
203 __entry->what = what;
204 __entry->len = sreq->len;
205 __entry->transferred = sreq->transferred;
206 __entry->start = sreq->start;
209 TP_printk("R=%08x[%u] %s %s f=%02x s=%llx %zx/%zx e=%d",
210 __entry->rreq, __entry->index,
211 __print_symbolic(__entry->what, netfs_sreq_traces),
212 __print_symbolic(__entry->source, netfs_sreq_sources),
214 __entry->start, __entry->transferred, __entry->len,
218 TRACE_EVENT(netfs_failure,
219 TP_PROTO(struct netfs_read_request *rreq,
220 struct netfs_read_subrequest *sreq,
221 int error, enum netfs_failure what),
223 TP_ARGS(rreq, sreq, error, what),
226 __field(unsigned int, rreq )
227 __field(unsigned short, index )
228 __field(short, error )
229 __field(unsigned short, flags )
230 __field(enum netfs_read_source, source )
231 __field(enum netfs_failure, what )
232 __field(size_t, len )
233 __field(size_t, transferred )
234 __field(loff_t, start )
238 __entry->rreq = rreq->debug_id;
239 __entry->index = sreq ? sreq->debug_index : 0;
240 __entry->error = error;
241 __entry->flags = sreq ? sreq->flags : 0;
242 __entry->source = sreq ? sreq->source : NETFS_INVALID_READ;
243 __entry->what = what;
244 __entry->len = sreq ? sreq->len : 0;
245 __entry->transferred = sreq ? sreq->transferred : 0;
246 __entry->start = sreq ? sreq->start : 0;
249 TP_printk("R=%08x[%u] %s f=%02x s=%llx %zx/%zx %s e=%d",
250 __entry->rreq, __entry->index,
251 __print_symbolic(__entry->source, netfs_sreq_sources),
253 __entry->start, __entry->transferred, __entry->len,
254 __print_symbolic(__entry->what, netfs_failures),
258 #endif /* _TRACE_NETFS_H */
260 /* This part must be outside protection */
261 #include <trace/define_trace.h>