]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
bcache: add comment for cache_set->fill_iter
authorShenghui Wang <shhuiw@foxmail.com>
Thu, 13 Dec 2018 14:53:46 +0000 (22:53 +0800)
committerJens Axboe <axboe@kernel.dk>
Thu, 13 Dec 2018 15:15:54 +0000 (08:15 -0700)
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>
drivers/md/bcache/bcache.h
drivers/md/bcache/btree.c

index b61b83bbcfffc0104827619f2eab689ff7ececb9..96d2213f279ed39b0ea6f61836043caa63906eec 100644 (file)
@@ -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;
 
index 3f4211b5cd3347329c16bac78b3fe2c04804d3ae..23cb1dc7296bf2701fa93659bfeef3b8b66621ca 100644 (file)
@@ -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;