diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2018-03-20 03:54:50 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2018-03-20 03:54:50 -0400 |
commit | ff5e165532a2eed87700649d03f91a612a58e92a (patch) | |
tree | 7055fa329edebf03fc059a7e26ded01c464defce /libbcachefs/movinggc.c | |
parent | 33d0a49489c60df4df924bfbc0c7ad98a11dd3ed (diff) |
Update bcachefs sources to 9fc6ccd865 bcachefs: fix copygc_pred()
Diffstat (limited to 'libbcachefs/movinggc.c')
-rw-r--r-- | libbcachefs/movinggc.c | 37 |
1 files changed, 27 insertions, 10 deletions
diff --git a/libbcachefs/movinggc.c b/libbcachefs/movinggc.c index 2aa58b55..3b4a5292 100644 --- a/libbcachefs/movinggc.c +++ b/libbcachefs/movinggc.c @@ -72,9 +72,9 @@ static bool __copygc_pred(struct bch_dev *ca, if (ptr) { struct copygc_heap_entry search = { .offset = ptr->offset }; - size_t i = eytzinger0_find_le(h->data, h->used, - sizeof(h->data[0]), - bucket_offset_cmp, &search); + ssize_t i = eytzinger0_find_le(h->data, h->used, + sizeof(h->data[0]), + bucket_offset_cmp, &search); return (i >= 0 && ptr->offset < h->data[i].offset + ca->mi.bucket_size && @@ -213,8 +213,9 @@ static int bch2_copygc_thread(void *arg) struct bch_dev *ca = arg; struct bch_fs *c = ca->fs; struct io_clock *clock = &c->io_clock[WRITE]; + struct bch_dev_usage usage; unsigned long last; - u64 available, want, next; + u64 available, fragmented, reserve, next; set_freezable(); @@ -223,16 +224,32 @@ static int bch2_copygc_thread(void *arg) break; last = atomic_long_read(&clock->now); + + reserve = div64_u64((ca->mi.nbuckets - ca->mi.first_bucket) * + ca->mi.bucket_size * + c->opts.gc_reserve_percent, 200); + + usage = bch2_dev_usage_read(c, ca); + /* * don't start copygc until less than half the gc reserve is * available: */ - available = dev_buckets_available(c, ca); - want = div64_u64((ca->mi.nbuckets - ca->mi.first_bucket) * - c->opts.gc_reserve_percent, 200); - if (available > want) { - next = last + (available - want) * - ca->mi.bucket_size; + available = __dev_buckets_available(ca, usage) * + ca->mi.bucket_size; + if (available > reserve) { + next = last + available - reserve; + bch2_kthread_io_clock_wait(clock, next); + continue; + } + + /* + * don't start copygc until there's more than half the copygc + * reserve of fragmented space: + */ + fragmented = usage.sectors_fragmented; + if (fragmented < reserve) { + next = last + reserve - fragmented; bch2_kthread_io_clock_wait(clock, next); continue; } |