public inbox for linux-bcache@vger.kernel.org
 help / color / mirror / Atom feed
From: colyli@suse.de
To: axboe@kernel.dk
Cc: linux-bcache@vger.kernel.org, linux-block@vger.kernel.org,
	Coly Li <colyli@suse.de>
Subject: [PATCH 16/17] bcache: reap c->btree_cache_freeable from the tail in bch_mca_scan()
Date: Fri, 24 Jan 2020 01:01:41 +0800	[thread overview]
Message-ID: <20200123170142.98974-17-colyli@suse.de> (raw)
In-Reply-To: <20200123170142.98974-1-colyli@suse.de>

From: Coly Li <colyli@suse.de>

In order to skip the most recently freed btree node cahce, currently
in bch_mca_scan() the first 3 caches in c->btree_cache_freeable list
are skipped when shrinking bcache node caches in bch_mca_scan(). The
related code in bch_mca_scan() is,

 737 list_for_each_entry_safe(b, t, &c->btree_cache_freeable, list) {
 738         if (nr <= 0)
 739                 goto out;
 740
 741         if (++i > 3 &&
 742             !mca_reap(b, 0, false)) {
             		lines free cache memory
 746         }
 747         nr--;
 748 }

The problem is, if virtual memory code calls bch_mca_scan() and
the calculated 'nr' is 1 or 2, then in the above loop, nothing will
be shunk. In such case, if slub/slab manager calls bch_mca_scan()
for many times with small scan number, it does not help to shrink
cache memory and just wasts CPU cycles.

This patch just selects btree node caches from tail of the
c->btree_cache_freeable list, then the newly freed host cache can
still be allocated by mca_alloc(), and at least 1 node can be shunk.

Signed-off-by: Coly Li <colyli@suse.de>
---
 drivers/md/bcache/btree.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 357535a5c89c..c3a314deb09d 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -734,17 +734,17 @@ static unsigned long bch_mca_scan(struct shrinker *shrink,
 
 	i = 0;
 	btree_cache_used = c->btree_cache_used;
-	list_for_each_entry_safe(b, t, &c->btree_cache_freeable, list) {
+	list_for_each_entry_safe_reverse(b, t, &c->btree_cache_freeable, list) {
 		if (nr <= 0)
 			goto out;
 
-		if (++i > 3 &&
-		    !mca_reap(b, 0, false)) {
+		if (!mca_reap(b, 0, false)) {
 			mca_data_free(b);
 			rw_unlock(true, b);
 			freed++;
 		}
 		nr--;
+		i++;
 	}
 
 	for (;  (nr--) && i < btree_cache_used; i++) {
-- 
2.16.4

  parent reply	other threads:[~2020-01-23 17:01 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-01-23 17:01 [PATCH 00/17] bcache patches for Linux v5.6 colyli
2020-01-23 17:01 ` [PATCH 01/17] bcache: cached_dev_free needs to put the sb page colyli
2020-01-23 17:01 ` [PATCH 02/17] bcache: use a separate data structure for the on-disk super block colyli
2020-01-23 17:01 ` [PATCH 03/17] bcache: rework error unwinding in register_bcache colyli
2020-01-23 17:01 ` [PATCH 04/17] bcache: properly initialize 'path' and 'err' in register_bcache() colyli
2020-01-23 17:01 ` [PATCH 05/17] bcache: fix use-after-free " colyli
2020-01-23 17:01 ` [PATCH 06/17] bcache: transfer the sb_page reference to register_{bdev,cache} colyli
2020-01-23 17:01 ` [PATCH 07/17] bcache: return a pointer to the on-disk sb from read_super colyli
2020-01-23 17:01 ` [PATCH 08/17] bcache: store a pointer to the on-disk sb in the cache and cached_dev structures colyli
2020-01-23 17:01 ` [PATCH 09/17] bcache: use read_cache_page_gfp to read the superblock colyli
2020-01-23 17:01 ` [PATCH 10/17] lib: crc64: include <linux/crc64.h> for 'crc64_be' colyli
2020-01-23 17:01 ` [PATCH 11/17] bcache: add code comments for state->pool in __btree_sort() colyli
2020-01-23 17:01 ` [PATCH 12/17] bcache: avoid unnecessary btree nodes flushing in btree_flush_write() colyli
2020-01-23 17:01 ` [PATCH 13/17] bcache: print written and keys in trace_bcache_btree_write colyli
2020-01-23 17:01 ` [PATCH 14/17] bcache: back to cache all readahead I/Os colyli
2020-01-23 17:19   ` Michael Lyle
2020-01-23 17:27     ` Coly Li
2020-01-23 18:31       ` Jens Axboe
2020-01-24  0:49         ` Coly Li
2020-01-24  1:14           ` Jens Axboe
2020-01-24 16:48       ` Michael Lyle
2020-01-23 17:01 ` [PATCH 15/17] bcache: remove member accessed from struct btree colyli
2020-01-23 17:01 ` colyli [this message]
2020-01-23 17:01 ` [PATCH 17/17] bcache: reap from tail of c->btree_cache in bch_mca_scan() colyli

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20200123170142.98974-17-colyli@suse.de \
    --to=colyli@suse.de \
    --cc=axboe@kernel.dk \
    --cc=linux-bcache@vger.kernel.org \
    --cc=linux-block@vger.kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox