bcachefs: Fix some reserve calculations
authorKent Overstreet <kent.overstreet@gmail.com>
Sat, 19 Jan 2019 18:13:29 +0000 (13:13 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:14 +0000 (17:08 -0400)
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_foreground.c
fs/bcachefs/alloc_foreground.h
fs/bcachefs/alloc_types.h
fs/bcachefs/bcachefs.h
fs/bcachefs/sysfs.c

index f37110497b51e3286e4cb5276460335d710d905b..f40fca9328f9f72df062729b4739f3824a66d650 100644 (file)
@@ -107,6 +107,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(&c->mark_lock);
@@ -142,6 +143,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;
@@ -210,9 +212,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;
        }
 }
 
index 94389052fa94cbd403a07e6478ccfba53ae26dcf..6d8ffb0cd06dfb849cc7a274b95b45bd334d0c1c 100644 (file)
@@ -86,6 +86,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);
        }
index ef3e400c7d3da349b225f681b2de064ec90827a8..832568dc9551565bbb8acd4e285bf06c130bb88b 100644 (file)
@@ -56,9 +56,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;
index 64836a8c69d8cf0bc02b1965def1722c24728b26..a5203fbc089ea38176bf616d33bd005f3c48a87d 100644 (file)
@@ -333,6 +333,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 {
index b59b7a5a4cbb121fdf5c9e208c7b6cac603de85e..27fd6dfe83f54caea1a16f32979d4db04f8cfce7 100644 (file)
@@ -797,6 +797,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"
@@ -823,7 +829,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,
@@ -845,8 +854,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[] = {