18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 28c2ecf20Sopenharmony_ci/* CacheFiles tracepoints 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved. 58c2ecf20Sopenharmony_ci * Written by David Howells (dhowells@redhat.com) 68c2ecf20Sopenharmony_ci */ 78c2ecf20Sopenharmony_ci#undef TRACE_SYSTEM 88c2ecf20Sopenharmony_ci#define TRACE_SYSTEM cachefiles 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ) 118c2ecf20Sopenharmony_ci#define _TRACE_CACHEFILES_H 128c2ecf20Sopenharmony_ci 138c2ecf20Sopenharmony_ci#include <linux/tracepoint.h> 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/* 168c2ecf20Sopenharmony_ci * Define enums for tracing information. 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ci#ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY 198c2ecf20Sopenharmony_ci#define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_cienum cachefiles_obj_ref_trace { 228c2ecf20Sopenharmony_ci cachefiles_obj_put_wait_retry = fscache_obj_ref__nr_traces, 238c2ecf20Sopenharmony_ci cachefiles_obj_put_wait_timeo, 248c2ecf20Sopenharmony_ci cachefiles_obj_ref__nr_traces 258c2ecf20Sopenharmony_ci}; 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_ci#endif 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci/* 308c2ecf20Sopenharmony_ci * Define enum -> string mappings for display. 318c2ecf20Sopenharmony_ci */ 328c2ecf20Sopenharmony_ci#define cachefiles_obj_kill_traces \ 338c2ecf20Sopenharmony_ci EM(FSCACHE_OBJECT_IS_STALE, "stale") \ 348c2ecf20Sopenharmony_ci EM(FSCACHE_OBJECT_NO_SPACE, "no_space") \ 358c2ecf20Sopenharmony_ci EM(FSCACHE_OBJECT_WAS_RETIRED, "was_retired") \ 368c2ecf20Sopenharmony_ci E_(FSCACHE_OBJECT_WAS_CULLED, "was_culled") 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci#define cachefiles_obj_ref_traces \ 398c2ecf20Sopenharmony_ci EM(fscache_obj_get_add_to_deps, "GET add_to_deps") \ 408c2ecf20Sopenharmony_ci EM(fscache_obj_get_queue, "GET queue") \ 418c2ecf20Sopenharmony_ci EM(fscache_obj_put_alloc_fail, "PUT alloc_fail") \ 428c2ecf20Sopenharmony_ci EM(fscache_obj_put_attach_fail, "PUT attach_fail") \ 438c2ecf20Sopenharmony_ci EM(fscache_obj_put_drop_obj, "PUT drop_obj") \ 448c2ecf20Sopenharmony_ci EM(fscache_obj_put_enq_dep, "PUT enq_dep") \ 458c2ecf20Sopenharmony_ci EM(fscache_obj_put_queue, "PUT queue") \ 468c2ecf20Sopenharmony_ci EM(fscache_obj_put_work, "PUT work") \ 478c2ecf20Sopenharmony_ci EM(cachefiles_obj_put_wait_retry, "PUT wait_retry") \ 488c2ecf20Sopenharmony_ci E_(cachefiles_obj_put_wait_timeo, "PUT wait_timeo") 498c2ecf20Sopenharmony_ci 508c2ecf20Sopenharmony_ci/* 518c2ecf20Sopenharmony_ci * Export enum symbols via userspace. 528c2ecf20Sopenharmony_ci */ 538c2ecf20Sopenharmony_ci#undef EM 548c2ecf20Sopenharmony_ci#undef E_ 558c2ecf20Sopenharmony_ci#define EM(a, b) TRACE_DEFINE_ENUM(a); 568c2ecf20Sopenharmony_ci#define E_(a, b) TRACE_DEFINE_ENUM(a); 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_cicachefiles_obj_kill_traces; 598c2ecf20Sopenharmony_cicachefiles_obj_ref_traces; 608c2ecf20Sopenharmony_ci 618c2ecf20Sopenharmony_ci/* 628c2ecf20Sopenharmony_ci * Now redefine the EM() and E_() macros to map the enums to the strings that 638c2ecf20Sopenharmony_ci * will be printed in the output. 648c2ecf20Sopenharmony_ci */ 658c2ecf20Sopenharmony_ci#undef EM 668c2ecf20Sopenharmony_ci#undef E_ 678c2ecf20Sopenharmony_ci#define EM(a, b) { a, b }, 688c2ecf20Sopenharmony_ci#define E_(a, b) { a, b } 698c2ecf20Sopenharmony_ci 708c2ecf20Sopenharmony_ci 718c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_ref, 728c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 738c2ecf20Sopenharmony_ci struct fscache_cookie *cookie, 748c2ecf20Sopenharmony_ci enum cachefiles_obj_ref_trace why, 758c2ecf20Sopenharmony_ci int usage), 768c2ecf20Sopenharmony_ci 778c2ecf20Sopenharmony_ci TP_ARGS(obj, cookie, why, usage), 788c2ecf20Sopenharmony_ci 798c2ecf20Sopenharmony_ci /* Note that obj may be NULL */ 808c2ecf20Sopenharmony_ci TP_STRUCT__entry( 818c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 828c2ecf20Sopenharmony_ci __field(struct fscache_cookie *, cookie ) 838c2ecf20Sopenharmony_ci __field(enum cachefiles_obj_ref_trace, why ) 848c2ecf20Sopenharmony_ci __field(int, usage ) 858c2ecf20Sopenharmony_ci ), 868c2ecf20Sopenharmony_ci 878c2ecf20Sopenharmony_ci TP_fast_assign( 888c2ecf20Sopenharmony_ci __entry->obj = obj; 898c2ecf20Sopenharmony_ci __entry->cookie = cookie; 908c2ecf20Sopenharmony_ci __entry->usage = usage; 918c2ecf20Sopenharmony_ci __entry->why = why; 928c2ecf20Sopenharmony_ci ), 938c2ecf20Sopenharmony_ci 948c2ecf20Sopenharmony_ci TP_printk("c=%p o=%p u=%d %s", 958c2ecf20Sopenharmony_ci __entry->cookie, __entry->obj, __entry->usage, 968c2ecf20Sopenharmony_ci __print_symbolic(__entry->why, cachefiles_obj_ref_traces)) 978c2ecf20Sopenharmony_ci ); 988c2ecf20Sopenharmony_ci 998c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_lookup, 1008c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 1018c2ecf20Sopenharmony_ci struct dentry *de, 1028c2ecf20Sopenharmony_ci struct inode *inode), 1038c2ecf20Sopenharmony_ci 1048c2ecf20Sopenharmony_ci TP_ARGS(obj, de, inode), 1058c2ecf20Sopenharmony_ci 1068c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1078c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 1088c2ecf20Sopenharmony_ci __field(struct dentry *, de ) 1098c2ecf20Sopenharmony_ci __field(struct inode *, inode ) 1108c2ecf20Sopenharmony_ci ), 1118c2ecf20Sopenharmony_ci 1128c2ecf20Sopenharmony_ci TP_fast_assign( 1138c2ecf20Sopenharmony_ci __entry->obj = obj; 1148c2ecf20Sopenharmony_ci __entry->de = de; 1158c2ecf20Sopenharmony_ci __entry->inode = inode; 1168c2ecf20Sopenharmony_ci ), 1178c2ecf20Sopenharmony_ci 1188c2ecf20Sopenharmony_ci TP_printk("o=%p d=%p i=%p", 1198c2ecf20Sopenharmony_ci __entry->obj, __entry->de, __entry->inode) 1208c2ecf20Sopenharmony_ci ); 1218c2ecf20Sopenharmony_ci 1228c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_mkdir, 1238c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 1248c2ecf20Sopenharmony_ci struct dentry *de, int ret), 1258c2ecf20Sopenharmony_ci 1268c2ecf20Sopenharmony_ci TP_ARGS(obj, de, ret), 1278c2ecf20Sopenharmony_ci 1288c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1298c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 1308c2ecf20Sopenharmony_ci __field(struct dentry *, de ) 1318c2ecf20Sopenharmony_ci __field(int, ret ) 1328c2ecf20Sopenharmony_ci ), 1338c2ecf20Sopenharmony_ci 1348c2ecf20Sopenharmony_ci TP_fast_assign( 1358c2ecf20Sopenharmony_ci __entry->obj = obj; 1368c2ecf20Sopenharmony_ci __entry->de = de; 1378c2ecf20Sopenharmony_ci __entry->ret = ret; 1388c2ecf20Sopenharmony_ci ), 1398c2ecf20Sopenharmony_ci 1408c2ecf20Sopenharmony_ci TP_printk("o=%p d=%p r=%u", 1418c2ecf20Sopenharmony_ci __entry->obj, __entry->de, __entry->ret) 1428c2ecf20Sopenharmony_ci ); 1438c2ecf20Sopenharmony_ci 1448c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_create, 1458c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 1468c2ecf20Sopenharmony_ci struct dentry *de, int ret), 1478c2ecf20Sopenharmony_ci 1488c2ecf20Sopenharmony_ci TP_ARGS(obj, de, ret), 1498c2ecf20Sopenharmony_ci 1508c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1518c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 1528c2ecf20Sopenharmony_ci __field(struct dentry *, de ) 1538c2ecf20Sopenharmony_ci __field(int, ret ) 1548c2ecf20Sopenharmony_ci ), 1558c2ecf20Sopenharmony_ci 1568c2ecf20Sopenharmony_ci TP_fast_assign( 1578c2ecf20Sopenharmony_ci __entry->obj = obj; 1588c2ecf20Sopenharmony_ci __entry->de = de; 1598c2ecf20Sopenharmony_ci __entry->ret = ret; 1608c2ecf20Sopenharmony_ci ), 1618c2ecf20Sopenharmony_ci 1628c2ecf20Sopenharmony_ci TP_printk("o=%p d=%p r=%u", 1638c2ecf20Sopenharmony_ci __entry->obj, __entry->de, __entry->ret) 1648c2ecf20Sopenharmony_ci ); 1658c2ecf20Sopenharmony_ci 1668c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_unlink, 1678c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 1688c2ecf20Sopenharmony_ci struct dentry *de, 1698c2ecf20Sopenharmony_ci enum fscache_why_object_killed why), 1708c2ecf20Sopenharmony_ci 1718c2ecf20Sopenharmony_ci TP_ARGS(obj, de, why), 1728c2ecf20Sopenharmony_ci 1738c2ecf20Sopenharmony_ci /* Note that obj may be NULL */ 1748c2ecf20Sopenharmony_ci TP_STRUCT__entry( 1758c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 1768c2ecf20Sopenharmony_ci __field(struct dentry *, de ) 1778c2ecf20Sopenharmony_ci __field(enum fscache_why_object_killed, why ) 1788c2ecf20Sopenharmony_ci ), 1798c2ecf20Sopenharmony_ci 1808c2ecf20Sopenharmony_ci TP_fast_assign( 1818c2ecf20Sopenharmony_ci __entry->obj = obj; 1828c2ecf20Sopenharmony_ci __entry->de = de; 1838c2ecf20Sopenharmony_ci __entry->why = why; 1848c2ecf20Sopenharmony_ci ), 1858c2ecf20Sopenharmony_ci 1868c2ecf20Sopenharmony_ci TP_printk("o=%p d=%p w=%s", 1878c2ecf20Sopenharmony_ci __entry->obj, __entry->de, 1888c2ecf20Sopenharmony_ci __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) 1898c2ecf20Sopenharmony_ci ); 1908c2ecf20Sopenharmony_ci 1918c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_rename, 1928c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 1938c2ecf20Sopenharmony_ci struct dentry *de, 1948c2ecf20Sopenharmony_ci struct dentry *to, 1958c2ecf20Sopenharmony_ci enum fscache_why_object_killed why), 1968c2ecf20Sopenharmony_ci 1978c2ecf20Sopenharmony_ci TP_ARGS(obj, de, to, why), 1988c2ecf20Sopenharmony_ci 1998c2ecf20Sopenharmony_ci /* Note that obj may be NULL */ 2008c2ecf20Sopenharmony_ci TP_STRUCT__entry( 2018c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 2028c2ecf20Sopenharmony_ci __field(struct dentry *, de ) 2038c2ecf20Sopenharmony_ci __field(struct dentry *, to ) 2048c2ecf20Sopenharmony_ci __field(enum fscache_why_object_killed, why ) 2058c2ecf20Sopenharmony_ci ), 2068c2ecf20Sopenharmony_ci 2078c2ecf20Sopenharmony_ci TP_fast_assign( 2088c2ecf20Sopenharmony_ci __entry->obj = obj; 2098c2ecf20Sopenharmony_ci __entry->de = de; 2108c2ecf20Sopenharmony_ci __entry->to = to; 2118c2ecf20Sopenharmony_ci __entry->why = why; 2128c2ecf20Sopenharmony_ci ), 2138c2ecf20Sopenharmony_ci 2148c2ecf20Sopenharmony_ci TP_printk("o=%p d=%p t=%p w=%s", 2158c2ecf20Sopenharmony_ci __entry->obj, __entry->de, __entry->to, 2168c2ecf20Sopenharmony_ci __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) 2178c2ecf20Sopenharmony_ci ); 2188c2ecf20Sopenharmony_ci 2198c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_mark_active, 2208c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 2218c2ecf20Sopenharmony_ci struct dentry *de), 2228c2ecf20Sopenharmony_ci 2238c2ecf20Sopenharmony_ci TP_ARGS(obj, de), 2248c2ecf20Sopenharmony_ci 2258c2ecf20Sopenharmony_ci /* Note that obj may be NULL */ 2268c2ecf20Sopenharmony_ci TP_STRUCT__entry( 2278c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 2288c2ecf20Sopenharmony_ci __field(struct dentry *, de ) 2298c2ecf20Sopenharmony_ci ), 2308c2ecf20Sopenharmony_ci 2318c2ecf20Sopenharmony_ci TP_fast_assign( 2328c2ecf20Sopenharmony_ci __entry->obj = obj; 2338c2ecf20Sopenharmony_ci __entry->de = de; 2348c2ecf20Sopenharmony_ci ), 2358c2ecf20Sopenharmony_ci 2368c2ecf20Sopenharmony_ci TP_printk("o=%p d=%p", 2378c2ecf20Sopenharmony_ci __entry->obj, __entry->de) 2388c2ecf20Sopenharmony_ci ); 2398c2ecf20Sopenharmony_ci 2408c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_wait_active, 2418c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 2428c2ecf20Sopenharmony_ci struct dentry *de, 2438c2ecf20Sopenharmony_ci struct cachefiles_object *xobj), 2448c2ecf20Sopenharmony_ci 2458c2ecf20Sopenharmony_ci TP_ARGS(obj, de, xobj), 2468c2ecf20Sopenharmony_ci 2478c2ecf20Sopenharmony_ci /* Note that obj may be NULL */ 2488c2ecf20Sopenharmony_ci TP_STRUCT__entry( 2498c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 2508c2ecf20Sopenharmony_ci __field(struct dentry *, de ) 2518c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, xobj ) 2528c2ecf20Sopenharmony_ci __field(u16, flags ) 2538c2ecf20Sopenharmony_ci __field(u16, fsc_flags ) 2548c2ecf20Sopenharmony_ci ), 2558c2ecf20Sopenharmony_ci 2568c2ecf20Sopenharmony_ci TP_fast_assign( 2578c2ecf20Sopenharmony_ci __entry->obj = obj; 2588c2ecf20Sopenharmony_ci __entry->de = de; 2598c2ecf20Sopenharmony_ci __entry->xobj = xobj; 2608c2ecf20Sopenharmony_ci __entry->flags = xobj->flags; 2618c2ecf20Sopenharmony_ci __entry->fsc_flags = xobj->fscache.flags; 2628c2ecf20Sopenharmony_ci ), 2638c2ecf20Sopenharmony_ci 2648c2ecf20Sopenharmony_ci TP_printk("o=%p d=%p wo=%p wf=%x wff=%x", 2658c2ecf20Sopenharmony_ci __entry->obj, __entry->de, __entry->xobj, 2668c2ecf20Sopenharmony_ci __entry->flags, __entry->fsc_flags) 2678c2ecf20Sopenharmony_ci ); 2688c2ecf20Sopenharmony_ci 2698c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_mark_inactive, 2708c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 2718c2ecf20Sopenharmony_ci struct dentry *de, 2728c2ecf20Sopenharmony_ci struct inode *inode), 2738c2ecf20Sopenharmony_ci 2748c2ecf20Sopenharmony_ci TP_ARGS(obj, de, inode), 2758c2ecf20Sopenharmony_ci 2768c2ecf20Sopenharmony_ci /* Note that obj may be NULL */ 2778c2ecf20Sopenharmony_ci TP_STRUCT__entry( 2788c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 2798c2ecf20Sopenharmony_ci __field(struct dentry *, de ) 2808c2ecf20Sopenharmony_ci __field(struct inode *, inode ) 2818c2ecf20Sopenharmony_ci ), 2828c2ecf20Sopenharmony_ci 2838c2ecf20Sopenharmony_ci TP_fast_assign( 2848c2ecf20Sopenharmony_ci __entry->obj = obj; 2858c2ecf20Sopenharmony_ci __entry->de = de; 2868c2ecf20Sopenharmony_ci __entry->inode = inode; 2878c2ecf20Sopenharmony_ci ), 2888c2ecf20Sopenharmony_ci 2898c2ecf20Sopenharmony_ci TP_printk("o=%p d=%p i=%p", 2908c2ecf20Sopenharmony_ci __entry->obj, __entry->de, __entry->inode) 2918c2ecf20Sopenharmony_ci ); 2928c2ecf20Sopenharmony_ci 2938c2ecf20Sopenharmony_ciTRACE_EVENT(cachefiles_mark_buried, 2948c2ecf20Sopenharmony_ci TP_PROTO(struct cachefiles_object *obj, 2958c2ecf20Sopenharmony_ci struct dentry *de, 2968c2ecf20Sopenharmony_ci enum fscache_why_object_killed why), 2978c2ecf20Sopenharmony_ci 2988c2ecf20Sopenharmony_ci TP_ARGS(obj, de, why), 2998c2ecf20Sopenharmony_ci 3008c2ecf20Sopenharmony_ci /* Note that obj may be NULL */ 3018c2ecf20Sopenharmony_ci TP_STRUCT__entry( 3028c2ecf20Sopenharmony_ci __field(struct cachefiles_object *, obj ) 3038c2ecf20Sopenharmony_ci __field(struct dentry *, de ) 3048c2ecf20Sopenharmony_ci __field(enum fscache_why_object_killed, why ) 3058c2ecf20Sopenharmony_ci ), 3068c2ecf20Sopenharmony_ci 3078c2ecf20Sopenharmony_ci TP_fast_assign( 3088c2ecf20Sopenharmony_ci __entry->obj = obj; 3098c2ecf20Sopenharmony_ci __entry->de = de; 3108c2ecf20Sopenharmony_ci __entry->why = why; 3118c2ecf20Sopenharmony_ci ), 3128c2ecf20Sopenharmony_ci 3138c2ecf20Sopenharmony_ci TP_printk("o=%p d=%p w=%s", 3148c2ecf20Sopenharmony_ci __entry->obj, __entry->de, 3158c2ecf20Sopenharmony_ci __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) 3168c2ecf20Sopenharmony_ci ); 3178c2ecf20Sopenharmony_ci 3188c2ecf20Sopenharmony_ci#endif /* _TRACE_CACHEFILES_H */ 3198c2ecf20Sopenharmony_ci 3208c2ecf20Sopenharmony_ci/* This part must be outside protection */ 3218c2ecf20Sopenharmony_ci#include <trace/define_trace.h> 322