bcachefs: Improve trans_blocked_journal_reclaim tracepoint
include information about the state of the btree key cache Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
7254555c44
commit
790666c8ac
@ -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);
|
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_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 nr_keys = atomic_long_read(&c->btree_key_cache.nr_keys);
|
||||||
size_t max_dirty = 4096 + (nr_keys * 3) / 4;
|
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)
|
static inline bool bch2_btree_key_cache_wait_done(struct bch_fs *c)
|
||||||
|
@ -4,6 +4,7 @@
|
|||||||
#include "buckets.h"
|
#include "buckets.h"
|
||||||
#include "btree_cache.h"
|
#include "btree_cache.h"
|
||||||
#include "btree_iter.h"
|
#include "btree_iter.h"
|
||||||
|
#include "btree_key_cache.h"
|
||||||
#include "btree_locking.h"
|
#include "btree_locking.h"
|
||||||
#include "btree_update_interior.h"
|
#include "btree_update_interior.h"
|
||||||
#include "keylist.h"
|
#include "keylist.h"
|
||||||
|
@ -988,10 +988,33 @@ TRACE_EVENT(trans_restart_split_race,
|
|||||||
__entry->u64s_remaining)
|
__entry->u64s_remaining)
|
||||||
);
|
);
|
||||||
|
|
||||||
DEFINE_EVENT(transaction_event, trans_blocked_journal_reclaim,
|
TRACE_EVENT(trans_blocked_journal_reclaim,
|
||||||
TP_PROTO(struct btree_trans *trans,
|
TP_PROTO(struct btree_trans *trans,
|
||||||
unsigned long caller_ip),
|
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,
|
TRACE_EVENT(trans_restart_journal_preres_get,
|
||||||
|
Loading…
Reference in New Issue
Block a user