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