bcache: add comment for cache_set->fill_iter
We have the following define for btree iterator: struct btree_iter { size_t size, used; #ifdef CONFIG_BCACHE_DEBUG struct btree_keys *b; #endif struct btree_iter_set { struct bkey *k, *end; } data[MAX_BSETS]; }; We can see that the length of data[] field is static MAX_BSETS, which is defined as 4 currently. But a btree node on disk could have too many bsets for an iterator to fit on the stack - maybe far more that MAX_BSETS. Have to dynamically allocate space to host more btree_iter_sets. bch_cache_set_alloc() will make sure the pool cache_set->fill_iter can allocate an iterator equipped with enough room that can host (sb.bucket_size / sb.block_size) btree_iter_sets, which is more than static MAX_BSETS. bch_btree_node_read_done() will use that pool to allocate one iterator, to host many bsets in one btree node. Add more comment around cache_set->fill_iter to make code less confusing. Signed-off-by: Shenghui Wang <shhuiw@foxmail.com> Signed-off-by: Coly Li <colyli@suse.de> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
0273ac349f
commit
d2f96f487f
|
@ -658,7 +658,11 @@ struct cache_set {
|
|||
|
||||
/*
|
||||
* A btree node on disk could have too many bsets for an iterator to fit
|
||||
* on the stack - have to dynamically allocate them
|
||||
* on the stack - have to dynamically allocate them.
|
||||
* bch_cache_set_alloc() will make sure the pool can allocate iterators
|
||||
* equipped with enough room that can host
|
||||
* (sb.bucket_size / sb.block_size)
|
||||
* btree_iter_sets, which is more than static MAX_BSETS.
|
||||
*/
|
||||
mempool_t fill_iter;
|
||||
|
||||
|
|
|
@ -207,6 +207,11 @@ void bch_btree_node_read_done(struct btree *b)
|
|||
struct bset *i = btree_bset_first(b);
|
||||
struct btree_iter *iter;
|
||||
|
||||
/*
|
||||
* c->fill_iter can allocate an iterator with more memory space
|
||||
* than static MAX_BSETS.
|
||||
* See the comment arount cache_set->fill_iter.
|
||||
*/
|
||||
iter = mempool_alloc(&b->c->fill_iter, GFP_NOIO);
|
||||
iter->size = b->c->sb.bucket_size / b->c->sb.block_size;
|
||||
iter->used = 0;
|
||||
|
|
Loading…
Reference in New Issue