1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _BCACHEFS_ALLOC_TYPES_H 3 #define _BCACHEFS_ALLOC_TYPES_H 4 5 #include <linux/mutex.h> 6 #include <linux/spinlock.h> 7 8 #include "clock_types.h" 9 #include "fifo.h" 10 11 struct bucket_alloc_state { 12 u64 buckets_seen; 13 u64 skipped_open; 14 u64 skipped_need_journal_commit; 15 u64 skipped_nocow; 16 u64 skipped_nouse; 17 }; 18 19 #define BCH_WATERMARKS() \ 20 x(stripe) \ 21 x(normal) \ 22 x(copygc) \ 23 x(btree) \ 24 x(btree_copygc) \ 25 x(reclaim) 26 27 enum bch_watermark { 28 #define x(name) BCH_WATERMARK_##name, 29 BCH_WATERMARKS() 30 #undef x 31 BCH_WATERMARK_NR, 32 }; 33 34 #define BCH_WATERMARK_BITS 3 35 #define BCH_WATERMARK_MASK ~(~0U << BCH_WATERMARK_BITS) 36 37 #define OPEN_BUCKETS_COUNT 1024 38 39 #define WRITE_POINT_HASH_NR 32 40 #define WRITE_POINT_MAX 32 41 42 /* 43 * 0 is never a valid open_bucket_idx_t: 44 */ 45 typedef u16 open_bucket_idx_t; 46 47 struct open_bucket { 48 spinlock_t lock; 49 atomic_t pin; 50 open_bucket_idx_t freelist; 51 open_bucket_idx_t hash; 52 53 /* 54 * When an open bucket has an ec_stripe attached, this is the index of 55 * the block in the stripe this open_bucket corresponds to: 56 */ 57 u8 ec_idx; 58 enum bch_data_type data_type:6; 59 unsigned valid:1; 60 unsigned on_partial_list:1; 61 62 u8 dev; 63 u8 gen; 64 u32 sectors_free; 65 u64 bucket; 66 struct ec_stripe_new *ec; 67 }; 68 69 #define OPEN_BUCKET_LIST_MAX 15 70 71 struct open_buckets { 72 open_bucket_idx_t nr; 73 open_bucket_idx_t v[OPEN_BUCKET_LIST_MAX]; 74 }; 75 76 struct dev_stripe_state { 77 u64 next_alloc[BCH_SB_MEMBERS_MAX]; 78 }; 79 80 #define WRITE_POINT_STATES() \ 81 x(stopped) \ 82 x(waiting_io) \ 83 x(waiting_work) \ 84 x(running) 85 86 enum write_point_state { 87 #define x(n) WRITE_POINT_##n, 88 WRITE_POINT_STATES() 89 #undef x 90 WRITE_POINT_STATE_NR 91 }; 92 93 struct write_point { 94 struct { 95 struct hlist_node node; 96 struct mutex lock; 97 u64 last_used; 98 unsigned long write_point; 99 enum bch_data_type data_type; 100 101 /* calculated based on how many pointers we're actually going to use: */ 102 unsigned sectors_free; 103 104 struct open_buckets ptrs; 105 struct dev_stripe_state stripe; 106 107 u64 sectors_allocated; 108 } __aligned(SMP_CACHE_BYTES); 109 110 struct { 111 struct work_struct index_update_work; 112 113 struct list_head writes; 114 spinlock_t writes_lock; 115 116 enum write_point_state state; 117 u64 last_state_change; 118 u64 time[WRITE_POINT_STATE_NR]; 119 } __aligned(SMP_CACHE_BYTES); 120 }; 121 122 struct write_point_specifier { 123 unsigned long v; 124 }; 125 126 #endif /* _BCACHEFS_ALLOC_TYPES_H */ 127