]> www.infradead.org Git - users/hch/configfs.git/commitdiff
bcachefs: Improve trans_blocked_journal_reclaim tracepoint
authorKent Overstreet <kent.overstreet@linux.dev>
Sat, 10 Aug 2024 18:31:17 +0000 (14:31 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Wed, 14 Aug 2024 03:00:34 +0000 (23:00 -0400)
include information about the state of the btree key cache

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_key_cache.h
fs/bcachefs/trace.c
fs/bcachefs/trace.h

index 113309f6291868a01a487be6ca3f00c11117d5e9..51d6289b8dee3205ee5e8f8292906a588c92d1c0 100644 (file)
@@ -11,13 +11,18 @@ static inline size_t bch2_nr_btree_keys_need_flush(struct bch_fs *c)
        return max_t(ssize_t, 0, nr_dirty - max_dirty);
 }
 
-static inline bool bch2_btree_key_cache_must_wait(struct bch_fs *c)
+static inline ssize_t __bch2_btree_key_cache_must_wait(struct bch_fs *c)
 {
        size_t nr_dirty = atomic_long_read(&c->btree_key_cache.nr_dirty);
        size_t nr_keys = atomic_long_read(&c->btree_key_cache.nr_keys);
        size_t max_dirty = 4096 + (nr_keys * 3) / 4;
 
-       return nr_dirty > max_dirty;
+       return nr_dirty - max_dirty;
+}
+
+static inline bool bch2_btree_key_cache_must_wait(struct bch_fs *c)
+{
+       return __bch2_btree_key_cache_must_wait(c) > 0;
 }
 
 static inline bool bch2_btree_key_cache_wait_done(struct bch_fs *c)
index dc48b52b01b49c4ed7af877921dd7e2b446d75a8..dfad1d06633ddb5d5487c28009c2a276f95b5d18 100644 (file)
@@ -4,6 +4,7 @@
 #include "buckets.h"
 #include "btree_cache.h"
 #include "btree_iter.h"
+#include "btree_key_cache.h"
 #include "btree_locking.h"
 #include "btree_update_interior.h"
 #include "keylist.h"
index d0e6b9deb6cb4d9433f4556042b83ad8bc956663..c62f00322d1ed6778106f215cbe783aaaf5c36c7 100644 (file)
@@ -988,10 +988,33 @@ TRACE_EVENT(trans_restart_split_race,
                  __entry->u64s_remaining)
 );
 
-DEFINE_EVENT(transaction_event,        trans_blocked_journal_reclaim,
+TRACE_EVENT(trans_blocked_journal_reclaim,
        TP_PROTO(struct btree_trans *trans,
                 unsigned long caller_ip),
-       TP_ARGS(trans, caller_ip)
+       TP_ARGS(trans, caller_ip),
+
+       TP_STRUCT__entry(
+               __array(char,                   trans_fn, 32    )
+               __field(unsigned long,          caller_ip       )
+
+               __field(unsigned long,          key_cache_nr_keys       )
+               __field(unsigned long,          key_cache_nr_dirty      )
+               __field(long,                   must_wait               )
+       ),
+
+       TP_fast_assign(
+               strscpy(__entry->trans_fn, trans->fn, sizeof(__entry->trans_fn));
+               __entry->caller_ip              = caller_ip;
+               __entry->key_cache_nr_keys      = atomic_long_read(&trans->c->btree_key_cache.nr_keys);
+               __entry->key_cache_nr_dirty     = atomic_long_read(&trans->c->btree_key_cache.nr_dirty);
+               __entry->must_wait              = __bch2_btree_key_cache_must_wait(trans->c);
+       ),
+
+       TP_printk("%s %pS key cache keys %lu dirty %lu must_wait %li",
+                 __entry->trans_fn, (void *) __entry->caller_ip,
+                 __entry->key_cache_nr_keys,
+                 __entry->key_cache_nr_dirty,
+                 __entry->must_wait)
 );
 
 TRACE_EVENT(trans_restart_journal_preres_get,