| /* 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> |