| From 3ba917e4dd27bca799403e6c5ba5db457704fb6c Mon Sep 17 00:00:00 2001 |
| From: Sasha Levin <sashal@kernel.org> |
| Date: Wed, 13 Nov 2019 16:03:24 +0800 |
| Subject: bcache: at least try to shrink 1 node in bch_mca_scan() |
| |
| From: Coly Li <colyli@suse.de> |
| |
| [ Upstream commit 9fcc34b1a6dd4b8e5337e2b6ef45e428897eca6b ] |
| |
| In bch_mca_scan(), the number of shrinking btree node is calculated |
| by code like this, |
| unsigned long nr = sc->nr_to_scan; |
| |
| nr /= c->btree_pages; |
| nr = min_t(unsigned long, nr, mca_can_free(c)); |
| variable sc->nr_to_scan is number of objects (here is bcache B+tree |
| nodes' number) to shrink, and pointer variable sc is sent from memory |
| management code as parametr of a callback. |
| |
| If sc->nr_to_scan is smaller than c->btree_pages, after the above |
| calculation, variable 'nr' will be 0 and nothing will be shrunk. It is |
| frequeently observed that only 1 or 2 is set to sc->nr_to_scan and make |
| nr to be zero. Then bch_mca_scan() will do nothing more then acquiring |
| and releasing mutex c->bucket_lock. |
| |
| This patch checkes whether nr is 0 after the above calculation, if 0 |
| is the result then set 1 to variable 'n'. Then at least bch_mca_scan() |
| will try to shrink a single B+tree node. |
| |
| Signed-off-by: Coly Li <colyli@suse.de> |
| Signed-off-by: Jens Axboe <axboe@kernel.dk> |
| Signed-off-by: Sasha Levin <sashal@kernel.org> |
| --- |
| drivers/md/bcache/btree.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c |
| index 45f684689c35..bb40bd66a10e 100644 |
| --- a/drivers/md/bcache/btree.c |
| +++ b/drivers/md/bcache/btree.c |
| @@ -713,6 +713,8 @@ static unsigned long bch_mca_scan(struct shrinker *shrink, |
| * IO can always make forward progress: |
| */ |
| nr /= c->btree_pages; |
| + if (nr == 0) |
| + nr = 1; |
| nr = min_t(unsigned long, nr, mca_can_free(c)); |
| |
| i = 0; |
| -- |
| 2.20.1 |
| |