brintos

brintos / linux-shallow public Read only

0
0
Text · 2.5 KiB · 9bbb28e Raw
135 lines · c
1/* SPDX-License-Identifier: GPL-2.0 */2#ifndef _BCACHEFS_ALLOC_TYPES_H3#define _BCACHEFS_ALLOC_TYPES_H4 5#include <linux/mutex.h>6#include <linux/spinlock.h>7 8#include "clock_types.h"9#include "fifo.h"10 11struct bucket_alloc_state {12	enum {13		BTREE_BITMAP_NO,14		BTREE_BITMAP_YES,15		BTREE_BITMAP_ANY,16	}	btree_bitmap;17 18	u64	buckets_seen;19	u64	skipped_open;20	u64	skipped_need_journal_commit;21	u64	skipped_nocow;22	u64	skipped_nouse;23	u64	skipped_mi_btree_bitmap;24};25 26#define BCH_WATERMARKS()		\27	x(stripe)			\28	x(normal)			\29	x(copygc)			\30	x(btree)			\31	x(btree_copygc)			\32	x(reclaim)			\33	x(interior_updates)34 35enum bch_watermark {36#define x(name)	BCH_WATERMARK_##name,37	BCH_WATERMARKS()38#undef x39	BCH_WATERMARK_NR,40};41 42#define BCH_WATERMARK_BITS	343#define BCH_WATERMARK_MASK	~(~0U << BCH_WATERMARK_BITS)44 45#define OPEN_BUCKETS_COUNT	102446 47#define WRITE_POINT_HASH_NR	3248#define WRITE_POINT_MAX		3249 50/*51 * 0 is never a valid open_bucket_idx_t:52 */53typedef u16			open_bucket_idx_t;54 55struct open_bucket {56	spinlock_t		lock;57	atomic_t		pin;58	open_bucket_idx_t	freelist;59	open_bucket_idx_t	hash;60 61	/*62	 * When an open bucket has an ec_stripe attached, this is the index of63	 * the block in the stripe this open_bucket corresponds to:64	 */65	u8			ec_idx;66	enum bch_data_type	data_type:6;67	unsigned		valid:1;68	unsigned		on_partial_list:1;69 70	u8			dev;71	u8			gen;72	u32			sectors_free;73	u64			bucket;74	struct ec_stripe_new	*ec;75};76 77#define OPEN_BUCKET_LIST_MAX	1578 79struct open_buckets {80	open_bucket_idx_t	nr;81	open_bucket_idx_t	v[OPEN_BUCKET_LIST_MAX];82};83 84struct dev_stripe_state {85	u64			next_alloc[BCH_SB_MEMBERS_MAX];86};87 88#define WRITE_POINT_STATES()		\89	x(stopped)			\90	x(waiting_io)			\91	x(waiting_work)			\92	x(running)93 94enum write_point_state {95#define x(n)	WRITE_POINT_##n,96	WRITE_POINT_STATES()97#undef x98	WRITE_POINT_STATE_NR99};100 101struct write_point {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;108 109		/* calculated based on how many pointers we're actually going to use: */110		unsigned		sectors_free;111 112		struct open_buckets	ptrs;113		struct dev_stripe_state	stripe;114 115		u64			sectors_allocated;116	} __aligned(SMP_CACHE_BYTES);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];127	} __aligned(SMP_CACHE_BYTES);128};129 130struct write_point_specifier {131	unsigned long		v;132};133 134#endif /* _BCACHEFS_ALLOC_TYPES_H */135