bcachefs: Reserve some open buckets for btree allocations
authorKent Overstreet <kent.overstreet@gmail.com>
Thu, 7 Jan 2021 22:18:14 +0000 (17:18 -0500)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:50 +0000 (17:08 -0400)
This reverts part of the change from "bcachefs: Don't use
BTREE_INSERT_USE_RESERVE so much" - it turns out we still should be
reserving open buckets for btree node allocations, because otherwise
data bucket allocations (especially with erasure coding enabled) can use
up all our open buckets and we won't be able to do the metadata update
that lets us release those open bucket references. Oops.

Signed-off-by: Kent Overstreet <kent.overstreet@gmail.com>
Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
fs/bcachefs/alloc_foreground.c
fs/bcachefs/alloc_types.h
fs/bcachefs/btree_update_interior.c

index df9f022e692610cf9ad9b1b26f12585a600b1318..476c46f596ccbd4e706b80137935bd3ed494680b 100644 (file)
@@ -204,8 +204,11 @@ success:
 static inline unsigned open_buckets_reserved(enum alloc_reserve reserve)
 {
        switch (reserve) {
-       case RESERVE_MOVINGGC:
+       case RESERVE_BTREE:
+       case RESERVE_BTREE_MOVINGGC:
                return 0;
+       case RESERVE_MOVINGGC:
+               return OPEN_BUCKETS_COUNT / 4;
        default:
                return OPEN_BUCKETS_COUNT / 2;
        }
@@ -261,6 +264,7 @@ struct open_bucket *bch2_bucket_alloc(struct bch_fs *c, struct bch_dev *ca,
                goto out;
 
        switch (reserve) {
+       case RESERVE_BTREE_MOVINGGC:
        case RESERVE_MOVINGGC:
                if (fifo_pop(&ca->free[RESERVE_MOVINGGC], bucket))
                        goto out;
index 0cfb026a02e5ed9f499ec2d5e4ffd22172282310..1abfff5290bc52e5ef263558a3dfca7287751a42 100644 (file)
@@ -34,9 +34,9 @@ struct bucket_clock {
        struct mutex            lock;
 };
 
-/* There is one reserve for each type of btree, one for prios and gens
- * and one for moving GC */
 enum alloc_reserve {
+       RESERVE_BTREE_MOVINGGC  = -2,
+       RESERVE_BTREE           = -1,
        RESERVE_MOVINGGC        = 0,
        RESERVE_NONE            = 1,
        RESERVE_NR              = 2,
index 2fa3a9aeb89a6770356eec4dd9bf0e2283e1a376..c25ce358f931f5035b7c515ff3b501ddbdaffff7 100644 (file)
@@ -203,10 +203,10 @@ static struct btree *__bch2_btree_node_alloc(struct bch_fs *c,
 
        if (flags & BTREE_INSERT_USE_RESERVE) {
                nr_reserve      = 0;
-               alloc_reserve   = RESERVE_MOVINGGC;
+               alloc_reserve   = RESERVE_BTREE_MOVINGGC;
        } else {
                nr_reserve      = BTREE_NODE_RESERVE;
-               alloc_reserve   = RESERVE_NONE;
+               alloc_reserve   = RESERVE_BTREE;
        }
 
        mutex_lock(&c->btree_reserve_cache_lock);