|  | /* SPDX-License-Identifier: GPL-2.0-or-later */ | 
|  | /* CacheFiles tracepoints | 
|  | * | 
|  | * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved. | 
|  | * Written by David Howells (dhowells@redhat.com) | 
|  | */ | 
|  | #undef TRACE_SYSTEM | 
|  | #define TRACE_SYSTEM cachefiles | 
|  |  | 
|  | #if !defined(_TRACE_CACHEFILES_H) || defined(TRACE_HEADER_MULTI_READ) | 
|  | #define _TRACE_CACHEFILES_H | 
|  |  | 
|  | #include <linux/tracepoint.h> | 
|  |  | 
|  | /* | 
|  | * Define enums for tracing information. | 
|  | */ | 
|  | #ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY | 
|  | #define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY | 
|  |  | 
|  | enum cachefiles_obj_ref_trace { | 
|  | cachefiles_obj_put_wait_retry = fscache_obj_ref__nr_traces, | 
|  | cachefiles_obj_put_wait_timeo, | 
|  | cachefiles_obj_ref__nr_traces | 
|  | }; | 
|  |  | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | * Define enum -> string mappings for display. | 
|  | */ | 
|  | #define cachefiles_obj_kill_traces				\ | 
|  | EM(FSCACHE_OBJECT_IS_STALE,	"stale")		\ | 
|  | EM(FSCACHE_OBJECT_NO_SPACE,	"no_space")		\ | 
|  | EM(FSCACHE_OBJECT_WAS_RETIRED,	"was_retired")		\ | 
|  | E_(FSCACHE_OBJECT_WAS_CULLED,	"was_culled") | 
|  |  | 
|  | #define cachefiles_obj_ref_traces					\ | 
|  | EM(fscache_obj_get_add_to_deps,		"GET add_to_deps")	\ | 
|  | EM(fscache_obj_get_queue,		"GET queue")		\ | 
|  | EM(fscache_obj_put_alloc_fail,		"PUT alloc_fail")	\ | 
|  | EM(fscache_obj_put_attach_fail,		"PUT attach_fail")	\ | 
|  | EM(fscache_obj_put_drop_obj,		"PUT drop_obj")		\ | 
|  | EM(fscache_obj_put_enq_dep,		"PUT enq_dep")		\ | 
|  | EM(fscache_obj_put_queue,		"PUT queue")		\ | 
|  | EM(fscache_obj_put_work,		"PUT work")		\ | 
|  | EM(cachefiles_obj_put_wait_retry,	"PUT wait_retry")	\ | 
|  | E_(cachefiles_obj_put_wait_timeo,	"PUT wait_timeo") | 
|  |  | 
|  | /* | 
|  | * Export enum symbols via userspace. | 
|  | */ | 
|  | #undef EM | 
|  | #undef E_ | 
|  | #define EM(a, b) TRACE_DEFINE_ENUM(a); | 
|  | #define E_(a, b) TRACE_DEFINE_ENUM(a); | 
|  |  | 
|  | cachefiles_obj_kill_traces; | 
|  | cachefiles_obj_ref_traces; | 
|  |  | 
|  | /* | 
|  | * Now redefine the EM() and E_() macros to map the enums to the strings that | 
|  | * will be printed in the output. | 
|  | */ | 
|  | #undef EM | 
|  | #undef E_ | 
|  | #define EM(a, b)	{ a, b }, | 
|  | #define E_(a, b)	{ a, b } | 
|  |  | 
|  |  | 
|  | TRACE_EVENT(cachefiles_ref, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct fscache_cookie *cookie, | 
|  | enum cachefiles_obj_ref_trace why, | 
|  | int usage), | 
|  |  | 
|  | TP_ARGS(obj, cookie, why, usage), | 
|  |  | 
|  | /* Note that obj may be NULL */ | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,		obj		) | 
|  | __field(struct fscache_cookie *,		cookie		) | 
|  | __field(enum cachefiles_obj_ref_trace,	why		) | 
|  | __field(int,				usage		) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->cookie	= cookie; | 
|  | __entry->usage	= usage; | 
|  | __entry->why	= why; | 
|  | ), | 
|  |  | 
|  | TP_printk("c=%p o=%p u=%d %s", | 
|  | __entry->cookie, __entry->obj, __entry->usage, | 
|  | __print_symbolic(__entry->why, cachefiles_obj_ref_traces)) | 
|  | ); | 
|  |  | 
|  | TRACE_EVENT(cachefiles_lookup, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct dentry *de, | 
|  | struct inode *inode), | 
|  |  | 
|  | TP_ARGS(obj, de, inode), | 
|  |  | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,	obj	) | 
|  | __field(struct dentry *,		de	) | 
|  | __field(struct inode *,		inode	) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->de		= de; | 
|  | __entry->inode	= inode; | 
|  | ), | 
|  |  | 
|  | TP_printk("o=%p d=%p i=%p", | 
|  | __entry->obj, __entry->de, __entry->inode) | 
|  | ); | 
|  |  | 
|  | TRACE_EVENT(cachefiles_mkdir, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct dentry *de, int ret), | 
|  |  | 
|  | TP_ARGS(obj, de, ret), | 
|  |  | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,	obj	) | 
|  | __field(struct dentry *,		de	) | 
|  | __field(int,			ret	) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->de		= de; | 
|  | __entry->ret	= ret; | 
|  | ), | 
|  |  | 
|  | TP_printk("o=%p d=%p r=%u", | 
|  | __entry->obj, __entry->de, __entry->ret) | 
|  | ); | 
|  |  | 
|  | TRACE_EVENT(cachefiles_create, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct dentry *de, int ret), | 
|  |  | 
|  | TP_ARGS(obj, de, ret), | 
|  |  | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,	obj	) | 
|  | __field(struct dentry *,		de	) | 
|  | __field(int,			ret	) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->de		= de; | 
|  | __entry->ret	= ret; | 
|  | ), | 
|  |  | 
|  | TP_printk("o=%p d=%p r=%u", | 
|  | __entry->obj, __entry->de, __entry->ret) | 
|  | ); | 
|  |  | 
|  | TRACE_EVENT(cachefiles_unlink, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct dentry *de, | 
|  | enum fscache_why_object_killed why), | 
|  |  | 
|  | TP_ARGS(obj, de, why), | 
|  |  | 
|  | /* Note that obj may be NULL */ | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,	obj		) | 
|  | __field(struct dentry *,		de		) | 
|  | __field(enum fscache_why_object_killed, why		) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->de		= de; | 
|  | __entry->why	= why; | 
|  | ), | 
|  |  | 
|  | TP_printk("o=%p d=%p w=%s", | 
|  | __entry->obj, __entry->de, | 
|  | __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) | 
|  | ); | 
|  |  | 
|  | TRACE_EVENT(cachefiles_rename, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct dentry *de, | 
|  | struct dentry *to, | 
|  | enum fscache_why_object_killed why), | 
|  |  | 
|  | TP_ARGS(obj, de, to, why), | 
|  |  | 
|  | /* Note that obj may be NULL */ | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,	obj		) | 
|  | __field(struct dentry *,		de		) | 
|  | __field(struct dentry *,		to		) | 
|  | __field(enum fscache_why_object_killed, why		) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->de		= de; | 
|  | __entry->to		= to; | 
|  | __entry->why	= why; | 
|  | ), | 
|  |  | 
|  | TP_printk("o=%p d=%p t=%p w=%s", | 
|  | __entry->obj, __entry->de, __entry->to, | 
|  | __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) | 
|  | ); | 
|  |  | 
|  | TRACE_EVENT(cachefiles_mark_active, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct dentry *de), | 
|  |  | 
|  | TP_ARGS(obj, de), | 
|  |  | 
|  | /* Note that obj may be NULL */ | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,	obj		) | 
|  | __field(struct dentry *,		de		) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->de		= de; | 
|  | ), | 
|  |  | 
|  | TP_printk("o=%p d=%p", | 
|  | __entry->obj, __entry->de) | 
|  | ); | 
|  |  | 
|  | TRACE_EVENT(cachefiles_wait_active, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct dentry *de, | 
|  | struct cachefiles_object *xobj), | 
|  |  | 
|  | TP_ARGS(obj, de, xobj), | 
|  |  | 
|  | /* Note that obj may be NULL */ | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,	obj		) | 
|  | __field(struct dentry *,		de		) | 
|  | __field(struct cachefiles_object *,	xobj		) | 
|  | __field(u16,			flags		) | 
|  | __field(u16,			fsc_flags	) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->de		= de; | 
|  | __entry->xobj	= xobj; | 
|  | __entry->flags	= xobj->flags; | 
|  | __entry->fsc_flags	= xobj->fscache.flags; | 
|  | ), | 
|  |  | 
|  | TP_printk("o=%p d=%p wo=%p wf=%x wff=%x", | 
|  | __entry->obj, __entry->de, __entry->xobj, | 
|  | __entry->flags, __entry->fsc_flags) | 
|  | ); | 
|  |  | 
|  | TRACE_EVENT(cachefiles_mark_inactive, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct dentry *de, | 
|  | struct inode *inode), | 
|  |  | 
|  | TP_ARGS(obj, de, inode), | 
|  |  | 
|  | /* Note that obj may be NULL */ | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,	obj		) | 
|  | __field(struct dentry *,		de		) | 
|  | __field(struct inode *,		inode		) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->de		= de; | 
|  | __entry->inode	= inode; | 
|  | ), | 
|  |  | 
|  | TP_printk("o=%p d=%p i=%p", | 
|  | __entry->obj, __entry->de, __entry->inode) | 
|  | ); | 
|  |  | 
|  | TRACE_EVENT(cachefiles_mark_buried, | 
|  | TP_PROTO(struct cachefiles_object *obj, | 
|  | struct dentry *de, | 
|  | enum fscache_why_object_killed why), | 
|  |  | 
|  | TP_ARGS(obj, de, why), | 
|  |  | 
|  | /* Note that obj may be NULL */ | 
|  | TP_STRUCT__entry( | 
|  | __field(struct cachefiles_object *,	obj		) | 
|  | __field(struct dentry *,		de		) | 
|  | __field(enum fscache_why_object_killed, why		) | 
|  | ), | 
|  |  | 
|  | TP_fast_assign( | 
|  | __entry->obj	= obj; | 
|  | __entry->de		= de; | 
|  | __entry->why	= why; | 
|  | ), | 
|  |  | 
|  | TP_printk("o=%p d=%p w=%s", | 
|  | __entry->obj, __entry->de, | 
|  | __print_symbolic(__entry->why, cachefiles_obj_kill_traces)) | 
|  | ); | 
|  |  | 
|  | #endif /* _TRACE_CACHEFILES_H */ | 
|  |  | 
|  | /* This part must be outside protection */ | 
|  | #include <trace/define_trace.h> |