From: Kent Overstreet Date: Tue, 27 Apr 2021 18:03:13 +0000 (-0400) Subject: bcachefs: Change copygc wait amount to be min of per device waits X-Git-Url: http://git.maquefel.me/?a=commitdiff_plain;h=d4b4422345fcb4e284260bd52166e189c137e846;p=linux.git bcachefs: Change copygc wait amount to be min of per device waits We're seeing a filesystem get stuck when all devices but one have no more reclaimable buckets - because the copygc wait amount is curretly filesystem wide. This patch should fix that, possibly at the expensive of running too much when only one or a few devices is full and the rebalance thread needs to move data around. Signed-off-by: Kent Overstreet Signed-off-by: Kent Overstreet --- diff --git a/fs/bcachefs/movinggc.c b/fs/bcachefs/movinggc.c index f9146ccd70ef0..acb4d943db79e 100644 --- a/fs/bcachefs/movinggc.c +++ b/fs/bcachefs/movinggc.c @@ -293,17 +293,19 @@ unsigned long bch2_copygc_wait_amount(struct bch_fs *c) { struct bch_dev *ca; unsigned dev_idx; - u64 fragmented_allowed = 0, fragmented = 0; + s64 wait = S64_MAX, fragmented_allowed, fragmented; for_each_rw_member(ca, c, dev_idx) { struct bch_dev_usage usage = bch2_dev_usage_read(ca); - fragmented_allowed += ((__dev_buckets_reclaimable(ca, usage) * + fragmented_allowed = ((__dev_buckets_reclaimable(ca, usage) * ca->mi.bucket_size) >> 1); - fragmented += usage.d[BCH_DATA_user].fragmented; + fragmented = usage.d[BCH_DATA_user].fragmented; + + wait = min(wait, max(0LL, fragmented_allowed - fragmented)); } - return max_t(s64, 0, fragmented_allowed - fragmented); + return wait; } static int bch2_copygc_thread(void *arg)