diff options
author | Kent Overstreet <kent.overstreet@gmail.com> | 2019-01-19 13:13:29 -0500 |
---|---|---|
committer | Kent Overstreet <kent.overstreet@gmail.com> | 2019-04-03 12:44:03 -0400 |
commit | e103a69883c515f1ae6aed126a578c5bb2ed6841 (patch) | |
tree | c85e701e3edbf0d0e646ac3b040d04a699c5167e | |
parent | e4fca82fca5c831fb38d1ff10c52b6e92c11ed74 (diff) |
bcachefs: Fix some reserve calculations
-rw-r--r-- | fs/bcachefs/alloc_foreground.c | 6 | ||||
-rw-r--r-- | fs/bcachefs/alloc_foreground.h | 1 | ||||
-rw-r--r-- | fs/bcachefs/alloc_types.h | 5 | ||||
-rw-r--r-- | fs/bcachefs/bcachefs.h | 2 | ||||
-rw-r--r-- | fs/bcachefs/sysfs.c | 19 |
5 files changed, 26 insertions, 7 deletions
diff --git a/fs/bcachefs/alloc_foreground.c b/fs/bcachefs/alloc_foreground.c index 4041972236bb..f2f9015dbb00 100644 --- a/fs/bcachefs/alloc_foreground.c +++ b/fs/bcachefs/alloc_foreground.c @@ -106,6 +106,7 @@ void __bch2_open_bucket_put(struct bch_fs *c, struct open_bucket *ob) bch2_mark_alloc_bucket(c, ca, PTR_BUCKET_NR(ca, &ob->ptr), false, gc_pos_alloc(c, ob), 0); ob->valid = false; + ob->type = 0; spin_unlock(&ob->lock); percpu_up_read_preempt_enable(&c->mark_lock); @@ -141,6 +142,7 @@ static struct open_bucket *bch2_open_bucket_alloc(struct bch_fs *c) ob = c->open_buckets + c->open_buckets_freelist; c->open_buckets_freelist = ob->freelist; atomic_set(&ob->pin, 1); + ob->type = 0; c->open_buckets_nr_free--; return ob; @@ -209,9 +211,9 @@ static inline unsigned open_buckets_reserved(enum alloc_reserve reserve) case RESERVE_ALLOC: return 0; case RESERVE_BTREE: - return BTREE_NODE_RESERVE / 2; + return BTREE_NODE_OPEN_BUCKET_RESERVE; default: - return BTREE_NODE_RESERVE; + return BTREE_NODE_OPEN_BUCKET_RESERVE * 2; } } diff --git a/fs/bcachefs/alloc_foreground.h b/fs/bcachefs/alloc_foreground.h index b0e44f758d7f..5224a52f8beb 100644 --- a/fs/bcachefs/alloc_foreground.h +++ b/fs/bcachefs/alloc_foreground.h @@ -85,6 +85,7 @@ static inline void bch2_open_bucket_get(struct bch_fs *c, unsigned i; open_bucket_for_each(c, &wp->ptrs, ob, i) { + ob->type = wp->type; atomic_inc(&ob->pin); ob_push(c, ptrs, ob); } diff --git a/fs/bcachefs/alloc_types.h b/fs/bcachefs/alloc_types.h index 6f17f094c21e..66457fc722fd 100644 --- a/fs/bcachefs/alloc_types.h +++ b/fs/bcachefs/alloc_types.h @@ -55,9 +55,10 @@ struct open_bucket { spinlock_t lock; atomic_t pin; u8 freelist; - bool valid; - bool on_partial_list; u8 ec_idx; + u8 type; + unsigned valid:1; + unsigned on_partial_list:1; unsigned sectors_free; struct bch_extent_ptr ptr; struct ec_stripe_new *ec; diff --git a/fs/bcachefs/bcachefs.h b/fs/bcachefs/bcachefs.h index 8faddf4eaa02..a279e96472b1 100644 --- a/fs/bcachefs/bcachefs.h +++ b/fs/bcachefs/bcachefs.h @@ -330,6 +330,8 @@ enum bch_time_stats { /* Size of the freelist we allocate btree nodes from: */ #define BTREE_NODE_RESERVE BTREE_RESERVE_MAX +#define BTREE_NODE_OPEN_BUCKET_RESERVE (BTREE_RESERVE_MAX * BCH_REPLICAS_MAX) + struct btree; enum gc_phase { diff --git a/fs/bcachefs/sysfs.c b/fs/bcachefs/sysfs.c index 316f827fa490..3a25163e2de0 100644 --- a/fs/bcachefs/sysfs.c +++ b/fs/bcachefs/sysfs.c @@ -796,6 +796,12 @@ static ssize_t show_dev_alloc_debug(struct bch_dev *ca, char *buf) { struct bch_fs *c = ca->fs; struct bch_dev_usage stats = bch2_dev_usage_read(c, ca); + unsigned i, nr[BCH_DATA_NR]; + + memset(nr, 0, sizeof(nr)); + + for (i = 0; i < ARRAY_SIZE(c->open_buckets); i++) + nr[c->open_buckets[i].type]++; return scnprintf(buf, PAGE_SIZE, "free_inc: %zu/%zu\n" @@ -822,7 +828,10 @@ static ssize_t show_dev_alloc_debug(struct bch_dev *ca, char *buf) " copygc threshold: %llu\n" "freelist_wait: %s\n" "open buckets: %u/%u (reserved %u)\n" - "open_buckets_wait: %s\n", + "open_buckets_wait: %s\n" + "open_buckets_btree: %u\n" + "open_buckets_user: %u\n" + "btree reserve cache: %u\n", fifo_used(&ca->free_inc), ca->free_inc.size, fifo_used(&ca->free[RESERVE_BTREE]), ca->free[RESERVE_BTREE].size, fifo_used(&ca->free[RESERVE_MOVINGGC]), ca->free[RESERVE_MOVINGGC].size, @@ -844,8 +853,12 @@ static ssize_t show_dev_alloc_debug(struct bch_dev *ca, char *buf) stats.sectors_fragmented, ca->copygc_threshold, c->freelist_wait.list.first ? "waiting" : "empty", - c->open_buckets_nr_free, OPEN_BUCKETS_COUNT, BTREE_NODE_RESERVE, - c->open_buckets_wait.list.first ? "waiting" : "empty"); + c->open_buckets_nr_free, OPEN_BUCKETS_COUNT, + BTREE_NODE_OPEN_BUCKET_RESERVE, + c->open_buckets_wait.list.first ? "waiting" : "empty", + nr[BCH_DATA_BTREE], + nr[BCH_DATA_USER], + c->btree_reserve_cache_nr); } static const char * const bch2_rw[] = { |