Linux bcache driver list
 help / color / mirror / Atom feed
* [PATCH 2/3] bcache: call force_wake_up_gc() if necessary in check_should_bypass()
@ 2024-05-27 17:47 Coly Li
  2024-05-27 17:47 ` [PATCH 3/3] bcache: code cleanup in __bch_bucket_alloc_set() Coly Li
  2024-05-27 22:31 ` [PATCH 2/3] bcache: call force_wake_up_gc() if necessary in check_should_bypass() Eric Wheeler
  0 siblings, 2 replies; 9+ messages in thread
From: Coly Li @ 2024-05-27 17:47 UTC (permalink / raw)
  To: linux-bcache; +Cc: Coly Li

If there are extreme heavy write I/O continuously hit on relative small
cache device (512GB in my testing), it is possible to make counter
c->gc_stats.in_use continue to increase and exceed CUTOFF_CACHE_ADD.

If 'c->gc_stats.in_use > CUTOFF_CACHE_ADD' happens, all following write
requests will bypass the cache device because check_should_bypass()
returns 'true'. Because all writes bypass the cache device, counter
c->sectors_to_gc has no chance to be negative value, and garbage
collection thread won't be waken up even the whole cache becomes clean
after writeback accomplished. The aftermath is that all write I/Os go
directly into backing device even the cache device is clean.

To avoid the above situation, this patch uses a quite conservative way
to fix: if 'c->gc_stats.in_use > CUTOFF_CACHE_ADD' happens, only wakes
up garbage collection thread when the whole cache device is clean.

Before the fix, the writes-always-bypass situation happens after 10+
hours write I/O pressure on 512GB Intel optane memory which acts as
cache device. After this fix, such situation doesn't happen after 36+
hours testing.

Signed-off-by: Coly Li <colyli@suse.de>
---
 drivers/md/bcache/request.c | 16 +++++++++++++++-
 1 file changed, 15 insertions(+), 1 deletion(-)

diff --git a/drivers/md/bcache/request.c b/drivers/md/bcache/request.c
index 83d112bd2b1c..af345dc6fde1 100644
--- a/drivers/md/bcache/request.c
+++ b/drivers/md/bcache/request.c
@@ -369,10 +369,24 @@ static bool check_should_bypass(struct cached_dev *dc, struct bio *bio)
 	struct io *i;
 
 	if (test_bit(BCACHE_DEV_DETACHING, &dc->disk.flags) ||
-	    c->gc_stats.in_use > CUTOFF_CACHE_ADD ||
 	    (bio_op(bio) == REQ_OP_DISCARD))
 		goto skip;
 
+	if (c->gc_stats.in_use > CUTOFF_CACHE_ADD) {
+		/*
+		 * If cached buckets are all clean now, 'true' will be
+		 * returned and all requests will bypass the cache device.
+		 * Then c->sectors_to_gc has no chance to be negative, and
+		 * gc thread won't wake up and caching won't work forever.
+		 * Here call force_wake_up_gc() to avoid such aftermath.
+		 */
+		if (BDEV_STATE(&dc->sb) == BDEV_STATE_CLEAN &&
+		    c->gc_mark_valid)
+			force_wake_up_gc(c);
+
+		goto skip;
+	}
+
 	if (mode == CACHE_MODE_NONE ||
 	    (mode == CACHE_MODE_WRITEAROUND &&
 	     op_is_write(bio_op(bio))))
-- 
2.35.3


^ permalink raw reply related	[flat|nested] 9+ messages in thread
* [PATCH 0/3] bcache-6.10 20240528
@ 2024-05-28 12:09 Coly Li
  2024-05-28 12:09 ` [PATCH 3/3] bcache: code cleanup in __bch_bucket_alloc_set() Coly Li
  0 siblings, 1 reply; 9+ messages in thread
From: Coly Li @ 2024-05-28 12:09 UTC (permalink / raw)
  To: axboe; +Cc: linux-block, linux-bcache, Coly Li

Hi Jens,

This series is just for the patch from Dongsheng Yang, due to more
testing needed, it comes after the first wave.

Dongsheng's patch helps to improve the latency of cache space
allocation. This patch has been shipped in product more than one year
by his team. Robert Pang from Google introduces this patch has been
tested inside Google with quite extended hardware configurations. Eric
Wheeler also deploys this patch in his production for 1+ months.

So far there is no issue reported for this patch, except for a bug in
existed code and easier to be trigger by Dongsheng's patch. This is why
my first patch is composed. Another patch from me is just a code
cleanup cought my eyes during the fix.

Please consider to take them, and thank you in advance.

Coly Li
---

Coly Li (2):
  bcache: call force_wake_up_gc() if necessary in check_should_bypass()
  bcache: code cleanup in __bch_bucket_alloc_set()

Dongsheng Yang (1):
  bcache: allow allocator to invalidate bucket in gc

 drivers/md/bcache/alloc.c   | 21 +++++++--------------
 drivers/md/bcache/bcache.h  |  1 +
 drivers/md/bcache/btree.c   |  7 ++++++-
 drivers/md/bcache/request.c | 16 +++++++++++++++-
 4 files changed, 29 insertions(+), 16 deletions(-)

-- 
2.35.3


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2024-05-29 16:24 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-05-27 17:47 [PATCH 2/3] bcache: call force_wake_up_gc() if necessary in check_should_bypass() Coly Li
2024-05-27 17:47 ` [PATCH 3/3] bcache: code cleanup in __bch_bucket_alloc_set() Coly Li
2024-05-27 22:33   ` Eric Wheeler
2024-05-28  2:18     ` Coly Li
2024-05-27 22:31 ` [PATCH 2/3] bcache: call force_wake_up_gc() if necessary in check_should_bypass() Eric Wheeler
2024-05-28  3:24   ` Coly Li
2024-05-29  0:16     ` Eric Wheeler
2024-05-29 16:23       ` Coly Li
  -- strict thread matches above, loose matches on Subject: below --
2024-05-28 12:09 [PATCH 0/3] bcache-6.10 20240528 Coly Li
2024-05-28 12:09 ` [PATCH 3/3] bcache: code cleanup in __bch_bucket_alloc_set() Coly Li

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox