bcachefs: Improve alloc_mem_to_key()
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 11 Dec 2021 02:24:36 +0000 (21:24 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:18 +0000 (17:09 -0400)
This moves some common code into alloc_mem_to_key(), which translates
from the in-memory format for a bucket to the btree key format.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
fs/bcachefs/alloc_background.c
fs/bcachefs/alloc_background.h
fs/bcachefs/buckets.c

index 4953cbee2655b1dc7d557231d8c9e27b2d8f9279..39538dada30168659434b3b477b6b0a2f1aec4f2 100644 (file)
@@ -393,9 +393,6 @@ static int bch2_alloc_write_key(struct btree_trans *trans,
 {
        struct bch_fs *c = trans->c;
        struct bkey_s_c k;
-       struct bch_dev *ca;
-       struct bucket *g;
-       struct bucket_mark m;
        struct bkey_alloc_unpacked old_u, new_u;
        int ret;
 retry:
@@ -411,14 +408,8 @@ retry:
        if (ret)
                goto err;
 
-       old_u = bch2_alloc_unpack(k);
-
-       percpu_down_read(&c->mark_lock);
-       ca      = bch_dev_bkey_exists(c, iter->pos.inode);
-       g       = bucket(ca, iter->pos.offset);
-       m       = READ_ONCE(g->mark);
-       new_u   = alloc_mem_to_key(iter, g, m);
-       percpu_up_read(&c->mark_lock);
+       old_u   = bch2_alloc_unpack(k);
+       new_u   = alloc_mem_to_key(c, iter);
 
        if (!bkey_alloc_unpacked_cmp(old_u, new_u))
                return 0;
@@ -470,9 +461,7 @@ int bch2_bucket_io_time_reset(struct btree_trans *trans, unsigned dev,
                              size_t bucket_nr, int rw)
 {
        struct bch_fs *c = trans->c;
-       struct bch_dev *ca = bch_dev_bkey_exists(c, dev);
        struct btree_iter iter;
-       struct bucket *g;
        struct bkey_alloc_unpacked u;
        u64 *time, now;
        int ret = 0;
@@ -485,10 +474,7 @@ int bch2_bucket_io_time_reset(struct btree_trans *trans, unsigned dev,
        if (ret)
                goto out;
 
-       percpu_down_read(&c->mark_lock);
-       g = bucket(ca, bucket_nr);
-       u = alloc_mem_to_key(&iter, g, READ_ONCE(g->mark));
-       percpu_up_read(&c->mark_lock);
+       u = alloc_mem_to_key(c, &iter);
 
        time = rw == READ ? &u.read_time : &u.write_time;
        now = atomic64_read(&c->io_clock[rw].now);
@@ -766,8 +752,6 @@ static int bucket_invalidate_btree(struct btree_trans *trans,
 {
        struct bch_fs *c = trans->c;
        struct bkey_alloc_unpacked u;
-       struct bucket *g;
-       struct bucket_mark m;
        struct btree_iter iter;
        int ret;
 
@@ -781,11 +765,7 @@ static int bucket_invalidate_btree(struct btree_trans *trans,
        if (ret)
                goto err;
 
-       percpu_down_read(&c->mark_lock);
-       g = bucket(ca, b);
-       m = READ_ONCE(g->mark);
-       u = alloc_mem_to_key(&iter, g, m);
-       percpu_up_read(&c->mark_lock);
+       u = alloc_mem_to_key(c, &iter);
 
        u.gen++;
        u.data_type     = 0;
index 6698d9c75d07c12264bcb29cab296ea2f43208bb..e3cdb8bc1dd8f6ef260166e88fbf2f4559de6bf3 100644 (file)
@@ -4,7 +4,9 @@
 
 #include "bcachefs.h"
 #include "alloc_types.h"
+#include "buckets.h"
 #include "debug.h"
+#include "super.h"
 
 extern const char * const bch2_allocator_states[];
 
@@ -43,22 +45,31 @@ int bch2_alloc_write(struct btree_trans *, struct btree_iter *,
 int bch2_bucket_io_time_reset(struct btree_trans *, unsigned, size_t, int);
 
 static inline struct bkey_alloc_unpacked
-alloc_mem_to_key(struct btree_iter *iter,
-                struct bucket *g, struct bucket_mark m)
+alloc_mem_to_key(struct bch_fs *c, struct btree_iter *iter)
 {
-       return (struct bkey_alloc_unpacked) {
+       struct bch_dev *ca;
+       struct bucket *g;
+       struct bkey_alloc_unpacked ret;
+
+       percpu_down_read(&c->mark_lock);
+       ca      = bch_dev_bkey_exists(c, iter->pos.inode);
+       g       = bucket(ca, iter->pos.offset);
+       ret     = (struct bkey_alloc_unpacked) {
                .dev            = iter->pos.inode,
                .bucket         = iter->pos.offset,
-               .gen            = m.gen,
+               .gen            = g->mark.gen,
                .oldest_gen     = g->oldest_gen,
-               .data_type      = m.data_type,
-               .dirty_sectors  = m.dirty_sectors,
-               .cached_sectors = m.cached_sectors,
+               .data_type      = g->mark.data_type,
+               .dirty_sectors  = g->mark.dirty_sectors,
+               .cached_sectors = g->mark.cached_sectors,
                .read_time      = g->io_time[READ],
                .write_time     = g->io_time[WRITE],
                .stripe         = g->stripe,
                .stripe_redundancy = g->stripe_redundancy,
        };
+       percpu_up_read(&c->mark_lock);
+
+       return ret;
 }
 
 #define ALLOC_SCAN_BATCH(ca)           max_t(size_t, 1, (ca)->mi.nbuckets >> 9)
index 6bbf088cd095b87ffc39542cbd9f81cbb13f3e8c..4fef482ad60e7cff070d23440e34fe48ec45693c 100644 (file)
@@ -1492,7 +1492,6 @@ static int bch2_trans_start_alloc_update(struct btree_trans *trans, struct btree
        struct bch_fs *c = trans->c;
        struct bch_dev *ca = bch_dev_bkey_exists(c, ptr->dev);
        struct bpos pos = POS(ptr->dev, PTR_BUCKET_NR(ca, ptr));
-       struct bucket *g;
        struct bkey_i *update;
        int ret;
 
@@ -1507,14 +1506,9 @@ static int bch2_trans_start_alloc_update(struct btree_trans *trans, struct btree
        }
 
        update = __bch2_btree_trans_peek_updates(iter);
-       if (update && !bpos_cmp(update->k.p, pos)) {
-               *u = bch2_alloc_unpack(bkey_i_to_s_c(update));
-       } else {
-               percpu_down_read(&c->mark_lock);
-               g = bucket(ca, pos.offset);
-               *u = alloc_mem_to_key(iter, g, READ_ONCE(g->mark));
-               percpu_up_read(&c->mark_lock);
-       }
+       *u = update && !bpos_cmp(update->k.p, pos)
+               ? bch2_alloc_unpack(bkey_i_to_s_c(update))
+               : alloc_mem_to_key(c, iter);
 
        return 0;
 }