bcachefs: Don't use key cache during fsck
authorKent Overstreet <kent.overstreet@linux.dev>
Fri, 14 Oct 2022 11:02:36 +0000 (07:02 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:51 +0000 (17:09 -0400)
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 <kent.overstreet@linux.dev>
fs/bcachefs/alloc_foreground.c
fs/bcachefs/backpointers.c
fs/bcachefs/backpointers.h
fs/bcachefs/ec.c
fs/bcachefs/move.c

index 5988aa288c98b5e3206cf8fe24a87a4a3788529f..a179bbe23c93518d4a78dafd409b556c8e42e2eb 100644 (file)
@@ -352,7 +352,8 @@ static struct open_bucket *try_alloc_bucket(struct btree_trans *trans, struct bc
                u64 bp_offset = 0;
 
                ret = bch2_get_next_backpointer(trans, POS(ca->dev_idx, b), -1,
-                                               &bp_offset, &bp);
+                                               &bp_offset, &bp,
+                                               BTREE_ITER_NOPRESERVE);
                if (ret) {
                        ob = ERR_PTR(ret);
                        goto err;
index 20cd5bf349c46bb16419a7858ed45a92f210c691..3978c0b50f2049c65ec257f56bf09ebf519d906d 100644 (file)
@@ -300,7 +300,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;
@@ -921,7 +922,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;
 
index e1506492f022a35cd371433d71fab7199fcaf4d0..153870d4e9a0ca88f649c20ec3473635d7fb2075 100644 (file)
@@ -118,7 +118,7 @@ static inline void bch2_extent_ptr_to_bp(struct bch_fs *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 *,
index c7ac2894db2eb648d5b0e9205968f440a030d385..7028fb718ebf1d9a3bebcff26f982cd472492e76 100644 (file)
@@ -841,7 +841,8 @@ static int ec_stripe_update_extent(struct btree_trans *trans,
        struct bkey_i *n;
        int ret, dev, block;
 
-       ret = bch2_get_next_backpointer(trans, bucket, gen, bp_offset, &bp);
+       ret = bch2_get_next_backpointer(trans, bucket, gen,
+                               bp_offset, &bp, BTREE_ITER_CACHED);
        if (ret)
                return ret;
        if (*bp_offset == U64_MAX)
index 690c3128c5e1711cbc75e413ede0bc6ceda6d8f3..8eb4978cc043e9c41832d1a758fa5d43b34786ab 100644 (file)
@@ -608,7 +608,8 @@ failed_to_evacuate:
                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)
@@ -681,7 +682,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)