Commit acb3b26e authored by Kent Overstreet's avatar Kent Overstreet Committed by Kent Overstreet

bcachefs: Move btree lock debugging to slowpath fn

Signed-off-by: default avatarKent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: default avatarKent Overstreet <kent.overstreet@linux.dev>
parent 24db24c7
...@@ -246,6 +246,7 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos, ...@@ -246,6 +246,7 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos,
struct btree_iter *linked, *deadlock_iter = NULL; struct btree_iter *linked, *deadlock_iter = NULL;
u64 start_time = local_clock(); u64 start_time = local_clock();
unsigned reason = 9; unsigned reason = 9;
bool ret;
/* Check if it's safe to block: */ /* Check if it's safe to block: */
trans_for_each_iter(trans, linked) { trans_for_each_iter(trans, linked) {
...@@ -354,12 +355,23 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos, ...@@ -354,12 +355,23 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos,
if (six_trylock_type(&b->c.lock, type)) if (six_trylock_type(&b->c.lock, type))
return true; return true;
if (six_lock_type(&b->c.lock, type, should_sleep_fn, p)) #ifdef CONFIG_BCACHEFS_DEBUG
return false; trans->locking_iter_idx = iter->idx;
trans->locking_pos = pos;
trans->locking_btree_id = iter->btree_id;
trans->locking_level = level;
trans->locking = b;
#endif
ret = six_lock_type(&b->c.lock, type, should_sleep_fn, p) == 0;
#ifdef CONFIG_BCACHEFS_DEBUG
trans->locking = NULL;
#endif
if (ret)
bch2_time_stats_update(&trans->c->times[lock_to_time_stat(type)], bch2_time_stats_update(&trans->c->times[lock_to_time_stat(type)],
start_time); start_time);
return true; return ret;
} }
/* Btree iterator locking: */ /* Btree iterator locking: */
......
...@@ -186,27 +186,14 @@ static inline bool btree_node_lock(struct btree *b, ...@@ -186,27 +186,14 @@ static inline bool btree_node_lock(struct btree *b,
unsigned long ip) unsigned long ip)
{ {
struct btree_trans *trans = iter->trans; struct btree_trans *trans = iter->trans;
bool ret;
EBUG_ON(level >= BTREE_MAX_DEPTH); EBUG_ON(level >= BTREE_MAX_DEPTH);
EBUG_ON(!(trans->iters_linked & (1ULL << iter->idx))); EBUG_ON(!(trans->iters_linked & (1ULL << iter->idx)));
#ifdef CONFIG_BCACHEFS_DEBUG return likely(six_trylock_type(&b->c.lock, type)) ||
trans->locking = b;
trans->locking_iter_idx = iter->idx;
trans->locking_pos = pos;
trans->locking_btree_id = iter->btree_id;
trans->locking_level = level;
#endif
ret = likely(six_trylock_type(&b->c.lock, type)) ||
btree_node_lock_increment(trans, b, level, type) || btree_node_lock_increment(trans, b, level, type) ||
__bch2_btree_node_lock(b, pos, level, iter, type, __bch2_btree_node_lock(b, pos, level, iter, type,
should_sleep_fn, p, ip); should_sleep_fn, p, ip);
#ifdef CONFIG_BCACHEFS_DEBUG
trans->locking = NULL;
#endif
return ret;
} }
bool __bch2_btree_node_relock(struct btree_iter *, unsigned); bool __bch2_btree_node_relock(struct btree_iter *, unsigned);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment