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