mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	Add some tracepoints to fscache:
 (*) fscache_cookie - Tracks a cookie's usage count.
 (*) fscache_netfs - Logs registration of a network filesystem, including
     the pointer to the cookie allocated.
 (*) fscache_acquire - Logs cookie acquisition.
 (*) fscache_relinquish - Logs cookie relinquishment.
 (*) fscache_enable - Logs enablement of a cookie.
 (*) fscache_disable - Logs disablement of a cookie.
 (*) fscache_osm - Tracks execution of states in the object state machine.
and cachefiles:
 (*) cachefiles_ref - Tracks a cachefiles object's usage count.
 (*) cachefiles_lookup - Logs result of lookup_one_len().
 (*) cachefiles_mkdir - Logs result of vfs_mkdir().
 (*) cachefiles_create - Logs result of vfs_create().
 (*) cachefiles_unlink - Logs calls to vfs_unlink().
 (*) cachefiles_rename - Logs calls to vfs_rename().
 (*) cachefiles_mark_active - Logs an object becoming active.
 (*) cachefiles_wait_active - Logs a wait for an old object to be
     destroyed.
 (*) cachefiles_mark_inactive - Logs an object becoming inactive.
 (*) cachefiles_mark_buried - Logs the burial of an object.
Signed-off-by: David Howells <dhowells@redhat.com>
		
	
			
		
			
				
	
	
		
			325 lines
		
	
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
	
		
			8.2 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* CacheFiles tracepoints
 | 
						|
 *
 | 
						|
 * Copyright (C) 2016 Red Hat, Inc. All Rights Reserved.
 | 
						|
 * Written by David Howells (dhowells@redhat.com)
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or
 | 
						|
 * modify it under the terms of the GNU General Public Licence
 | 
						|
 * as published by the Free Software Foundation; either version
 | 
						|
 * 2 of the Licence, or (at your option) any later version.
 | 
						|
 */
 | 
						|
#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>
 |