]> git.sesse.net Git - bcachefs-tools-debian/blob - libbcachefs/alloc_types.h
Disable pristine-tar option in gbp.conf, since there is no pristine-tar branch.
[bcachefs-tools-debian] / libbcachefs / alloc_types.h
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 */