bcachefs: Dont' use percpu btree_iter buf in userspace
authorKent Overstreet <kent.overstreet@gmail.com>
Mon, 16 Nov 2020 23:20:50 +0000 (18:20 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:47 +0000 (17:08 -0400)
bcachefs-tools doesn't have a real percpu (per thread) implementation
yet

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

index 6eebbadcef45d833888ba27c8a34ee063a96334d..0e8c8f3400def19707f3ed5839f6cd6913724b93 100644 (file)
@@ -2343,12 +2343,15 @@ static void bch2_trans_alloc_iters(struct btree_trans *trans, struct bch_fs *c)
        unsigned new_size = BTREE_ITER_MAX;
        size_t iters_bytes      = sizeof(struct btree_iter) * new_size;
        size_t updates_bytes    = sizeof(struct btree_insert_entry) * new_size;
-       void *p;
+       void *p = NULL;
 
        BUG_ON(trans->used_mempool);
 
-       p =     this_cpu_xchg(c->btree_iters_bufs->iter, NULL) ?:
-               mempool_alloc(&trans->c->btree_iters_pool, GFP_NOFS);
+#ifdef __KERNEL__
+       p = this_cpu_xchg(c->btree_iters_bufs->iter, NULL);
+#endif
+       if (!p)
+               p = mempool_alloc(&trans->c->btree_iters_pool, GFP_NOFS);
 
        trans->iters            = p; p += iters_bytes;
        trans->updates          = p; p += updates_bytes;
@@ -2406,7 +2409,12 @@ int bch2_trans_exit(struct btree_trans *trans)
        kfree(trans->fs_usage_deltas);
        kfree(trans->mem);
 
+#ifdef __KERNEL__
+       /*
+        * Userspace doesn't have a real percpu implementation:
+        */
        trans->iters = this_cpu_xchg(c->btree_iters_bufs->iter, trans->iters);
+#endif
        if (trans->iters)
                mempool_free(trans->iters, &trans->c->btree_iters_pool);