summaryrefslogtreecommitdiff
path: root/fs/bcachefs/btree_iter.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-07-12 23:30:45 -0400
committerKent Overstreet <kent.overstreet@linux.dev>2023-10-22 17:08:07 -0400
commit1c7a0adf3112090c42ef93ac84aad97bf4d414d3 (patch)
tree3a431a138e126ce0950c6f5f54813e692cb437a7 /fs/bcachefs/btree_iter.c
parentd69f41d6bbd7849253cd823525543bd3a1a307f1 (diff)
bcachefs: trace transaction restarts
exceptionally crappy "tracing", but it's a start at documenting the places restarts can be triggered Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
Diffstat (limited to 'fs/bcachefs/btree_iter.c')
-rw-r--r--fs/bcachefs/btree_iter.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/fs/bcachefs/btree_iter.c b/fs/bcachefs/btree_iter.c
index 2b4ba41149cf..7bead41b226f 100644
--- a/fs/bcachefs/btree_iter.c
+++ b/fs/bcachefs/btree_iter.c
@@ -263,6 +263,9 @@ bool __bch2_btree_node_lock(struct btree *b, struct bpos pos,
if (ret)
__btree_node_lock_type(c, b, type);
+ else
+ trans_restart();
+
return ret;
}
@@ -1646,7 +1649,12 @@ static int btree_trans_realloc_iters(struct btree_trans *trans)
btree_trans_verify(trans);
- return trans->iters_live ? -EINTR : 0;
+ if (trans->iters_live) {
+ trans_restart();
+ return -EINTR;
+ }
+
+ return 0;
}
int bch2_trans_preload_iters(struct btree_trans *trans)
@@ -1759,8 +1767,10 @@ void *bch2_trans_kmalloc(struct btree_trans *trans,
trans->mem = new_mem;
trans->mem_bytes = new_bytes;
- if (old_bytes)
+ if (old_bytes) {
+ trans_restart();
return ERR_PTR(-EINTR);
+ }
}
ret = trans->mem + trans->mem_top;
@@ -1787,7 +1797,7 @@ int bch2_trans_unlock(struct btree_trans *trans)
return ret;
}
-void bch2_trans_begin(struct btree_trans *trans)
+void __bch2_trans_begin(struct btree_trans *trans)
{
unsigned idx;
@@ -1801,10 +1811,8 @@ void bch2_trans_begin(struct btree_trans *trans)
* further (allocated an iter with a higher idx) than where the iter
* was originally allocated:
*/
- if (!trans->iters_live)
- return;
-
while (trans->iters_linked &&
+ trans->iters_live &&
(idx = __fls(trans->iters_linked)) >
__fls(trans->iters_live)) {
trans->iters_linked ^= 1 << idx;
@@ -1821,6 +1829,7 @@ void bch2_trans_begin(struct btree_trans *trans)
void bch2_trans_init(struct btree_trans *trans, struct bch_fs *c)
{
trans->c = c;
+ trans->nr_restarts = 0;
trans->nr_iters = 0;
trans->iters_live = 0;
trans->iters_linked = 0;