]> git.sesse.net Git - bcachefs-tools-debian/blobdiff - libbcachefs/alloc_types.h
Update bcachefs sources to 6406e05835 bcachefs: Nocow support
[bcachefs-tools-debian] / libbcachefs / alloc_types.h
index 1abfff5290bc52e5ef263558a3dfca7287751a42..271b4bf2b95ea1859194f9a00926bba6e5b25a48 100644 (file)
@@ -8,65 +8,59 @@
 #include "clock_types.h"
 #include "fifo.h"
 
-struct ec_bucket_buf;
-
-/* There's two of these clocks, one for reads and one for writes: */
-struct bucket_clock {
-       /*
-        * "now" in (read/write) IO time - incremented whenever we do X amount
-        * of reads or writes.
-        *
-        * Goes with the bucket read/write prios: when we read or write to a
-        * bucket we reset the bucket's prio to the current hand; thus hand -
-        * prio = time since bucket was last read/written.
-        *
-        * The units are some amount (bytes/sectors) of data read/written, and
-        * the units can change on the fly if we need to rescale to fit
-        * everything in a u16 - your only guarantee is that the units are
-        * consistent.
-        */
-       u16                     hand;
-       u16                     max_last_io;
+struct bucket_alloc_state {
+       u64     cur_bucket;
+       u64     buckets_seen;
+       u64     skipped_open;
+       u64     skipped_need_journal_commit;
+       u64     skipped_nocow;
+       u64     skipped_nouse;
+};
 
-       int                     rw;
+struct ec_bucket_buf;
 
-       struct io_timer         rescale;
-       struct mutex            lock;
-};
+#define BCH_ALLOC_RESERVES()           \
+       x(btree_movinggc)               \
+       x(btree)                        \
+       x(movinggc)                     \
+       x(none)
 
 enum alloc_reserve {
-       RESERVE_BTREE_MOVINGGC  = -2,
-       RESERVE_BTREE           = -1,
-       RESERVE_MOVINGGC        = 0,
-       RESERVE_NONE            = 1,
-       RESERVE_NR              = 2,
+#define x(name)        RESERVE_##name,
+       BCH_ALLOC_RESERVES()
+#undef x
 };
 
-typedef FIFO(long)     alloc_fifo;
-
 #define OPEN_BUCKETS_COUNT     1024
 
 #define WRITE_POINT_HASH_NR    32
 #define WRITE_POINT_MAX                32
 
+/*
+ * 0 is never a valid open_bucket_idx_t:
+ */
 typedef u16                    open_bucket_idx_t;
 
 struct open_bucket {
        spinlock_t              lock;
        atomic_t                pin;
        open_bucket_idx_t       freelist;
+       open_bucket_idx_t       hash;
 
        /*
         * 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;
+       enum bch_data_type      data_type:8;
        unsigned                valid:1;
        unsigned                on_partial_list:1;
-       int                     alloc_reserve:3;
-       unsigned                sectors_free;
-       struct bch_extent_ptr   ptr;
+       unsigned                alloc_reserve:3;
+
+       u8                      dev;
+       u8                      gen;
+       u32                     sectors_free;
+       u64                     bucket;
        struct ec_stripe_new    *ec;
 };
 
@@ -86,25 +80,22 @@ struct write_point {
        struct mutex            lock;
        u64                     last_used;
        unsigned long           write_point;
-       enum bch_data_type      type;
+       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;
+
+       struct work_struct      index_update_work;
+
+       struct list_head        writes;
+       spinlock_t              writes_lock;
 };
 
 struct write_point_specifier {
        unsigned long           v;
 };
 
-struct alloc_heap_entry {
-       size_t                  bucket;
-       size_t                  nr;
-       unsigned long           key;
-};
-
-typedef HEAP(struct alloc_heap_entry) alloc_heap;
-
 #endif /* _BCACHEFS_ALLOC_TYPES_H */