blob: 5807ff922ce7677e2448e8e73a749dac21b99aea [file] [log] [blame]
From ed9159dfad45f32cbcc3fd8140521987b8a1818b Mon Sep 17 00:00:00 2001
From: Coly Li <>
Date: Wed, 13 Nov 2019 16:03:24 +0800
Subject: [PATCH] bcache: at least try to shrink 1 node in bch_mca_scan()
commit 9fcc34b1a6dd4b8e5337e2b6ef45e428897eca6b upstream.
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 <>
Signed-off-by: Jens Axboe <>
Signed-off-by: Paul Gortmaker <>
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 5cf3247e8afb..d307c65d90fc 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -719,6 +719,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;