From cb12531b8af9c3ba5087b6e2d4f959d25b507a29 Mon Sep 17 00:00:00 2001 From: Kent Overstreet Date: Fri, 14 Oct 2022 07:02:36 -0400 Subject: bcachefs: Don't use key cache during fsck The btree key cache mainly helps with lock contention, at the cost of additional memory overhead. During some fsck passes the memory overhead really matters, but fsck is single threaded so lock contention is an issue - so skipping the key cache during fsck will help with performance. Signed-off-by: Kent Overstreet --- fs/bcachefs/backpointers.c | 5 +++-- fs/bcachefs/backpointers.h | 2 +- fs/bcachefs/ec.c | 4 +++- fs/bcachefs/move.c | 3 ++- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/fs/bcachefs/backpointers.c b/fs/bcachefs/backpointers.c index 4845aefb2f73..7d4367f93b5c 100644 --- a/fs/bcachefs/backpointers.c +++ b/fs/bcachefs/backpointers.c @@ -385,7 +385,8 @@ err: int bch2_get_next_backpointer(struct btree_trans *trans, struct bpos bucket, int gen, u64 *bp_offset, - struct bch_backpointer *dst) + struct bch_backpointer *dst, + unsigned iter_flags) { struct bch_fs *c = trans->c; struct bpos bp_pos, bp_end_pos; @@ -1001,7 +1002,7 @@ static int check_one_backpointer(struct btree_trans *trans, struct printbuf buf = PRINTBUF; int ret; - ret = bch2_get_next_backpointer(trans, bucket, -1, bp_offset, &bp); + ret = bch2_get_next_backpointer(trans, bucket, -1, bp_offset, &bp, 0); if (ret || *bp_offset == U64_MAX) return ret; diff --git a/fs/bcachefs/backpointers.h b/fs/bcachefs/backpointers.h index 1747ec3d4046..48a48b75c0ac 100644 --- a/fs/bcachefs/backpointers.h +++ b/fs/bcachefs/backpointers.h @@ -45,7 +45,7 @@ int bch2_bucket_backpointer_del(struct btree_trans *, struct bkey_i_alloc_v4 *, int bch2_bucket_backpointer_add(struct btree_trans *, struct bkey_i_alloc_v4 *, struct bch_backpointer, struct bkey_s_c); int bch2_get_next_backpointer(struct btree_trans *, struct bpos, int, - u64 *, struct bch_backpointer *); + u64 *, struct bch_backpointer *, unsigned); struct bkey_s_c bch2_backpointer_get_key(struct btree_trans *, struct btree_iter *, struct bpos, u64, struct bch_backpointer); struct btree *bch2_backpointer_get_node(struct btree_trans *, struct btree_iter *, diff --git a/fs/bcachefs/ec.c b/fs/bcachefs/ec.c index 808e61523d9a..9da79651e967 100644 --- a/fs/bcachefs/ec.c +++ b/fs/bcachefs/ec.c @@ -870,7 +870,9 @@ retry: while (1) { bch2_trans_begin(trans); - ret = bch2_get_next_backpointer(trans, bucket_pos, bucket.gen, &bp_offset, &bp); + ret = bch2_get_next_backpointer(trans, bucket_pos, bucket.gen, + &bp_offset, &bp, + BTREE_ITER_CACHED); if (ret) break; if (bp_offset == U64_MAX) diff --git a/fs/bcachefs/move.c b/fs/bcachefs/move.c index f30f3661120a..632b8b440f71 100644 --- a/fs/bcachefs/move.c +++ b/fs/bcachefs/move.c @@ -673,7 +673,8 @@ int __bch2_evacuate_bucket(struct moving_context *ctxt, bch2_trans_begin(&trans); ret = bch2_get_next_backpointer(&trans, bucket, gen, - &bp_offset, &bp); + &bp_offset, &bp, + BTREE_ITER_CACHED); if (bch2_err_matches(ret, BCH_ERR_transaction_restart)) continue; if (ret) -- cgit v1.2.3