struct mutex btree_interior_update_lock;
struct closure_waitlist btree_interior_update_wait;
+ mempool_t btree_iters_pool;
+
struct workqueue_struct *wq;
/* copygc needs its own workqueue for index updates.. */
struct workqueue_struct *copygc_wq;
bch2_trans_unlock(trans);
- new_iters = kmalloc(sizeof(struct btree_iter) * BTREE_ITER_MAX,
- GFP_NOFS);
- if (!new_iters)
- return -ENOMEM;
+ new_iters = mempool_alloc(&trans->c->btree_iters_pool, GFP_NOFS);
memcpy(new_iters, trans->iters,
sizeof(struct btree_iter) * trans->nr_iters);
return 0;
}
-int bch2_trans_preload_iters(struct btree_trans *trans)
+void bch2_trans_preload_iters(struct btree_trans *trans)
{
- if (trans->iters != trans->iters_onstack)
- return 0;
-
- return btree_trans_realloc_iters(trans);
+ if (trans->iters == trans->iters_onstack)
+ btree_trans_realloc_iters(trans);
}
static struct btree_iter *__btree_trans_get_iter(struct btree_trans *trans,
kfree(trans->mem);
if (trans->iters != trans->iters_onstack)
- kfree(trans->iters);
+ mempool_free(trans->iters, &trans->c->btree_iters_pool);
trans->mem = (void *) 0x1;
trans->iters = (void *) 0x1;
return ret;
/* new multiple iterator interface: */
-int bch2_trans_preload_iters(struct btree_trans *);
+void bch2_trans_preload_iters(struct btree_trans *);
void bch2_trans_iter_free(struct btree_trans *,
struct btree_iter *);
bch2_trans_init(&trans, c);
- BUG_ON(bch2_trans_preload_iters(&trans));
+ bch2_trans_preload_iters(&trans);
iter = bch2_trans_get_iter(&trans, BTREE_ID_DIRENTS,
POS(BCACHEFS_ROOT_INO, 0), 0);
bch2_trans_init(&trans, c);
- BUG_ON(bch2_trans_preload_iters(&trans));
+ bch2_trans_preload_iters(&trans);
iter = bch2_trans_get_iter(&trans, BTREE_ID_XATTRS,
POS(BCACHEFS_ROOT_INO, 0), 0);
bch2_fs_compress_exit(c);
percpu_free_rwsem(&c->usage_lock);
free_percpu(c->usage_percpu);
+ mempool_exit(&c->btree_iters_pool);
mempool_exit(&c->btree_bounce_pool);
bioset_exit(&c->btree_bio);
mempool_exit(&c->btree_interior_update_pool);
percpu_init_rwsem(&c->usage_lock) ||
mempool_init_kvpmalloc_pool(&c->btree_bounce_pool, 1,
btree_bytes(c)) ||
+ mempool_init_kmalloc_pool(&c->btree_iters_pool, 1,
+ sizeof(struct btree_iter) * BTREE_ITER_MAX) ||
bch2_io_clock_init(&c->io_clock[READ]) ||
bch2_io_clock_init(&c->io_clock[WRITE]) ||
bch2_fs_journal_init(&c->journal) ||