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 <kent.overstreet@gmail.com> Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
This commit is contained in:
parent
baa6502905
commit
d4b4422345
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user