Add a tracepoint to track fscache_use/unuse_cookie().

Signed-off-by: David Howells <dhowe...@redhat.com>
cc: linux-cachefs@redhat.com
---

 fs/fscache/cookie.c            |   29 +++++++++++++++++++++++---
 include/trace/events/fscache.h |   44 ++++++++++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+), 4 deletions(-)

diff --git a/fs/fscache/cookie.c b/fs/fscache/cookie.c
index a7ea7d1db032..9bb1ab5fe5ed 100644
--- a/fs/fscache/cookie.c
+++ b/fs/fscache/cookie.c
@@ -556,6 +556,7 @@ void __fscache_use_cookie(struct fscache_cookie *cookie, 
bool will_modify)
 {
        enum fscache_cookie_state state;
        bool queue = false;
+       int n_active;
 
        _enter("c=%08x", cookie->debug_id);
 
@@ -565,7 +566,11 @@ void __fscache_use_cookie(struct fscache_cookie *cookie, 
bool will_modify)
 
        spin_lock(&cookie->lock);
 
-       atomic_inc(&cookie->n_active);
+       n_active = atomic_inc_return(&cookie->n_active);
+       trace_fscache_active(cookie->debug_id, refcount_read(&cookie->ref),
+                            n_active, atomic_read(&cookie->n_accesses),
+                            will_modify ?
+                            fscache_active_use_modify : fscache_active_use);
 
 again:
        state = fscache_cookie_state(cookie);
@@ -638,13 +643,29 @@ static void fscache_unuse_cookie_locked(struct 
fscache_cookie *cookie)
 void __fscache_unuse_cookie(struct fscache_cookie *cookie,
                            const void *aux_data, const loff_t *object_size)
 {
+       unsigned int debug_id = cookie->debug_id;
+       unsigned int r = refcount_read(&cookie->ref);
+       unsigned int a = atomic_read(&cookie->n_accesses);
+       unsigned int c;
+
        if (aux_data || object_size)
                __fscache_update_cookie(cookie, aux_data, object_size);
 
-       if (atomic_dec_and_lock(&cookie->n_active, &cookie->lock)) {
-               fscache_unuse_cookie_locked(cookie);
-               spin_unlock(&cookie->lock);
+       /* Subtract 1 from counter unless that drops it to 0 (ie. it was 1) */
+       c = atomic_fetch_add_unless(&cookie->n_active, -1, 1);
+       if (c != 1) {
+               trace_fscache_active(debug_id, r, c - 1, a, 
fscache_active_unuse);
+               return;
        }
+
+       spin_lock(&cookie->lock);
+       r = refcount_read(&cookie->ref);
+       a = atomic_read(&cookie->n_accesses);
+       c = atomic_dec_return(&cookie->n_active);
+       trace_fscache_active(debug_id, r, c, a, fscache_active_unuse);
+       if (c == 0)
+               fscache_unuse_cookie_locked(cookie);
+       spin_unlock(&cookie->lock);
 }
 EXPORT_SYMBOL(__fscache_unuse_cookie);
 
diff --git a/include/trace/events/fscache.h b/include/trace/events/fscache.h
index 1594aefadeac..cb3fb337e880 100644
--- a/include/trace/events/fscache.h
+++ b/include/trace/events/fscache.h
@@ -71,6 +71,12 @@ enum fscache_cookie_trace {
        fscache_cookie_see_work,
 };
 
+enum fscache_active_trace {
+       fscache_active_use,
+       fscache_active_use_modify,
+       fscache_active_unuse,
+};
+
 enum fscache_access_trace {
        fscache_access_acquire_volume,
        fscache_access_acquire_volume_end,
@@ -146,6 +152,11 @@ enum fscache_access_trace {
        EM(fscache_cookie_see_withdraw,         "-   x-wth")            \
        E_(fscache_cookie_see_work,             "-   work ")
 
+#define fscache_active_traces          \
+       EM(fscache_active_use,                  "USE          ")        \
+       EM(fscache_active_use_modify,           "USE-m        ")        \
+       E_(fscache_active_unuse,                "UNUSE        ")
+
 #define fscache_access_traces          \
        EM(fscache_access_acquire_volume,       "BEGIN acq_vol")        \
        EM(fscache_access_acquire_volume_end,   "END   acq_vol")        \
@@ -264,6 +275,39 @@ TRACE_EVENT(fscache_cookie,
                      __entry->ref)
            );
 
+TRACE_EVENT(fscache_active,
+           TP_PROTO(unsigned int cookie_debug_id,
+                    int ref,
+                    int n_active,
+                    int n_accesses,
+                    enum fscache_active_trace why),
+
+           TP_ARGS(cookie_debug_id, ref, n_active, n_accesses, why),
+
+           TP_STRUCT__entry(
+                   __field(unsigned int,               cookie          )
+                   __field(int,                        ref             )
+                   __field(int,                        n_active        )
+                   __field(int,                        n_accesses      )
+                   __field(enum fscache_active_trace,  why             )
+                            ),
+
+           TP_fast_assign(
+                   __entry->cookie     = cookie_debug_id;
+                   __entry->ref        = ref;
+                   __entry->n_active   = n_active;
+                   __entry->n_accesses = n_accesses;
+                   __entry->why        = why;
+                          ),
+
+           TP_printk("c=%08x %s r=%d a=%d c=%d",
+                     __entry->cookie,
+                     __print_symbolic(__entry->why, fscache_active_traces),
+                     __entry->ref,
+                     __entry->n_accesses,
+                     __entry->n_active)
+           );
+
 TRACE_EVENT(fscache_access_cache,
            TP_PROTO(unsigned int cache_debug_id,
                     int ref,


--
Linux-cachefs mailing list
Linux-cachefs@redhat.com
https://listman.redhat.com/mailman/listinfo/linux-cachefs

Reply via email to