bcachefs: More open buckets
authorKent Overstreet <kent.overstreet@gmail.com>
Tue, 9 Jun 2020 19:44:03 +0000 (15:44 -0400)
committerKent Overstreet <kent.overstreet@linux.dev>
Sun, 22 Oct 2023 21:08:41 +0000 (17:08 -0400)
We need a larger open bucket reserve now that the btree interior update
path holds onto open bucket references; filesystems with many high
through devices may need more open buckets now.

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

index 832568dc9551565bbb8acd4e285bf06c130bb88b..4f14650779947f8c854a5bf16782aaa1d277ee5b 100644 (file)
@@ -46,16 +46,22 @@ enum alloc_reserve {
 
 typedef FIFO(long)     alloc_fifo;
 
-/* Enough for 16 cache devices, 2 tiers and some left over for pipelining */
-#define OPEN_BUCKETS_COUNT     256
+#define OPEN_BUCKETS_COUNT     1024
 
 #define WRITE_POINT_HASH_NR    32
 #define WRITE_POINT_MAX                32
 
+typedef u16                    open_bucket_idx_t;
+
 struct open_bucket {
        spinlock_t              lock;
        atomic_t                pin;
-       u8                      freelist;
+       open_bucket_idx_t       freelist;
+
+       /*
+        * When an open bucket has an ec_stripe attached, this is the index of
+        * the block in the stripe this open_bucket corresponds to:
+        */
        u8                      ec_idx;
        u8                      type;
        unsigned                valid:1;
@@ -68,8 +74,8 @@ struct open_bucket {
 #define OPEN_BUCKET_LIST_MAX   15
 
 struct open_buckets {
-       u8                      nr;
-       u8                      v[OPEN_BUCKET_LIST_MAX];
+       open_bucket_idx_t       nr;
+       open_bucket_idx_t       v[OPEN_BUCKET_LIST_MAX];
 };
 
 struct dev_stripe_state {
index 31c4bac6322f329fa634f4b0e3a930b617c501d4..a219969357bc2394ab595dd47592204cd51c4a2c 100644 (file)
@@ -428,8 +428,8 @@ struct bch_dev {
        alloc_fifo              free[RESERVE_NR];
        alloc_fifo              free_inc;
 
-       u8                      open_buckets_partial[OPEN_BUCKETS_COUNT];
-       unsigned                open_buckets_partial_nr;
+       open_bucket_idx_t       open_buckets_partial[OPEN_BUCKETS_COUNT];
+       open_bucket_idx_t       open_buckets_partial_nr;
 
        size_t                  fifo_last_bucket;
 
@@ -690,8 +690,8 @@ struct bch_fs {
        struct closure_waitlist freelist_wait;
        u64                     blocked_allocate;
        u64                     blocked_allocate_open_bucket;
-       u8                      open_buckets_freelist;
-       u8                      open_buckets_nr_free;
+       open_bucket_idx_t       open_buckets_freelist;
+       open_bucket_idx_t       open_buckets_nr_free;
        struct closure_waitlist open_buckets_wait;
        struct open_bucket      open_buckets[OPEN_BUCKETS_COUNT];
 
index 17bd1ca1fb780f169afac77d6c9f885ce00964aa..4a5b9dcfbdd0235713a7513a19c2fd9922c09a8d 100644 (file)
@@ -92,9 +92,9 @@ struct btree_update {
        struct btree                    *new_nodes[BTREE_UPDATE_NODES_MAX];
        unsigned                        nr_new_nodes;
 
-       u8                              open_buckets[BTREE_UPDATE_NODES_MAX *
+       open_bucket_idx_t               open_buckets[BTREE_UPDATE_NODES_MAX *
                                                     BCH_REPLICAS_MAX];
-       u8                              nr_open_buckets;
+       open_bucket_idx_t               nr_open_buckets;
 
        unsigned                        journal_u64s;
        u64                             journal_entries[BTREE_UPDATE_JOURNAL_RES];