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®