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