summaryrefslogtreecommitdiffstats
path: root/drivers/md
diff options
context:
space:
mode:
authorKent Overstreet <koverstreet@google.com>2013-06-03 22:04:56 +0200
committerKent Overstreet <kmo@daterainc.com>2013-07-01 23:42:48 +0200
commit36c9ea9837c1cb21c778781495101eaff7e5eb56 (patch)
treefca141a1e72ac261bee9b58049524ab2849018bf /drivers/md
parentbcache: FUA fixes (diff)
downloadlinux-36c9ea9837c1cb21c778781495101eaff7e5eb56.tar.xz
linux-36c9ea9837c1cb21c778781495101eaff7e5eb56.zip
bcache: Document shrinker reserve better
Signed-off-by: Kent Overstreet <kmo@daterainc.com>
Diffstat (limited to 'drivers/md')
-rw-r--r--drivers/md/bcache/btree.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index a6ad49ac5f2b..04636a70ffaa 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -622,6 +622,13 @@ static int bch_mca_shrink(struct shrinker *shrink, struct shrink_control *sc)
else if (!mutex_trylock(&c->bucket_lock))
return -1;
+ /*
+ * It's _really_ critical that we don't free too many btree nodes - we
+ * have to always leave ourselves a reserve. The reserve is how we
+ * guarantee that allocating memory for a new btree node can always
+ * succeed, so that inserting keys into the btree can always succeed and
+ * IO can always make forward progress:
+ */
nr /= c->btree_pages;
nr = min_t(unsigned long, nr, mca_can_free(c));