Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 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 | |
Kent Overstreet | ae10fe0 | 2022-11-04 16:06:55 -0400 | [diff] [blame] | 11 | struct bucket_alloc_state { |
Kent Overstreet | c670509 | 2024-04-20 16:25:34 -0400 | [diff] [blame] | 12 | enum { |
| 13 | BTREE_BITMAP_NO, |
| 14 | BTREE_BITMAP_YES, |
| 15 | BTREE_BITMAP_ANY, |
| 16 | } btree_bitmap; |
| 17 | |
Kent Overstreet | ae10fe0 | 2022-11-04 16:06:55 -0400 | [diff] [blame] | 18 | u64 buckets_seen; |
| 19 | u64 skipped_open; |
| 20 | u64 skipped_need_journal_commit; |
Kent Overstreet | a8b3a67 | 2022-11-02 17:12:00 -0400 | [diff] [blame] | 21 | u64 skipped_nocow; |
Kent Overstreet | ae10fe0 | 2022-11-04 16:06:55 -0400 | [diff] [blame] | 22 | u64 skipped_nouse; |
Kent Overstreet | c670509 | 2024-04-20 16:25:34 -0400 | [diff] [blame] | 23 | u64 skipped_mi_btree_bitmap; |
Kent Overstreet | ae10fe0 | 2022-11-04 16:06:55 -0400 | [diff] [blame] | 24 | }; |
| 25 | |
Kent Overstreet | e53a961 | 2023-06-24 19:30:10 -0400 | [diff] [blame] | 26 | #define BCH_WATERMARKS() \ |
Kent Overstreet | ec14fc6 | 2023-06-27 17:32:38 -0400 | [diff] [blame] | 27 | x(stripe) \ |
Kent Overstreet | e53a961 | 2023-06-24 19:30:10 -0400 | [diff] [blame] | 28 | x(normal) \ |
Kent Overstreet | ec14fc6 | 2023-06-27 17:32:38 -0400 | [diff] [blame] | 29 | x(copygc) \ |
| 30 | x(btree) \ |
| 31 | x(btree_copygc) \ |
Kent Overstreet | e2a316b | 2024-04-01 19:20:36 -0400 | [diff] [blame] | 32 | x(reclaim) \ |
| 33 | x(interior_updates) |
Kent Overstreet | 3e15471 | 2022-03-13 19:27:55 -0400 | [diff] [blame] | 34 | |
Kent Overstreet | e53a961 | 2023-06-24 19:30:10 -0400 | [diff] [blame] | 35 | enum bch_watermark { |
| 36 | #define x(name) BCH_WATERMARK_##name, |
| 37 | BCH_WATERMARKS() |
Kent Overstreet | 3e15471 | 2022-03-13 19:27:55 -0400 | [diff] [blame] | 38 | #undef x |
Kent Overstreet | e53a961 | 2023-06-24 19:30:10 -0400 | [diff] [blame] | 39 | BCH_WATERMARK_NR, |
Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 40 | }; |
| 41 | |
Kent Overstreet | ec14fc6 | 2023-06-27 17:32:38 -0400 | [diff] [blame] | 42 | #define BCH_WATERMARK_BITS 3 |
Kent Overstreet | bf5a261 | 2023-08-01 20:06:45 -0400 | [diff] [blame] | 43 | #define BCH_WATERMARK_MASK ~(~0U << BCH_WATERMARK_BITS) |
Kent Overstreet | ec14fc6 | 2023-06-27 17:32:38 -0400 | [diff] [blame] | 44 | |
Kent Overstreet | 374153c | 2020-06-09 15:44:03 -0400 | [diff] [blame] | 45 | #define OPEN_BUCKETS_COUNT 1024 |
Kent Overstreet | b092dad | 2018-11-04 21:55:35 -0500 | [diff] [blame] | 46 | |
| 47 | #define WRITE_POINT_HASH_NR 32 |
| 48 | #define WRITE_POINT_MAX 32 |
Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 49 | |
Kent Overstreet | 9ddffaf | 2021-12-25 21:43:29 -0500 | [diff] [blame] | 50 | /* |
| 51 | * 0 is never a valid open_bucket_idx_t: |
| 52 | */ |
Kent Overstreet | 374153c | 2020-06-09 15:44:03 -0400 | [diff] [blame] | 53 | typedef u16 open_bucket_idx_t; |
| 54 | |
Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 55 | struct open_bucket { |
| 56 | spinlock_t lock; |
| 57 | atomic_t pin; |
Kent Overstreet | 374153c | 2020-06-09 15:44:03 -0400 | [diff] [blame] | 58 | open_bucket_idx_t freelist; |
Kent Overstreet | 9ddffaf | 2021-12-25 21:43:29 -0500 | [diff] [blame] | 59 | open_bucket_idx_t hash; |
Kent Overstreet | 374153c | 2020-06-09 15:44:03 -0400 | [diff] [blame] | 60 | |
| 61 | /* |
| 62 | * When an open bucket has an ec_stripe attached, this is the index of |
| 63 | * the block in the stripe this open_bucket corresponds to: |
| 64 | */ |
Kent Overstreet | cd575dd | 2018-11-01 15:13:19 -0400 | [diff] [blame] | 65 | u8 ec_idx; |
Kent Overstreet | 7635e1a | 2023-02-25 02:22:49 -0500 | [diff] [blame] | 66 | enum bch_data_type data_type:6; |
Kent Overstreet | b030f69 | 2019-01-19 13:13:29 -0500 | [diff] [blame] | 67 | unsigned valid:1; |
| 68 | unsigned on_partial_list:1; |
Kent Overstreet | abe19d4 | 2021-12-25 21:21:46 -0500 | [diff] [blame] | 69 | |
Kent Overstreet | abe19d4 | 2021-12-25 21:21:46 -0500 | [diff] [blame] | 70 | u8 dev; |
| 71 | u8 gen; |
Kent Overstreet | 822835f | 2022-04-01 01:29:59 -0400 | [diff] [blame] | 72 | u32 sectors_free; |
Kent Overstreet | abe19d4 | 2021-12-25 21:21:46 -0500 | [diff] [blame] | 73 | u64 bucket; |
Kent Overstreet | cd575dd | 2018-11-01 15:13:19 -0400 | [diff] [blame] | 74 | struct ec_stripe_new *ec; |
Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 75 | }; |
| 76 | |
Kent Overstreet | ef337c5 | 2018-10-06 04:12:42 -0400 | [diff] [blame] | 77 | #define OPEN_BUCKET_LIST_MAX 15 |
| 78 | |
| 79 | struct open_buckets { |
Kent Overstreet | 374153c | 2020-06-09 15:44:03 -0400 | [diff] [blame] | 80 | open_bucket_idx_t nr; |
| 81 | open_bucket_idx_t v[OPEN_BUCKET_LIST_MAX]; |
Kent Overstreet | ef337c5 | 2018-10-06 04:12:42 -0400 | [diff] [blame] | 82 | }; |
| 83 | |
Kent Overstreet | cd575dd | 2018-11-01 15:13:19 -0400 | [diff] [blame] | 84 | struct dev_stripe_state { |
| 85 | u64 next_alloc[BCH_SB_MEMBERS_MAX]; |
| 86 | }; |
| 87 | |
Kent Overstreet | b17d3ce | 2022-10-31 16:13:05 -0400 | [diff] [blame] | 88 | #define WRITE_POINT_STATES() \ |
| 89 | x(stopped) \ |
| 90 | x(waiting_io) \ |
| 91 | x(waiting_work) \ |
| 92 | x(running) |
| 93 | |
| 94 | enum write_point_state { |
| 95 | #define x(n) WRITE_POINT_##n, |
| 96 | WRITE_POINT_STATES() |
| 97 | #undef x |
| 98 | WRITE_POINT_STATE_NR |
| 99 | }; |
| 100 | |
Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 101 | struct write_point { |
Kent Overstreet | b17d3ce | 2022-10-31 16:13:05 -0400 | [diff] [blame] | 102 | struct { |
| 103 | struct hlist_node node; |
| 104 | struct mutex lock; |
| 105 | u64 last_used; |
| 106 | unsigned long write_point; |
| 107 | enum bch_data_type data_type; |
Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 108 | |
Kent Overstreet | b17d3ce | 2022-10-31 16:13:05 -0400 | [diff] [blame] | 109 | /* calculated based on how many pointers we're actually going to use: */ |
| 110 | unsigned sectors_free; |
Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 111 | |
Kent Overstreet | b17d3ce | 2022-10-31 16:13:05 -0400 | [diff] [blame] | 112 | struct open_buckets ptrs; |
| 113 | struct dev_stripe_state stripe; |
| 114 | |
| 115 | u64 sectors_allocated; |
Kent Overstreet | 1e81f89 | 2023-08-07 12:04:05 -0400 | [diff] [blame] | 116 | } __aligned(SMP_CACHE_BYTES); |
Kent Overstreet | b17d3ce | 2022-10-31 16:13:05 -0400 | [diff] [blame] | 117 | |
| 118 | struct { |
| 119 | struct work_struct index_update_work; |
| 120 | |
| 121 | struct list_head writes; |
| 122 | spinlock_t writes_lock; |
| 123 | |
| 124 | enum write_point_state state; |
| 125 | u64 last_state_change; |
| 126 | u64 time[WRITE_POINT_STATE_NR]; |
Kent Overstreet | 1e81f89 | 2023-08-07 12:04:05 -0400 | [diff] [blame] | 127 | } __aligned(SMP_CACHE_BYTES); |
Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 128 | }; |
| 129 | |
| 130 | struct write_point_specifier { |
| 131 | unsigned long v; |
| 132 | }; |
| 133 | |
Kent Overstreet | 1c6fdbd | 2017-03-16 22:18:50 -0800 | [diff] [blame] | 134 | #endif /* _BCACHEFS_ALLOC_TYPES_H */ |