bcachefs: Optimize btree_path_alloc()
authorKent Overstreet <kent.overstreet@linux.dev>
Mon, 26 Sep 2022 20:19:56 +0000 (16:19 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:09:42 +0000 (17:09 -0400)
 - move slowpath code to a separate function, btree_path_overflow()
 - no need to use hweight64
 - copy nr_max_paths from btree_transaction_stats to btree_trans,
   avoiding a data dependency in the fast path

Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/btree_iter.c

index 30e7f07e3fa82b9852f0b2acce2d817b637d37ec..366be8015b9708a355595251ec4c89e333d7df28 100644 (file)
@@ -1408,7 +1408,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 = hweight64(trans->paths_allocated);
+                       s->nr_max_paths = trans->nr_max_paths =
+                               hweight64(trans->paths_allocated);
                        swap(s->max_paths_text, buf.buf);
                }
                mutex_unlock(&s->lock);
@@ -1419,17 +1420,21 @@ static void bch2_trans_update_max_paths(struct btree_trans *trans)
        trans->nr_max_paths = hweight64(trans->paths_allocated);
 }
 
-static struct btree_path *btree_path_alloc(struct btree_trans *trans,
-                                          struct btree_path *pos)
+static noinline void btree_path_overflow(struct btree_trans *trans)
+{
+       bch2_dump_trans_paths_updates(trans);
+       panic("trans path oveflow\n");
+}
+
+static inline struct btree_path *btree_path_alloc(struct btree_trans *trans,
+                                                 struct btree_path *pos)
 {
        struct btree_path *path;
        unsigned idx;
 
        if (unlikely(trans->paths_allocated ==
-                    ~((~0ULL << 1) << (BTREE_ITER_MAX - 1)))) {
-               bch2_dump_trans_paths_updates(trans);
-               panic("trans path oveflow\n");
-       }
+                    ~((~0ULL << 1) << (BTREE_ITER_MAX - 1))))
+               btree_path_overflow(trans);
 
        idx = __ffs64(~trans->paths_allocated);
        trans->paths_allocated |= 1ULL << idx;