bcachefs: Refactor trans->paths_allocated to be standard bitmap
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 4 Dec 2023 05:20:42 +0000 (00:20 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Mon, 1 Jan 2024 16:47:40 +0000 (11:47 -0500)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c
fs/bcachefs/btree_iter.h
fs/bcachefs/btree_locking.h
fs/bcachefs/btree_types.h

index 1a1e833..59815c0 100644 (file)
@@ -1298,7 +1298,7 @@ static inline void __bch2_path_free(struct btree_trans *trans, struct btree_path
 {
        __bch2_btree_path_unlock(trans, path);
        btree_path_list_remove(trans, path);
-       trans->paths_allocated &= ~(1ULL << path->idx);
+       __clear_bit(path->idx, trans->paths_allocated);
 }
 
 void bch2_path_put(struct btree_trans *trans, struct btree_path *path, bool intent)
@@ -1471,6 +1471,7 @@ static void bch2_trans_update_max_paths(struct btree_trans *trans)
 {
        struct btree_transaction_stats *s = btree_trans_stats(trans);
        struct printbuf buf = PRINTBUF;
+       size_t nr = bitmap_weight(trans->paths_allocated, BTREE_ITER_MAX);
 
        if (!s)
                return;
@@ -1479,9 +1480,8 @@ static void bch2_trans_update_max_paths(struct btree_trans *trans)
 
        if (!buf.allocation_failure) {
                mutex_lock(&s->lock);
-               if (s->nr_max_paths < hweight64(trans->paths_allocated)) {
-                       s->nr_max_paths = trans->nr_max_paths =
-                               hweight64(trans->paths_allocated);
+               if (nr > s->nr_max_paths) {
+                       s->nr_max_paths = nr;
                        swap(s->max_paths_text, buf.buf);
                }
                mutex_unlock(&s->lock);
@@ -1489,7 +1489,7 @@ static void bch2_trans_update_max_paths(struct btree_trans *trans)
 
        printbuf_exit(&buf);
 
-       trans->nr_max_paths = hweight64(trans->paths_allocated);
+       trans->nr_max_paths = nr;
 }
 
 noinline __cold
@@ -1518,13 +1518,12 @@ static inline struct btree_path *btree_path_alloc(struct btree_trans *trans,
                                                  struct btree_path *pos)
 {
        struct btree_path *path;
-       unsigned idx;
+       size_t idx = find_first_zero_bit(trans->paths_allocated, BTREE_ITER_MAX);
 
-       if (unlikely(trans->paths_allocated ==
-                    ~((~0ULL << 1) << (BTREE_ITER_MAX - 1))))
+       if (unlikely(idx == BTREE_ITER_MAX))
                btree_path_overflow(trans);
 
-       idx = __ffs64(~trans->paths_allocated);
+       BUG_ON(idx > BTREE_ITER_MAX);
 
        /*
         * Do this before marking the new path as allocated, since it won't be
@@ -1533,7 +1532,7 @@ static inline struct btree_path *btree_path_alloc(struct btree_trans *trans,
        if (unlikely(idx > trans->nr_max_paths))
                bch2_trans_update_max_paths(trans);
 
-       trans->paths_allocated |= 1ULL << idx;
+       __set_bit(idx, trans->paths_allocated);
 
        path = &trans->paths[idx];
        path->idx               = idx;
@@ -2516,7 +2515,7 @@ static void btree_trans_verify_sorted_refs(struct btree_trans *trans)
        struct btree_path *path;
        unsigned i;
 
-       BUG_ON(trans->nr_sorted != hweight64(trans->paths_allocated));
+       BUG_ON(trans->nr_sorted != bitmap_weight(trans->paths_allocated, BTREE_ITER_MAX));
 
        trans_for_each_path(trans, path) {
                BUG_ON(path->sorted_idx >= trans->nr_sorted);
@@ -2526,7 +2525,7 @@ static void btree_trans_verify_sorted_refs(struct btree_trans *trans)
        for (i = 0; i < trans->nr_sorted; i++) {
                unsigned idx = trans->sorted[i];
 
-               EBUG_ON(!(trans->paths_allocated & (1ULL << idx)));
+               BUG_ON(!test_bit(idx, trans->paths_allocated));
                BUG_ON(trans->paths[idx].sorted_idx != i);
        }
 }
index 3859c0b..2a65720 100644 (file)
@@ -66,17 +66,10 @@ static inline void btree_trans_sort_paths(struct btree_trans *trans)
 static inline struct btree_path *
 __trans_next_path(struct btree_trans *trans, unsigned idx)
 {
-       u64 l;
-
+       idx = find_next_bit(trans->paths_allocated, BTREE_ITER_MAX, idx);
        if (idx == BTREE_ITER_MAX)
                return NULL;
-
-       l = trans->paths_allocated >> idx;
-       if (!l)
-               return NULL;
-
-       idx += __ffs64(l);
-       EBUG_ON(idx >= BTREE_ITER_MAX);
+       EBUG_ON(idx > BTREE_ITER_MAX);
        EBUG_ON(trans->paths[idx].idx != idx);
        return &trans->paths[idx];
 }
@@ -92,17 +85,11 @@ __trans_next_path(struct btree_trans *trans, unsigned idx)
 static inline struct btree_path *
 __trans_next_path_safe(struct btree_trans *trans, unsigned *idx)
 {
-       u64 l;
-
+       *idx = find_next_bit(trans->paths_allocated, BTREE_ITER_MAX, *idx);
        if (*idx == BTREE_ITER_MAX)
                return NULL;
 
-       l = trans->paths_allocated >> *idx;
-       if (!l)
-               return NULL;
-
-       *idx += __ffs64(l);
-       EBUG_ON(*idx >= BTREE_ITER_MAX);
+       EBUG_ON(*idx > BTREE_ITER_MAX);
        return &trans->paths[*idx];
 }
 
@@ -631,7 +618,7 @@ int __bch2_btree_trans_too_many_iters(struct btree_trans *);
 
 static inline int btree_trans_too_many_iters(struct btree_trans *trans)
 {
-       if (hweight64(trans->paths_allocated) > BTREE_ITER_MAX - 8)
+       if (bitmap_weight(trans->paths_allocated, BTREE_ITER_MAX) > BTREE_ITER_MAX - 8)
                return __bch2_btree_trans_too_many_iters(trans);
 
        return 0;
index 11b0a2c..a49f1dd 100644 (file)
@@ -263,7 +263,7 @@ static inline int btree_node_lock(struct btree_trans *trans,
        int ret = 0;
 
        EBUG_ON(level >= BTREE_MAX_DEPTH);
-       EBUG_ON(!(trans->paths_allocated & (1ULL << path->idx)));
+       EBUG_ON(!test_bit(path->idx, trans->paths_allocated));
 
        if (likely(six_trylock_type(&b->lock, type)) ||
            btree_node_lock_increment(trans, b, level, (enum btree_node_locked_type) type) ||
index ca75266..78d9f58 100644 (file)
@@ -414,7 +414,7 @@ struct btree_trans {
        unsigned                extra_journal_res;
        unsigned                nr_max_paths;
 
-       u64                     paths_allocated;
+       unsigned long           paths_allocated[BITS_TO_LONGS(BTREE_ITER_MAX)];
 
        unsigned                mem_top;
        unsigned                mem_max;