1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* CacheFiles tracepoints 3 * 4 * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved. 5 * Written by David Howells (dhowells@redhat.com) 6 */ 7 #undef TRACE_SYSTEM 8 #define TRACE_SYSTEM cachefiles 9 10 #if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ) 11 #define _TRACE_CACHEFILES_H 12 13 #include <linux/tracepoint.h> 14 15 /* 16 * Define enums for tracing information. 17 */ 18 #ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY 19 #define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY 20 21 enum cachefiles_obj_ref_trace { 22 cachefiles_obj_put_wait_retry = fscache_obj_ref__nr_traces, 23 cachefiles_obj_put_wait_timeo, 24 cachefiles_obj_ref__nr_traces 25 }; 26 27 #endif 28 29 /* 30 * Define enum -> string mappings for display. 31 */ 32 #define cachefiles_obj_kill_traces \ 33 EM(FSCACHE_OBJECT_IS_STALE, "stale") \ 34 EM(FSCACHE_OBJECT_NO_SPACE, "no_space") \ 35 EM(FSCACHE_OBJECT_WAS_RETIRED, "was_retired") \ 36 E_(FSCACHE_OBJECT_WAS_CULLED, "was_culled") 37 38 #define cachefiles_obj_ref_traces \ 39 EM(fscache_obj_get_add_to_deps, "GET add_to_deps") \ 40 EM(fscache_obj_get_queue, "GET queue") \ 41 EM(fscache_obj_put_alloc_fail, "PUT alloc_fail") \ 42 EM(fscache_obj_put_attach_fail, "PUT attach_fail") \ 43 EM(fscache_obj_put_drop_obj, "PUT drop_obj") \ 44 EM(fscache_obj_put_enq_dep, "PUT enq_dep") \ 45 EM(fscache_obj_put_queue, "PUT queue") \ 46 EM(fscache_obj_put_work, "PUT work") \ 47 EM(cachefiles_obj_put_wait_retry, "PUT wait_retry") \ 48 E_(cachefiles_obj_put_wait_timeo, "PUT wait_timeo") 49 50 /* 51 * Export enum symbols via userspace. 52 */ 53 #undef EM 54 #undef E_ 55 #define EM(a, b) TRACE_DEFINE_ENUM(a); 56 #define E_(a, b) TRACE_DEFINE_ENUM(a); 57 58 cachefiles_obj_kill_traces; 59 cachefiles_obj_ref_traces; 60 61 /* 62 * Now redefine the EM() and E_() macros to map the enums to the strings that 63 * will be printed in the output. 64 */ 65 #undef EM 66 #undef E_ 67 #define EM(a, b) { a, b }, 68 #define E_(a, b) { a, b } 69 70 71 TRACE_EVENT(cachefiles_ref, 72 TP_PROTO(struct cachefiles_object *obj, 73 struct fscache_cookie *cookie, 74 enum cachefiles_obj_ref_trace why, 75 int usage), 76 77 TP_ARGS(obj, cookie, why, usage), 78 79 /* Note that obj may be NULL */ 80 TP_STRUCT__entry( 81 __field(unsigned int, obj ) 82 __field(unsigned int, cookie ) 83 __field(enum cachefiles_obj_ref_trace, why ) 84 __field(int, usage ) 85 ), 86 87 TP_fast_assign( 88 __entry->obj = obj->fscache.debug_id; 89 __entry->cookie = cookie->debug_id; 90 __entry->usage = usage; 91 __entry->why = why; 92 ), 93 94 TP_printk("c=%08x o=%08x u=%d %s", 95 __entry->cookie, __entry->obj, __entry->usage, 96 __print_symbolic(__entry->why, cachefiles_obj_ref_traces)) 97 ); 98 99 TRACE_EVENT(cachefiles_lookup, 100 TP_PROTO(struct cachefiles_object *obj, 101 struct dentry *de, 102 struct inode *inode), 103 104 TP_ARGS(obj, de, inode), 105 106 TP_STRUCT__entry( 107 __field(unsigned int, obj ) 108 __field(struct dentry *, de ) 109 __field(struct inode *, inode ) 110 ), 111 112 TP_fast_assign( 113 __entry->obj = obj->fscache.debug_id; 114 __entry->de = de; 115 __entry->inode = inode; 116 ), 117 118 TP_printk("o=%08x d=%p i=%p", 119 __entry->obj, __entry->de, __entry->inode) 120 ); 121 122 TRACE_EVENT(cachefiles_mkdir, 123 TP_PROTO(struct cachefiles_object *obj, 124 struct dentry *de, int ret), 125 126 TP_ARGS(obj, de, ret), 127 128 TP_STRUCT__entry( 129 __field(unsigned int, obj ) 130 __field(struct dentry *, de ) 131 __field(int, ret ) 132 ), 133 134 TP_fast_assign( 135 __entry->obj = obj->fscache.debug_id; 136 __entry->de = de; 137 __entry->ret = ret; 138 ), 139 140 TP_printk("o=%08x d=%p r=%u", 141 __entry->obj, __entry->de, __entry->ret) 142 ); 143 144 TRACE_EVENT(cachefiles_create, 145 TP_PROTO(struct cachefiles_object *obj, 146 struct dentry *de, int ret), 147 148 TP_ARGS(obj, de, ret), 149 150 TP_STRUCT__entry( 151 __field(unsigned int, obj ) 152 __field(struct dentry *, de ) 153 __field(int, ret ) 154 ), 155 156 TP_fast_assign( 157 __entry->obj = obj->fscache.debug_id; 158 __entry->de = de; 159 __entry->ret = ret; 160 ), 161 162 TP_printk("o=%08x d=%p r=%u", 163 __entry->obj, __entry->de, __entry->ret) 164 ); 165 166 TRACE_EVENT(cachefiles_unlink, 167 TP_PROTO(struct cachefiles_object *obj, 168 struct dentry *de, 169 enum fscache_why_object_killed why), 170 171 TP_ARGS(obj, de, why), 172 173 /* Note that obj may be NULL */ 174 TP_STRUCT__entry( 175 __field(unsigned int, obj ) 176 __field(struct dentry *, de ) 177 __field(enum fscache_why_object_killed, why ) 178 ), 179 180 TP_fast_assign( 181 __entry->obj = obj ? obj->fscache.debug_id : UINT_MAX; 182 __entry->de = de; 183 __entry->why = why; 184 ), 185 186 TP_printk("o=%08x d=%p w=%s", 187 __entry->obj, __entry->de, 188 __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) 189 ); 190 191 TRACE_EVENT(cachefiles_rename, 192 TP_PROTO(struct cachefiles_object *obj, 193 struct dentry *de, 194 struct dentry *to, 195 enum fscache_why_object_killed why), 196 197 TP_ARGS(obj, de, to, why), 198 199 /* Note that obj may be NULL */ 200 TP_STRUCT__entry( 201 __field(unsigned int, obj ) 202 __field(struct dentry *, de ) 203 __field(struct dentry *, to ) 204 __field(enum fscache_why_object_killed, why ) 205 ), 206 207 TP_fast_assign( 208 __entry->obj = obj ? obj->fscache.debug_id : UINT_MAX; 209 __entry->de = de; 210 __entry->to = to; 211 __entry->why = why; 212 ), 213 214 TP_printk("o=%08x d=%p t=%p w=%s", 215 __entry->obj, __entry->de, __entry->to, 216 __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) 217 ); 218 219 TRACE_EVENT(cachefiles_mark_active, 220 TP_PROTO(struct cachefiles_object *obj, 221 struct dentry *de), 222 223 TP_ARGS(obj, de), 224 225 /* Note that obj may be NULL */ 226 TP_STRUCT__entry( 227 __field(unsigned int, obj ) 228 __field(struct dentry *, de ) 229 ), 230 231 TP_fast_assign( 232 __entry->obj = obj->fscache.debug_id; 233 __entry->de = de; 234 ), 235 236 TP_printk("o=%08x d=%p", 237 __entry->obj, __entry->de) 238 ); 239 240 TRACE_EVENT(cachefiles_wait_active, 241 TP_PROTO(struct cachefiles_object *obj, 242 struct dentry *de, 243 struct cachefiles_object *xobj), 244 245 TP_ARGS(obj, de, xobj), 246 247 /* Note that obj may be NULL */ 248 TP_STRUCT__entry( 249 __field(unsigned int, obj ) 250 __field(unsigned int, xobj ) 251 __field(struct dentry *, de ) 252 __field(u16, flags ) 253 __field(u16, fsc_flags ) 254 ), 255 256 TP_fast_assign( 257 __entry->obj = obj->fscache.debug_id; 258 __entry->de = de; 259 __entry->xobj = xobj->fscache.debug_id; 260 __entry->flags = xobj->flags; 261 __entry->fsc_flags = xobj->fscache.flags; 262 ), 263 264 TP_printk("o=%08x d=%p wo=%08x wf=%x wff=%x", 265 __entry->obj, __entry->de, __entry->xobj, 266 __entry->flags, __entry->fsc_flags) 267 ); 268 269 TRACE_EVENT(cachefiles_mark_inactive, 270 TP_PROTO(struct cachefiles_object *obj, 271 struct dentry *de, 272 struct inode *inode), 273 274 TP_ARGS(obj, de, inode), 275 276 /* Note that obj may be NULL */ 277 TP_STRUCT__entry( 278 __field(unsigned int, obj ) 279 __field(struct dentry *, de ) 280 __field(struct inode *, inode ) 281 ), 282 283 TP_fast_assign( 284 __entry->obj = obj->fscache.debug_id; 285 __entry->de = de; 286 __entry->inode = inode; 287 ), 288 289 TP_printk("o=%08x d=%p i=%p", 290 __entry->obj, __entry->de, __entry->inode) 291 ); 292 293 TRACE_EVENT(cachefiles_mark_buried, 294 TP_PROTO(struct cachefiles_object *obj, 295 struct dentry *de, 296 enum fscache_why_object_killed why), 297 298 TP_ARGS(obj, de, why), 299 300 /* Note that obj may be NULL */ 301 TP_STRUCT__entry( 302 __field(unsigned int, obj ) 303 __field(struct dentry *, de ) 304 __field(enum fscache_why_object_killed, why ) 305 ), 306 307 TP_fast_assign( 308 __entry->obj = obj ? obj->fscache.debug_id : UINT_MAX; 309 __entry->de = de; 310 __entry->why = why; 311 ), 312 313 TP_printk("o=%08x d=%p w=%s", 314 __entry->obj, __entry->de, 315 __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) 316 ); 317 318 #endif /* _TRACE_CACHEFILES_H */ 319 320 /* This part must be outside protection */ 321 #include <trace/define_trace.h> 322