diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2020-08-12 13:49:09 -0400 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2020-08-25 13:09:38 -0400 |
commit | 668e07476f2367a9bc1b1ad4ebcea38ef5f99cf9 (patch) | |
tree | 0c7a0b29e8182666be2f30cd080a6f7dcb9cfae9 | |
parent | 27a602416aa94536b650ff372ac84845a02a9af6 (diff) |
bcachefs: Change copygc to consider bucket fragmentation
When devices have different sized buckets this is more correct.
Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
-rw-r--r-- | fs/bcachefs/buckets_types.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/movinggc.c | 20 |
2 files changed, 12 insertions, 9 deletions
diff --git a/fs/bcachefs/buckets_types.h b/fs/bcachefs/buckets_types.h index 4ebe80b05ffc..d5215b14d7d9 100644 --- a/fs/bcachefs/buckets_types.h +++ b/fs/bcachefs/buckets_types.h @@ -125,6 +125,7 @@ struct disk_reservation { struct copygc_heap_entry { u8 dev; u8 gen; + u16 fragmentation; u32 sectors; u64 offset; }; diff --git a/fs/bcachefs/movinggc.c b/fs/bcachefs/movinggc.c index 55aa463f992f..de0a7974ec9f 100644 --- a/fs/bcachefs/movinggc.c +++ b/fs/bcachefs/movinggc.c @@ -44,13 +44,6 @@ #define COPYGC_BUCKETS_PER_ITER(ca) \ ((ca)->free[RESERVE_MOVINGGC].size / 2) -static inline int sectors_used_cmp(copygc_heap *heap, - struct copygc_heap_entry l, - struct copygc_heap_entry r) -{ - return cmp_int(l.sectors, r.sectors); -} - static int bucket_offset_cmp(const void *_l, const void *_r, size_t size) { const struct copygc_heap_entry *l = _l; @@ -123,6 +116,13 @@ static bool have_copygc_reserve(struct bch_dev *ca) return ret; } +static inline int fragmentation_cmp(copygc_heap *heap, + struct copygc_heap_entry l, + struct copygc_heap_entry r) +{ + return cmp_int(l.fragmentation, r.fragmentation); +} + static int bch2_copygc(struct bch_fs *c) { copygc_heap *h = &c->copygc_heap; @@ -180,10 +180,12 @@ static int bch2_copygc(struct bch_fs *c) e = (struct copygc_heap_entry) { .dev = dev_idx, .gen = m.gen, + .fragmentation = bucket_sectors_used(m) * (1U << 15) + / ca->mi.bucket_size, .sectors = bucket_sectors_used(m), .offset = bucket_to_sector(ca, b), }; - heap_add_or_replace(h, e, -sectors_used_cmp, NULL); + heap_add_or_replace(h, e, -fragmentation_cmp, NULL); } up_read(&ca->bucket_lock); } @@ -197,7 +199,7 @@ static int bch2_copygc(struct bch_fs *c) sectors_to_move += i->sectors; while (sectors_to_move > sectors_reserved) { - BUG_ON(!heap_pop(h, e, -sectors_used_cmp, NULL)); + BUG_ON(!heap_pop(h, e, -fragmentation_cmp, NULL)); sectors_to_move -= e.sectors; } |