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