cachefiles: Add tracepoints for calls to the VFS
authorDavid Howells <dhowells@redhat.com>
Tue, 16 Nov 2021 16:30:25 +0000 (16:30 +0000)
committerDavid Howells <dhowells@redhat.com>
Fri, 7 Jan 2022 13:41:59 +0000 (13:41 +0000)
Add tracepoints in cachefiles to monitor when it does various VFS
operations, such as mkdir.

Signed-off-by: David Howells <dhowells@redhat.com>
Reviewed-by: Jeff Layton <jlayton@kernel.org>
cc: linux-cachefs@redhat.com
Link: https://lore.kernel.org/r/163819638517.215744.12773133137536579766.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/163906938316.143852.17227990869551737803.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/163967147139.1823006.4909879317496543392.stgit@warthog.procyon.org.uk/
Link: https://lore.kernel.org/r/164021546287.640689.3501604495002415631.stgit@warthog.procyon.org.uk/
include/trace/events/cachefiles.h

index 6331cd2..5975ea4 100644 (file)
 #ifndef __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
 #define __CACHEFILES_DECLARE_TRACE_ENUMS_ONCE_ONLY
 
+enum fscache_why_object_killed {
+       FSCACHE_OBJECT_IS_STALE,
+       FSCACHE_OBJECT_IS_WEIRD,
+       FSCACHE_OBJECT_INVALIDATED,
+       FSCACHE_OBJECT_NO_SPACE,
+       FSCACHE_OBJECT_WAS_RETIRED,
+       FSCACHE_OBJECT_WAS_CULLED,
+};
+
+enum cachefiles_trunc_trace {
+       cachefiles_trunc_dio_adjust,
+       cachefiles_trunc_expand_tmpfile,
+       cachefiles_trunc_shrink,
+};
+
 enum cachefiles_error_trace {
        cachefiles_trace_fallocate_error,
        cachefiles_trace_getxattr_error,
@@ -43,6 +58,19 @@ enum cachefiles_error_trace {
 /*
  * Define enum -> string mappings for display.
  */
+#define cachefiles_obj_kill_traces                             \
+       EM(FSCACHE_OBJECT_IS_STALE,     "stale")                \
+       EM(FSCACHE_OBJECT_IS_WEIRD,     "weird")                \
+       EM(FSCACHE_OBJECT_INVALIDATED,  "inval")                \
+       EM(FSCACHE_OBJECT_NO_SPACE,     "no_space")             \
+       EM(FSCACHE_OBJECT_WAS_RETIRED,  "was_retired")          \
+       E_(FSCACHE_OBJECT_WAS_CULLED,   "was_culled")
+
+#define cachefiles_trunc_traces                                                \
+       EM(cachefiles_trunc_dio_adjust,         "DIOADJ")               \
+       EM(cachefiles_trunc_expand_tmpfile,     "EXPTMP")               \
+       E_(cachefiles_trunc_shrink,             "SHRINK")
+
 #define cachefiles_error_traces                                                \
        EM(cachefiles_trace_fallocate_error,    "fallocate")            \
        EM(cachefiles_trace_getxattr_error,     "getxattr")             \
@@ -71,6 +99,8 @@ enum cachefiles_error_trace {
 #define EM(a, b) TRACE_DEFINE_ENUM(a);
 #define E_(a, b) TRACE_DEFINE_ENUM(a);
 
+cachefiles_obj_kill_traces;
+cachefiles_trunc_traces;
 cachefiles_error_traces;
 
 /*
@@ -83,6 +113,152 @@ cachefiles_error_traces;
 #define E_(a, b)       { a, b }
 
 
+TRACE_EVENT(cachefiles_lookup,
+           TP_PROTO(struct cachefiles_object *obj,
+                    struct dentry *de),
+
+           TP_ARGS(obj, de),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,               obj     )
+                   __field(short,                      error   )
+                   __field(unsigned long,              ino     )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj->debug_id;
+                   __entry->ino        = (!IS_ERR(de) && d_backing_inode(de) ?
+                                          d_backing_inode(de)->i_ino : 0);
+                   __entry->error      = IS_ERR(de) ? PTR_ERR(de) : 0;
+                          ),
+
+           TP_printk("o=%08x i=%lx e=%d",
+                     __entry->obj, __entry->ino, __entry->error)
+           );
+
+TRACE_EVENT(cachefiles_tmpfile,
+           TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
+
+           TP_ARGS(obj, backer),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,                       obj     )
+                   __field(unsigned int,                       backer  )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj->debug_id;
+                   __entry->backer     = backer->i_ino;
+                          ),
+
+           TP_printk("o=%08x b=%08x",
+                     __entry->obj,
+                     __entry->backer)
+           );
+
+TRACE_EVENT(cachefiles_link,
+           TP_PROTO(struct cachefiles_object *obj, struct inode *backer),
+
+           TP_ARGS(obj, backer),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,                       obj     )
+                   __field(unsigned int,                       backer  )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj->debug_id;
+                   __entry->backer     = backer->i_ino;
+                          ),
+
+           TP_printk("o=%08x b=%08x",
+                     __entry->obj,
+                     __entry->backer)
+           );
+
+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(unsigned int,               obj             )
+                   __field(struct dentry *,            de              )
+                   __field(enum fscache_why_object_killed, why         )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj ? obj->debug_id : UINT_MAX;
+                   __entry->de         = de;
+                   __entry->why        = why;
+                          ),
+
+           TP_printk("o=%08x 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(unsigned int,               obj             )
+                   __field(struct dentry *,            de              )
+                   __field(struct dentry *,            to              )
+                   __field(enum fscache_why_object_killed, why         )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj ? obj->debug_id : UINT_MAX;
+                   __entry->de         = de;
+                   __entry->to         = to;
+                   __entry->why        = why;
+                          ),
+
+           TP_printk("o=%08x d=%p t=%p w=%s",
+                     __entry->obj, __entry->de, __entry->to,
+                     __print_symbolic(__entry->why, cachefiles_obj_kill_traces))
+           );
+
+TRACE_EVENT(cachefiles_trunc,
+           TP_PROTO(struct cachefiles_object *obj, struct inode *backer,
+                    loff_t from, loff_t to, enum cachefiles_trunc_trace why),
+
+           TP_ARGS(obj, backer, from, to, why),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,                       obj     )
+                   __field(unsigned int,                       backer  )
+                   __field(enum cachefiles_trunc_trace,        why     )
+                   __field(loff_t,                             from    )
+                   __field(loff_t,                             to      )
+                            ),
+
+           TP_fast_assign(
+                   __entry->obj        = obj->debug_id;
+                   __entry->backer     = backer->i_ino;
+                   __entry->from       = from;
+                   __entry->to         = to;
+                   __entry->why        = why;
+                          ),
+
+           TP_printk("o=%08x b=%08x %s l=%llx->%llx",
+                     __entry->obj,
+                     __entry->backer,
+                     __print_symbolic(__entry->why, cachefiles_trunc_traces),
+                     __entry->from,
+                     __entry->to)
+           );
+
 TRACE_EVENT(cachefiles_mark_active,
            TP_PROTO(struct cachefiles_object *obj,
                     struct inode *inode),