File Index
Files and directories
Sign in
FILE

xfs_zone_priv.h

File preview with syntax highlighting.

linux-6.19.14/fs/xfs/xfs_zone_priv.h C
  1/* SPDX-License-Identifier: GPL-2.0 */
  2#ifndef _XFS_ZONE_PRIV_H
  3#define _XFS_ZONE_PRIV_H
  4
  5struct xfs_open_zone {
  6	/*
  7	 * Entry in the open zone list and refcount.  Protected by
  8	 * zi_open_zones_lock in struct xfs_zone_info.
  9	 */
 10	struct list_head	oz_entry;
 11	atomic_t		oz_ref;
 12
 13	/*
 14	 * oz_allocated is the amount of space already allocated out of the zone
 15	 * and is protected by oz_alloc_lock.
 16	 *
 17	 * For conventional zones it also is the offset of the next write.
 18	 */
 19	spinlock_t		oz_alloc_lock;
 20	xfs_rgblock_t		oz_allocated;
 21
 22	/*
 23	 * oz_written is the number of blocks for which we've received a write
 24	 * completion.  oz_written must always be <= oz_allocated and is
 25	 * protected by the ILOCK of the rmap inode.
 26	 */
 27	xfs_rgblock_t		oz_written;
 28
 29	/*
 30	 * Write hint (data temperature) assigned to this zone, or
 31	 * WRITE_LIFE_NOT_SET if none was set.
 32	 */
 33	enum rw_hint		oz_write_hint;
 34
 35	/*
 36	 * Is this open zone used for garbage collection?  There can only be a
 37	 * single open GC zone, which is pointed to by zi_open_gc_zone in
 38	 * struct xfs_zone_info.  Constant over the life time of an open zone.
 39	 */
 40	bool			oz_is_gc;
 41
 42	/*
 43	 * Pointer to the RT groups structure for this open zone.  Constant over
 44	 * the life time of an open zone.
 45	 */
 46	struct xfs_rtgroup	*oz_rtg;
 47
 48	struct rcu_head		oz_rcu;
 49};
 50
 51/*
 52 * Number of bitmap buckets to track reclaimable zones.  There are 10 buckets
 53 * so that each 10% of the usable capacity get their own bucket and GC can
 54 * only has to walk the bitmaps of the lesser used zones if there are any.
 55 */
 56#define XFS_ZONE_USED_BUCKETS		10u
 57
 58struct xfs_zone_info {
 59	/*
 60	 * List of pending space reservations:
 61	 */
 62	spinlock_t		zi_reservation_lock;
 63	struct list_head	zi_reclaim_reservations;
 64
 65	/*
 66	 * List and number of open zones:
 67	 */
 68	spinlock_t		zi_open_zones_lock;
 69	struct list_head	zi_open_zones;
 70	unsigned int		zi_nr_open_zones;
 71
 72	/*
 73	 * Free zone search cursor and number of free zones:
 74	 */
 75	unsigned long		zi_free_zone_cursor;
 76	atomic_t		zi_nr_free_zones;
 77
 78	/*
 79	 * Wait queue to wait for free zones or open zone resources to become
 80	 * available:
 81	 */
 82	wait_queue_head_t	zi_zone_wait;
 83
 84	/*
 85	 * Pointer to the GC thread, and the current open zone used by GC
 86	 * (if any).
 87	 *
 88	 * zi_open_gc_zone is mostly private to the GC thread, but can be read
 89	 * for debugging from other threads, in which case zi_open_zones_lock
 90	 * must be taken to access it.
 91	 */
 92	struct task_struct      *zi_gc_thread;
 93	struct xfs_open_zone	*zi_open_gc_zone;
 94
 95	/*
 96	 * List of zones that need a reset:
 97	 */
 98	spinlock_t		zi_reset_list_lock;
 99	struct xfs_group	*zi_reset_list;
100
101	/*
102	 * A set of bitmaps to bucket-sort reclaimable zones by used blocks to help
103	 * garbage collection to quickly find the best candidate for reclaim.
104	 */
105	spinlock_t		zi_used_buckets_lock;
106	unsigned int		zi_used_bucket_entries[XFS_ZONE_USED_BUCKETS];
107	unsigned long		*zi_used_bucket_bitmap[XFS_ZONE_USED_BUCKETS];
108
109};
110
111struct xfs_open_zone *xfs_open_zone(struct xfs_mount *mp,
112		enum rw_hint write_hint, bool is_gc);
113
114int xfs_zone_gc_reset_sync(struct xfs_rtgroup *rtg);
115bool xfs_zoned_need_gc(struct xfs_mount *mp);
116bool xfs_zoned_have_reclaimable(struct xfs_zone_info *zi);
117int xfs_zone_gc_mount(struct xfs_mount *mp);
118void xfs_zone_gc_unmount(struct xfs_mount *mp);
119
120void xfs_zoned_resv_wake_all(struct xfs_mount *mp);
121
122#endif /* _XFS_ZONE_PRIV_H */
~/ Read-only file preview.