X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libbcachefs%2Falloc_types.h;h=b91b7a46105608d089828db3bd65d1cc359475af;hb=bd9e0153342c51390ec655b4e78eda1aa1c32a84;hp=21b56451bc1811a35edc7e810f13b8cb1f3d1b4a;hpb=74148a8ee52526c44752f1773365963f18734ac9;p=bcachefs-tools-debian diff --git a/libbcachefs/alloc_types.h b/libbcachefs/alloc_types.h index 21b5645..b91b7a4 100644 --- a/libbcachefs/alloc_types.h +++ b/libbcachefs/alloc_types.h @@ -8,20 +8,32 @@ #include "clock_types.h" #include "fifo.h" -struct ec_bucket_buf; +struct bucket_alloc_state { + u64 buckets_seen; + u64 skipped_open; + u64 skipped_need_journal_commit; + u64 skipped_nocow; + u64 skipped_nouse; +}; -#define BCH_ALLOC_RESERVES() \ - x(btree_movinggc) \ +#define BCH_WATERMARKS() \ + x(stripe) \ + x(normal) \ + x(copygc) \ x(btree) \ - x(movinggc) \ - x(none) + x(btree_copygc) \ + x(reclaim) -enum alloc_reserve { -#define x(name) RESERVE_##name, - BCH_ALLOC_RESERVES() +enum bch_watermark { +#define x(name) BCH_WATERMARK_##name, + BCH_WATERMARKS() #undef x + BCH_WATERMARK_NR, }; +#define BCH_WATERMARK_BITS 3 +#define BCH_WATERMARK_MASK ~(~0U << BCH_WATERMARK_BITS) + #define OPEN_BUCKETS_COUNT 1024 #define WRITE_POINT_HASH_NR 32 @@ -43,14 +55,13 @@ struct open_bucket { * the block in the stripe this open_bucket corresponds to: */ u8 ec_idx; - enum bch_data_type data_type:3; + enum bch_data_type data_type:6; unsigned valid:1; unsigned on_partial_list:1; - int alloc_reserve:3; - unsigned sectors_free; u8 dev; u8 gen; + u32 sectors_free; u64 bucket; struct ec_stripe_new *ec; }; @@ -66,18 +77,46 @@ struct dev_stripe_state { u64 next_alloc[BCH_SB_MEMBERS_MAX]; }; +#define WRITE_POINT_STATES() \ + x(stopped) \ + x(waiting_io) \ + x(waiting_work) \ + x(running) + +enum write_point_state { +#define x(n) WRITE_POINT_##n, + WRITE_POINT_STATES() +#undef x + WRITE_POINT_STATE_NR +}; + struct write_point { - struct hlist_node node; - struct mutex lock; - u64 last_used; - unsigned long write_point; - enum bch_data_type data_type; + struct { + struct hlist_node node; + struct mutex lock; + u64 last_used; + unsigned long write_point; + enum bch_data_type data_type; + + /* calculated based on how many pointers we're actually going to use: */ + unsigned sectors_free; + + struct open_buckets ptrs; + struct dev_stripe_state stripe; + + u64 sectors_allocated; + } __aligned(SMP_CACHE_BYTES); + + struct { + struct work_struct index_update_work; - /* calculated based on how many pointers we're actually going to use: */ - unsigned sectors_free; + struct list_head writes; + spinlock_t writes_lock; - struct open_buckets ptrs; - struct dev_stripe_state stripe; + enum write_point_state state; + u64 last_state_change; + u64 time[WRITE_POINT_STATE_NR]; + } __aligned(SMP_CACHE_BYTES); }; struct write_point_specifier {