mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
From: Robert Pang <robertpang@google.com>
To: colyli@fygo.io, kent.overstreet@linux.dev
Cc: linux-bcache@vger.kernel.org, linux-kernel@vger.kernel.org,
	 robertpang@google.com, dongsheng.yang@easystack.cn,
	mingzhe.zou@easystack.cn
Subject: [PATCH] bcache: allow more bucket reclaims during garbage collection
Date: Mon,  2 Nov 2026 23:01:22 -0800	[thread overview]
Message-ID: <20261103070122.1208383-1-robertpang@google.com> (raw)

In patch a14a68b76954 ("bcache: allow allocator to invalidate bucket in gc"),
reclaimable buckets are added to the free list for the bucket allocator
at the start of a GC cycle.

However, once these buckets are allocated, they are no longer marked as
reclaimable until the GC cycle finishes. Under heavy loads and frequent cache
updates, all reclaimable buckets can be exhausted before the GC ends, causing
the allocator to wait and stalling incoming I/O.

Address this by allowing reclaimable buckets to be reclaimed during GC up to
the number of generations left before BUCKET_GC_GEN_MAX.

Signed-off-by: Robert Pang <robertpang@google.com>
---
 drivers/md/bcache/alloc.c  | 3 ++-
 drivers/md/bcache/bcache.h | 2 +-
 drivers/md/bcache/btree.c  | 5 +++--
 3 files changed, 6 insertions(+), 4 deletions(-)

diff --git a/drivers/md/bcache/alloc.c b/drivers/md/bcache/alloc.c
index 3ec240ec685d..959d753e7cf6 100644
--- a/drivers/md/bcache/alloc.c
+++ b/drivers/md/bcache/alloc.c
@@ -141,7 +141,8 @@ void __bch_invalidate_one_bucket(struct cache *ca, struct bucket *b)
 	bch_inc_gen(ca, b);
 	b->prio = INITIAL_PRIO;
 	atomic_inc(&b->pin);
-	b->reclaimable_in_gc = 0;
+	if (b->reclaimable_in_gc)
+		b->reclaimable_in_gc--;
 }
 
 static void bch_invalidate_one_bucket(struct cache *ca, struct bucket *b)
diff --git a/drivers/md/bcache/bcache.h b/drivers/md/bcache/bcache.h
index ec9ff9715081..daae5ac5ffbc 100644
--- a/drivers/md/bcache/bcache.h
+++ b/drivers/md/bcache/bcache.h
@@ -200,7 +200,7 @@ struct bucket {
 	uint8_t		gen;
 	uint8_t		last_gc; /* Most out of date gen in the btree */
 	uint16_t	gc_mark; /* Bitfield used by GC. See below for field */
-	uint16_t	reclaimable_in_gc:1;
+	uint8_t		reclaimable_in_gc; /* no. of times reclaimable in GC */
 };
 
 /*
diff --git a/drivers/md/bcache/btree.c b/drivers/md/bcache/btree.c
index 27a129d47d0a..fc167868c814 100644
--- a/drivers/md/bcache/btree.c
+++ b/drivers/md/bcache/btree.c
@@ -1742,9 +1742,10 @@ static void btree_gc_start(struct cache_set *c)
 
 	ca = c->cache;
 	for_each_bucket(b, ca) {
-		b->last_gc = b->gen;
 		if (bch_can_invalidate_bucket(ca, b))
-			b->reclaimable_in_gc = 1;
+			b->reclaimable_in_gc =
+				BUCKET_GC_GEN_MAX - bucket_gc_gen(b);
+		b->last_gc = b->gen;
 		if (!atomic_read(&b->pin)) {
 			SET_GC_MARK(b, 0);
 			SET_GC_SECTORS_USED(b, 0);
-- 
2.56.0.398.g882cbad275-goog


                 reply	other threads:[~2026-11-03  7:02 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

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=20261103070122.1208383-1-robertpang@google.com \
    --to=robertpang@google.com \
    --cc=colyli@fygo.io \
    --cc=dongsheng.yang@easystack.cn \
    --cc=kent.overstreet@linux.dev \
    --cc=linux-bcache@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingzhe.zou@easystack.cn \
    /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

all inboxes | Powered by JetHome®