Loading fs/bcachefs/btree_key_cache.h +7 −2 Original line number Diff line number Diff line Loading @@ -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) Loading fs/bcachefs/trace.c +1 −0 Original line number Diff line number Diff line Loading @@ -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" Loading fs/bcachefs/trace.h +25 −2 Original line number Diff line number Diff line Loading @@ -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, Loading Loading
fs/bcachefs/btree_key_cache.h +7 −2 Original line number Diff line number Diff line Loading @@ -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) Loading
fs/bcachefs/trace.c +1 −0 Original line number Diff line number Diff line Loading @@ -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" Loading
fs/bcachefs/trace.h +25 −2 Original line number Diff line number Diff line Loading @@ -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, Loading