summaryrefslogtreecommitdiff
path: root/libbcachefs/movinggc.c
diff options
context:
space:
mode:
authorKent Overstreet <kent.overstreet@gmail.com>2018-03-20 03:54:50 -0400
committerKent Overstreet <kent.overstreet@gmail.com>2018-03-20 03:54:50 -0400
commitff5e165532a2eed87700649d03f91a612a58e92a (patch)
tree7055fa329edebf03fc059a7e26ded01c464defce /libbcachefs/movinggc.c
parent33d0a49489c60df4df924bfbc0c7ad98a11dd3ed (diff)
Update bcachefs sources to 9fc6ccd865 bcachefs: fix copygc_pred()
Diffstat (limited to 'libbcachefs/movinggc.c')
-rw-r--r--libbcachefs/movinggc.c37
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;
}