xref: /openbmc/linux/fs/xfs/xfs_extent_busy.c (revision 70f8c6f8f8800d970b10676cceae42bba51a4899)
10b61f8a4SDave Chinner // SPDX-License-Identifier: GPL-2.0
2efc27b52SDave Chinner /*
3efc27b52SDave Chinner  * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
4efc27b52SDave Chinner  * Copyright (c) 2010 David Chinner.
5efc27b52SDave Chinner  * Copyright (c) 2011 Christoph Hellwig.
6efc27b52SDave Chinner  * All Rights Reserved.
7efc27b52SDave Chinner  */
8efc27b52SDave Chinner #include "xfs.h"
9efc27b52SDave Chinner #include "xfs_fs.h"
1070a9883cSDave Chinner #include "xfs_format.h"
11239880efSDave Chinner #include "xfs_log_format.h"
1270a9883cSDave Chinner #include "xfs_shared.h"
13239880efSDave Chinner #include "xfs_trans_resv.h"
14efc27b52SDave Chinner #include "xfs_mount.h"
15efc27b52SDave Chinner #include "xfs_alloc.h"
16efc27b52SDave Chinner #include "xfs_extent_busy.h"
17efc27b52SDave Chinner #include "xfs_trace.h"
18239880efSDave Chinner #include "xfs_trans.h"
19239880efSDave Chinner #include "xfs_log.h"
209bbafc71SDave Chinner #include "xfs_ag.h"
21efc27b52SDave Chinner 
2289cfa899SDave Chinner static void
xfs_extent_busy_insert_list(struct xfs_perag * pag,xfs_agblock_t bno,xfs_extlen_t len,unsigned int flags,struct list_head * busy_list)2389cfa899SDave Chinner xfs_extent_busy_insert_list(
2445d06621SDave Chinner 	struct xfs_perag	*pag,
25efc27b52SDave Chinner 	xfs_agblock_t		bno,
26efc27b52SDave Chinner 	xfs_extlen_t		len,
2789cfa899SDave Chinner 	unsigned int		flags,
2889cfa899SDave Chinner 	struct list_head	*busy_list)
29efc27b52SDave Chinner {
304ecbfe63SDave Chinner 	struct xfs_extent_busy	*new;
314ecbfe63SDave Chinner 	struct xfs_extent_busy	*busyp;
32efc27b52SDave Chinner 	struct rb_node		**rbp;
33efc27b52SDave Chinner 	struct rb_node		*parent = NULL;
34efc27b52SDave Chinner 
35707e0ddaSTetsuo Handa 	new = kmem_zalloc(sizeof(struct xfs_extent_busy), 0);
3645d06621SDave Chinner 	new->agno = pag->pag_agno;
37efc27b52SDave Chinner 	new->bno = bno;
38efc27b52SDave Chinner 	new->length = len;
39efc27b52SDave Chinner 	INIT_LIST_HEAD(&new->list);
40efc27b52SDave Chinner 	new->flags = flags;
41efc27b52SDave Chinner 
42efc27b52SDave Chinner 	/* trace before insert to be able to see failed inserts */
4389cfa899SDave Chinner 	trace_xfs_extent_busy(pag->pag_mount, pag->pag_agno, bno, len);
44efc27b52SDave Chinner 
45efc27b52SDave Chinner 	spin_lock(&pag->pagb_lock);
46efc27b52SDave Chinner 	rbp = &pag->pagb_tree.rb_node;
47efc27b52SDave Chinner 	while (*rbp) {
48efc27b52SDave Chinner 		parent = *rbp;
494ecbfe63SDave Chinner 		busyp = rb_entry(parent, struct xfs_extent_busy, rb_node);
50efc27b52SDave Chinner 
51efc27b52SDave Chinner 		if (new->bno < busyp->bno) {
52efc27b52SDave Chinner 			rbp = &(*rbp)->rb_left;
53efc27b52SDave Chinner 			ASSERT(new->bno + new->length <= busyp->bno);
54efc27b52SDave Chinner 		} else if (new->bno > busyp->bno) {
55efc27b52SDave Chinner 			rbp = &(*rbp)->rb_right;
56efc27b52SDave Chinner 			ASSERT(bno >= busyp->bno + busyp->length);
57efc27b52SDave Chinner 		} else {
58efc27b52SDave Chinner 			ASSERT(0);
59efc27b52SDave Chinner 		}
60efc27b52SDave Chinner 	}
61efc27b52SDave Chinner 
62efc27b52SDave Chinner 	rb_link_node(&new->rb_node, parent, rbp);
63efc27b52SDave Chinner 	rb_insert_color(&new->rb_node, &pag->pagb_tree);
64efc27b52SDave Chinner 
65*442177beSDarrick J. Wong 	/* always process discard lists in fifo order */
66*442177beSDarrick J. Wong 	list_add_tail(&new->list, busy_list);
67efc27b52SDave Chinner 	spin_unlock(&pag->pagb_lock);
68efc27b52SDave Chinner }
69efc27b52SDave Chinner 
7089cfa899SDave Chinner void
xfs_extent_busy_insert(struct xfs_trans * tp,struct xfs_perag * pag,xfs_agblock_t bno,xfs_extlen_t len,unsigned int flags)7189cfa899SDave Chinner xfs_extent_busy_insert(
7289cfa899SDave Chinner 	struct xfs_trans	*tp,
7389cfa899SDave Chinner 	struct xfs_perag	*pag,
7489cfa899SDave Chinner 	xfs_agblock_t		bno,
7589cfa899SDave Chinner 	xfs_extlen_t		len,
7689cfa899SDave Chinner 	unsigned int		flags)
7789cfa899SDave Chinner {
7889cfa899SDave Chinner 	xfs_extent_busy_insert_list(pag, bno, len, flags, &tp->t_busy);
7989cfa899SDave Chinner }
8089cfa899SDave Chinner 
8189cfa899SDave Chinner void
xfs_extent_busy_insert_discard(struct xfs_perag * pag,xfs_agblock_t bno,xfs_extlen_t len,struct list_head * busy_list)8289cfa899SDave Chinner xfs_extent_busy_insert_discard(
8389cfa899SDave Chinner 	struct xfs_perag	*pag,
8489cfa899SDave Chinner 	xfs_agblock_t		bno,
8589cfa899SDave Chinner 	xfs_extlen_t		len,
8689cfa899SDave Chinner 	struct list_head	*busy_list)
8789cfa899SDave Chinner {
8889cfa899SDave Chinner 	xfs_extent_busy_insert_list(pag, bno, len, XFS_EXTENT_BUSY_DISCARDED,
8989cfa899SDave Chinner 			busy_list);
9089cfa899SDave Chinner }
9189cfa899SDave Chinner 
92efc27b52SDave Chinner /*
93efc27b52SDave Chinner  * Search for a busy extent within the range of the extent we are about to
94efc27b52SDave Chinner  * allocate.  You need to be holding the busy extent tree lock when calling
954ecbfe63SDave Chinner  * xfs_extent_busy_search(). This function returns 0 for no overlapping busy
96efc27b52SDave Chinner  * extent, -1 for an overlapping but not exact busy extent, and 1 for an exact
97efc27b52SDave Chinner  * match. This is done so that a non-zero return indicates an overlap that
98efc27b52SDave Chinner  * will require a synchronous transaction, but it can still be
99efc27b52SDave Chinner  * used to distinguish between a partial or exact match.
100efc27b52SDave Chinner  */
101efc27b52SDave Chinner int
xfs_extent_busy_search(struct xfs_mount * mp,struct xfs_perag * pag,xfs_agblock_t bno,xfs_extlen_t len)1024ecbfe63SDave Chinner xfs_extent_busy_search(
103efc27b52SDave Chinner 	struct xfs_mount	*mp,
10445d06621SDave Chinner 	struct xfs_perag	*pag,
105efc27b52SDave Chinner 	xfs_agblock_t		bno,
106efc27b52SDave Chinner 	xfs_extlen_t		len)
107efc27b52SDave Chinner {
108efc27b52SDave Chinner 	struct rb_node		*rbp;
1094ecbfe63SDave Chinner 	struct xfs_extent_busy	*busyp;
110efc27b52SDave Chinner 	int			match = 0;
111efc27b52SDave Chinner 
112efc27b52SDave Chinner 	/* find closest start bno overlap */
11345d06621SDave Chinner 	spin_lock(&pag->pagb_lock);
11445d06621SDave Chinner 	rbp = pag->pagb_tree.rb_node;
115efc27b52SDave Chinner 	while (rbp) {
1164ecbfe63SDave Chinner 		busyp = rb_entry(rbp, struct xfs_extent_busy, rb_node);
117efc27b52SDave Chinner 		if (bno < busyp->bno) {
118efc27b52SDave Chinner 			/* may overlap, but exact start block is lower */
119efc27b52SDave Chinner 			if (bno + len > busyp->bno)
120efc27b52SDave Chinner 				match = -1;
121efc27b52SDave Chinner 			rbp = rbp->rb_left;
122efc27b52SDave Chinner 		} else if (bno > busyp->bno) {
123efc27b52SDave Chinner 			/* may overlap, but exact start block is higher */
124efc27b52SDave Chinner 			if (bno < busyp->bno + busyp->length)
125efc27b52SDave Chinner 				match = -1;
126efc27b52SDave Chinner 			rbp = rbp->rb_right;
127efc27b52SDave Chinner 		} else {
128efc27b52SDave Chinner 			/* bno matches busyp, length determines exact match */
129efc27b52SDave Chinner 			match = (busyp->length == len) ? 1 : -1;
130efc27b52SDave Chinner 			break;
131efc27b52SDave Chinner 		}
132efc27b52SDave Chinner 	}
133efc27b52SDave Chinner 	spin_unlock(&pag->pagb_lock);
134efc27b52SDave Chinner 	return match;
135efc27b52SDave Chinner }
136efc27b52SDave Chinner 
137efc27b52SDave Chinner /*
138efc27b52SDave Chinner  * The found free extent [fbno, fend] overlaps part or all of the given busy
139efc27b52SDave Chinner  * extent.  If the overlap covers the beginning, the end, or all of the busy
140efc27b52SDave Chinner  * extent, the overlapping portion can be made unbusy and used for the
141efc27b52SDave Chinner  * allocation.  We can't split a busy extent because we can't modify a
142b3c49634SZhi Yong Wu  * transaction/CIL context busy list, but we can update an entry's block
143efc27b52SDave Chinner  * number or length.
144efc27b52SDave Chinner  *
145efc27b52SDave Chinner  * Returns true if the extent can safely be reused, or false if the search
146efc27b52SDave Chinner  * needs to be restarted.
147efc27b52SDave Chinner  */
148efc27b52SDave Chinner STATIC bool
xfs_extent_busy_update_extent(struct xfs_mount * mp,struct xfs_perag * pag,struct xfs_extent_busy * busyp,xfs_agblock_t fbno,xfs_extlen_t flen,bool userdata)1494ecbfe63SDave Chinner xfs_extent_busy_update_extent(
150efc27b52SDave Chinner 	struct xfs_mount	*mp,
151efc27b52SDave Chinner 	struct xfs_perag	*pag,
1524ecbfe63SDave Chinner 	struct xfs_extent_busy	*busyp,
153efc27b52SDave Chinner 	xfs_agblock_t		fbno,
154efc27b52SDave Chinner 	xfs_extlen_t		flen,
155a30b0367SDave Chinner 	bool			userdata) __releases(&pag->pagb_lock)
156a30b0367SDave Chinner 					  __acquires(&pag->pagb_lock)
157efc27b52SDave Chinner {
158efc27b52SDave Chinner 	xfs_agblock_t		fend = fbno + flen;
159efc27b52SDave Chinner 	xfs_agblock_t		bbno = busyp->bno;
160efc27b52SDave Chinner 	xfs_agblock_t		bend = bbno + busyp->length;
161efc27b52SDave Chinner 
162efc27b52SDave Chinner 	/*
163efc27b52SDave Chinner 	 * This extent is currently being discarded.  Give the thread
164efc27b52SDave Chinner 	 * performing the discard a chance to mark the extent unbusy
165efc27b52SDave Chinner 	 * and retry.
166efc27b52SDave Chinner 	 */
1674ecbfe63SDave Chinner 	if (busyp->flags & XFS_EXTENT_BUSY_DISCARDED) {
168efc27b52SDave Chinner 		spin_unlock(&pag->pagb_lock);
169efc27b52SDave Chinner 		delay(1);
170efc27b52SDave Chinner 		spin_lock(&pag->pagb_lock);
171efc27b52SDave Chinner 		return false;
172efc27b52SDave Chinner 	}
173efc27b52SDave Chinner 
174efc27b52SDave Chinner 	/*
175efc27b52SDave Chinner 	 * If there is a busy extent overlapping a user allocation, we have
176efc27b52SDave Chinner 	 * no choice but to force the log and retry the search.
177efc27b52SDave Chinner 	 *
178efc27b52SDave Chinner 	 * Fortunately this does not happen during normal operation, but
179efc27b52SDave Chinner 	 * only if the filesystem is very low on space and has to dip into
180efc27b52SDave Chinner 	 * the AGFL for normal allocations.
181efc27b52SDave Chinner 	 */
182efc27b52SDave Chinner 	if (userdata)
183efc27b52SDave Chinner 		goto out_force_log;
184efc27b52SDave Chinner 
185efc27b52SDave Chinner 	if (bbno < fbno && bend > fend) {
186efc27b52SDave Chinner 		/*
187efc27b52SDave Chinner 		 * Case 1:
188efc27b52SDave Chinner 		 *    bbno           bend
189efc27b52SDave Chinner 		 *    +BBBBBBBBBBBBBBBBB+
190efc27b52SDave Chinner 		 *        +---------+
191efc27b52SDave Chinner 		 *        fbno   fend
192efc27b52SDave Chinner 		 */
193efc27b52SDave Chinner 
194efc27b52SDave Chinner 		/*
195efc27b52SDave Chinner 		 * We would have to split the busy extent to be able to track
196efc27b52SDave Chinner 		 * it correct, which we cannot do because we would have to
197efc27b52SDave Chinner 		 * modify the list of busy extents attached to the transaction
198efc27b52SDave Chinner 		 * or CIL context, which is immutable.
199efc27b52SDave Chinner 		 *
200efc27b52SDave Chinner 		 * Force out the log to clear the busy extent and retry the
201efc27b52SDave Chinner 		 * search.
202efc27b52SDave Chinner 		 */
203efc27b52SDave Chinner 		goto out_force_log;
204efc27b52SDave Chinner 	} else if (bbno >= fbno && bend <= fend) {
205efc27b52SDave Chinner 		/*
206efc27b52SDave Chinner 		 * Case 2:
207efc27b52SDave Chinner 		 *    bbno           bend
208efc27b52SDave Chinner 		 *    +BBBBBBBBBBBBBBBBB+
209efc27b52SDave Chinner 		 *    +-----------------+
210efc27b52SDave Chinner 		 *    fbno           fend
211efc27b52SDave Chinner 		 *
212efc27b52SDave Chinner 		 * Case 3:
213efc27b52SDave Chinner 		 *    bbno           bend
214efc27b52SDave Chinner 		 *    +BBBBBBBBBBBBBBBBB+
215efc27b52SDave Chinner 		 *    +--------------------------+
216efc27b52SDave Chinner 		 *    fbno                    fend
217efc27b52SDave Chinner 		 *
218efc27b52SDave Chinner 		 * Case 4:
219efc27b52SDave Chinner 		 *             bbno           bend
220efc27b52SDave Chinner 		 *             +BBBBBBBBBBBBBBBBB+
221efc27b52SDave Chinner 		 *    +--------------------------+
222efc27b52SDave Chinner 		 *    fbno                    fend
223efc27b52SDave Chinner 		 *
224efc27b52SDave Chinner 		 * Case 5:
225efc27b52SDave Chinner 		 *             bbno           bend
226efc27b52SDave Chinner 		 *             +BBBBBBBBBBBBBBBBB+
227efc27b52SDave Chinner 		 *    +-----------------------------------+
228efc27b52SDave Chinner 		 *    fbno                             fend
229efc27b52SDave Chinner 		 *
230efc27b52SDave Chinner 		 */
231efc27b52SDave Chinner 
232efc27b52SDave Chinner 		/*
233efc27b52SDave Chinner 		 * The busy extent is fully covered by the extent we are
234efc27b52SDave Chinner 		 * allocating, and can simply be removed from the rbtree.
235efc27b52SDave Chinner 		 * However we cannot remove it from the immutable list
236efc27b52SDave Chinner 		 * tracking busy extents in the transaction or CIL context,
237efc27b52SDave Chinner 		 * so set the length to zero to mark it invalid.
238efc27b52SDave Chinner 		 *
239efc27b52SDave Chinner 		 * We also need to restart the busy extent search from the
240efc27b52SDave Chinner 		 * tree root, because erasing the node can rearrange the
241efc27b52SDave Chinner 		 * tree topology.
242efc27b52SDave Chinner 		 */
243efc27b52SDave Chinner 		rb_erase(&busyp->rb_node, &pag->pagb_tree);
244efc27b52SDave Chinner 		busyp->length = 0;
245efc27b52SDave Chinner 		return false;
246efc27b52SDave Chinner 	} else if (fend < bend) {
247efc27b52SDave Chinner 		/*
248efc27b52SDave Chinner 		 * Case 6:
249efc27b52SDave Chinner 		 *              bbno           bend
250efc27b52SDave Chinner 		 *             +BBBBBBBBBBBBBBBBB+
251efc27b52SDave Chinner 		 *             +---------+
252efc27b52SDave Chinner 		 *             fbno   fend
253efc27b52SDave Chinner 		 *
254efc27b52SDave Chinner 		 * Case 7:
255efc27b52SDave Chinner 		 *             bbno           bend
256efc27b52SDave Chinner 		 *             +BBBBBBBBBBBBBBBBB+
257efc27b52SDave Chinner 		 *    +------------------+
258efc27b52SDave Chinner 		 *    fbno            fend
259efc27b52SDave Chinner 		 *
260efc27b52SDave Chinner 		 */
261efc27b52SDave Chinner 		busyp->bno = fend;
262601a27eaSWengang Wang 		busyp->length = bend - fend;
263efc27b52SDave Chinner 	} else if (bbno < fbno) {
264efc27b52SDave Chinner 		/*
265efc27b52SDave Chinner 		 * Case 8:
266efc27b52SDave Chinner 		 *    bbno           bend
267efc27b52SDave Chinner 		 *    +BBBBBBBBBBBBBBBBB+
268efc27b52SDave Chinner 		 *        +-------------+
269efc27b52SDave Chinner 		 *        fbno       fend
270efc27b52SDave Chinner 		 *
271efc27b52SDave Chinner 		 * Case 9:
272efc27b52SDave Chinner 		 *    bbno           bend
273efc27b52SDave Chinner 		 *    +BBBBBBBBBBBBBBBBB+
274efc27b52SDave Chinner 		 *        +----------------------+
275efc27b52SDave Chinner 		 *        fbno                fend
276efc27b52SDave Chinner 		 */
277efc27b52SDave Chinner 		busyp->length = fbno - busyp->bno;
278efc27b52SDave Chinner 	} else {
279efc27b52SDave Chinner 		ASSERT(0);
280efc27b52SDave Chinner 	}
281efc27b52SDave Chinner 
2824ecbfe63SDave Chinner 	trace_xfs_extent_busy_reuse(mp, pag->pag_agno, fbno, flen);
283efc27b52SDave Chinner 	return true;
284efc27b52SDave Chinner 
285efc27b52SDave Chinner out_force_log:
286efc27b52SDave Chinner 	spin_unlock(&pag->pagb_lock);
287efc27b52SDave Chinner 	xfs_log_force(mp, XFS_LOG_SYNC);
2884ecbfe63SDave Chinner 	trace_xfs_extent_busy_force(mp, pag->pag_agno, fbno, flen);
289efc27b52SDave Chinner 	spin_lock(&pag->pagb_lock);
290efc27b52SDave Chinner 	return false;
291efc27b52SDave Chinner }
292efc27b52SDave Chinner 
293efc27b52SDave Chinner 
294efc27b52SDave Chinner /*
295efc27b52SDave Chinner  * For a given extent [fbno, flen], make sure we can reuse it safely.
296efc27b52SDave Chinner  */
297efc27b52SDave Chinner void
xfs_extent_busy_reuse(struct xfs_mount * mp,struct xfs_perag * pag,xfs_agblock_t fbno,xfs_extlen_t flen,bool userdata)2984ecbfe63SDave Chinner xfs_extent_busy_reuse(
299efc27b52SDave Chinner 	struct xfs_mount	*mp,
30045d06621SDave Chinner 	struct xfs_perag	*pag,
301efc27b52SDave Chinner 	xfs_agblock_t		fbno,
302efc27b52SDave Chinner 	xfs_extlen_t		flen,
303efc27b52SDave Chinner 	bool			userdata)
304efc27b52SDave Chinner {
305efc27b52SDave Chinner 	struct rb_node		*rbp;
306efc27b52SDave Chinner 
307efc27b52SDave Chinner 	ASSERT(flen > 0);
308efc27b52SDave Chinner 	spin_lock(&pag->pagb_lock);
309efc27b52SDave Chinner restart:
310efc27b52SDave Chinner 	rbp = pag->pagb_tree.rb_node;
311efc27b52SDave Chinner 	while (rbp) {
3124ecbfe63SDave Chinner 		struct xfs_extent_busy *busyp =
3134ecbfe63SDave Chinner 			rb_entry(rbp, struct xfs_extent_busy, rb_node);
314efc27b52SDave Chinner 		xfs_agblock_t	bbno = busyp->bno;
315efc27b52SDave Chinner 		xfs_agblock_t	bend = bbno + busyp->length;
316efc27b52SDave Chinner 
317efc27b52SDave Chinner 		if (fbno + flen <= bbno) {
318efc27b52SDave Chinner 			rbp = rbp->rb_left;
319efc27b52SDave Chinner 			continue;
320efc27b52SDave Chinner 		} else if (fbno >= bend) {
321efc27b52SDave Chinner 			rbp = rbp->rb_right;
322efc27b52SDave Chinner 			continue;
323efc27b52SDave Chinner 		}
324efc27b52SDave Chinner 
3254ecbfe63SDave Chinner 		if (!xfs_extent_busy_update_extent(mp, pag, busyp, fbno, flen,
326efc27b52SDave Chinner 						  userdata))
327efc27b52SDave Chinner 			goto restart;
328efc27b52SDave Chinner 	}
329efc27b52SDave Chinner 	spin_unlock(&pag->pagb_lock);
330efc27b52SDave Chinner }
331efc27b52SDave Chinner 
332efc27b52SDave Chinner /*
333efc27b52SDave Chinner  * For a given extent [fbno, flen], search the busy extent list to find a
334efc27b52SDave Chinner  * subset of the extent that is not busy.  If *rlen is smaller than
335efc27b52SDave Chinner  * args->minlen no suitable extent could be found, and the higher level
336efc27b52SDave Chinner  * code needs to force out the log and retry the allocation.
337ebf55872SChristoph Hellwig  *
338ebf55872SChristoph Hellwig  * Return the current busy generation for the AG if the extent is busy. This
339ebf55872SChristoph Hellwig  * value can be used to wait for at least one of the currently busy extents
340ebf55872SChristoph Hellwig  * to be cleared. Note that the busy list is not guaranteed to be empty after
341ebf55872SChristoph Hellwig  * the gen is woken. The state of a specific extent must always be confirmed
342ebf55872SChristoph Hellwig  * with another call to xfs_extent_busy_trim() before it can be used.
343efc27b52SDave Chinner  */
344ebf55872SChristoph Hellwig bool
xfs_extent_busy_trim(struct xfs_alloc_arg * args,xfs_agblock_t * bno,xfs_extlen_t * len,unsigned * busy_gen)3454ecbfe63SDave Chinner xfs_extent_busy_trim(
346efc27b52SDave Chinner 	struct xfs_alloc_arg	*args,
347ebf55872SChristoph Hellwig 	xfs_agblock_t		*bno,
348ebf55872SChristoph Hellwig 	xfs_extlen_t		*len,
349ebf55872SChristoph Hellwig 	unsigned		*busy_gen)
350efc27b52SDave Chinner {
351efc27b52SDave Chinner 	xfs_agblock_t		fbno;
352efc27b52SDave Chinner 	xfs_extlen_t		flen;
353efc27b52SDave Chinner 	struct rb_node		*rbp;
354ebf55872SChristoph Hellwig 	bool			ret = false;
355efc27b52SDave Chinner 
356353fe445SArnd Bergmann 	ASSERT(*len > 0);
357efc27b52SDave Chinner 
358efc27b52SDave Chinner 	spin_lock(&args->pag->pagb_lock);
359ebf55872SChristoph Hellwig 	fbno = *bno;
360ebf55872SChristoph Hellwig 	flen = *len;
361efc27b52SDave Chinner 	rbp = args->pag->pagb_tree.rb_node;
362efc27b52SDave Chinner 	while (rbp && flen >= args->minlen) {
3634ecbfe63SDave Chinner 		struct xfs_extent_busy *busyp =
3644ecbfe63SDave Chinner 			rb_entry(rbp, struct xfs_extent_busy, rb_node);
365efc27b52SDave Chinner 		xfs_agblock_t	fend = fbno + flen;
366efc27b52SDave Chinner 		xfs_agblock_t	bbno = busyp->bno;
367efc27b52SDave Chinner 		xfs_agblock_t	bend = bbno + busyp->length;
368efc27b52SDave Chinner 
369efc27b52SDave Chinner 		if (fend <= bbno) {
370efc27b52SDave Chinner 			rbp = rbp->rb_left;
371efc27b52SDave Chinner 			continue;
372efc27b52SDave Chinner 		} else if (fbno >= bend) {
373efc27b52SDave Chinner 			rbp = rbp->rb_right;
374efc27b52SDave Chinner 			continue;
375efc27b52SDave Chinner 		}
376efc27b52SDave Chinner 
377efc27b52SDave Chinner 		if (bbno <= fbno) {
378efc27b52SDave Chinner 			/* start overlap */
379efc27b52SDave Chinner 
380efc27b52SDave Chinner 			/*
381efc27b52SDave Chinner 			 * Case 1:
382efc27b52SDave Chinner 			 *    bbno           bend
383efc27b52SDave Chinner 			 *    +BBBBBBBBBBBBBBBBB+
384efc27b52SDave Chinner 			 *        +---------+
385efc27b52SDave Chinner 			 *        fbno   fend
386efc27b52SDave Chinner 			 *
387efc27b52SDave Chinner 			 * Case 2:
388efc27b52SDave Chinner 			 *    bbno           bend
389efc27b52SDave Chinner 			 *    +BBBBBBBBBBBBBBBBB+
390efc27b52SDave Chinner 			 *    +-------------+
391efc27b52SDave Chinner 			 *    fbno       fend
392efc27b52SDave Chinner 			 *
393efc27b52SDave Chinner 			 * Case 3:
394efc27b52SDave Chinner 			 *    bbno           bend
395efc27b52SDave Chinner 			 *    +BBBBBBBBBBBBBBBBB+
396efc27b52SDave Chinner 			 *        +-------------+
397efc27b52SDave Chinner 			 *        fbno       fend
398efc27b52SDave Chinner 			 *
399efc27b52SDave Chinner 			 * Case 4:
400efc27b52SDave Chinner 			 *    bbno           bend
401efc27b52SDave Chinner 			 *    +BBBBBBBBBBBBBBBBB+
402efc27b52SDave Chinner 			 *    +-----------------+
403efc27b52SDave Chinner 			 *    fbno           fend
404efc27b52SDave Chinner 			 *
405efc27b52SDave Chinner 			 * No unbusy region in extent, return failure.
406efc27b52SDave Chinner 			 */
407efc27b52SDave Chinner 			if (fend <= bend)
408efc27b52SDave Chinner 				goto fail;
409efc27b52SDave Chinner 
410efc27b52SDave Chinner 			/*
411efc27b52SDave Chinner 			 * Case 5:
412efc27b52SDave Chinner 			 *    bbno           bend
413efc27b52SDave Chinner 			 *    +BBBBBBBBBBBBBBBBB+
414efc27b52SDave Chinner 			 *        +----------------------+
415efc27b52SDave Chinner 			 *        fbno                fend
416efc27b52SDave Chinner 			 *
417efc27b52SDave Chinner 			 * Case 6:
418efc27b52SDave Chinner 			 *    bbno           bend
419efc27b52SDave Chinner 			 *    +BBBBBBBBBBBBBBBBB+
420efc27b52SDave Chinner 			 *    +--------------------------+
421efc27b52SDave Chinner 			 *    fbno                    fend
422efc27b52SDave Chinner 			 *
423efc27b52SDave Chinner 			 * Needs to be trimmed to:
424efc27b52SDave Chinner 			 *                       +-------+
425efc27b52SDave Chinner 			 *                       fbno fend
426efc27b52SDave Chinner 			 */
427efc27b52SDave Chinner 			fbno = bend;
428efc27b52SDave Chinner 		} else if (bend >= fend) {
429efc27b52SDave Chinner 			/* end overlap */
430efc27b52SDave Chinner 
431efc27b52SDave Chinner 			/*
432efc27b52SDave Chinner 			 * Case 7:
433efc27b52SDave Chinner 			 *             bbno           bend
434efc27b52SDave Chinner 			 *             +BBBBBBBBBBBBBBBBB+
435efc27b52SDave Chinner 			 *    +------------------+
436efc27b52SDave Chinner 			 *    fbno            fend
437efc27b52SDave Chinner 			 *
438efc27b52SDave Chinner 			 * Case 8:
439efc27b52SDave Chinner 			 *             bbno           bend
440efc27b52SDave Chinner 			 *             +BBBBBBBBBBBBBBBBB+
441efc27b52SDave Chinner 			 *    +--------------------------+
442efc27b52SDave Chinner 			 *    fbno                    fend
443efc27b52SDave Chinner 			 *
444efc27b52SDave Chinner 			 * Needs to be trimmed to:
445efc27b52SDave Chinner 			 *    +-------+
446efc27b52SDave Chinner 			 *    fbno fend
447efc27b52SDave Chinner 			 */
448efc27b52SDave Chinner 			fend = bbno;
449efc27b52SDave Chinner 		} else {
450efc27b52SDave Chinner 			/* middle overlap */
451efc27b52SDave Chinner 
452efc27b52SDave Chinner 			/*
453efc27b52SDave Chinner 			 * Case 9:
454efc27b52SDave Chinner 			 *             bbno           bend
455efc27b52SDave Chinner 			 *             +BBBBBBBBBBBBBBBBB+
456efc27b52SDave Chinner 			 *    +-----------------------------------+
457efc27b52SDave Chinner 			 *    fbno                             fend
458efc27b52SDave Chinner 			 *
459efc27b52SDave Chinner 			 * Can be trimmed to:
460efc27b52SDave Chinner 			 *    +-------+        OR         +-------+
461efc27b52SDave Chinner 			 *    fbno fend                   fbno fend
462efc27b52SDave Chinner 			 *
463efc27b52SDave Chinner 			 * Backward allocation leads to significant
464efc27b52SDave Chinner 			 * fragmentation of directories, which degrades
465efc27b52SDave Chinner 			 * directory performance, therefore we always want to
466efc27b52SDave Chinner 			 * choose the option that produces forward allocation
467efc27b52SDave Chinner 			 * patterns.
468efc27b52SDave Chinner 			 * Preferring the lower bno extent will make the next
469efc27b52SDave Chinner 			 * request use "fend" as the start of the next
470efc27b52SDave Chinner 			 * allocation;  if the segment is no longer busy at
471efc27b52SDave Chinner 			 * that point, we'll get a contiguous allocation, but
472efc27b52SDave Chinner 			 * even if it is still busy, we will get a forward
473efc27b52SDave Chinner 			 * allocation.
474efc27b52SDave Chinner 			 * We try to avoid choosing the segment at "bend",
475efc27b52SDave Chinner 			 * because that can lead to the next allocation
476efc27b52SDave Chinner 			 * taking the segment at "fbno", which would be a
477efc27b52SDave Chinner 			 * backward allocation.  We only use the segment at
478efc27b52SDave Chinner 			 * "fbno" if it is much larger than the current
479efc27b52SDave Chinner 			 * requested size, because in that case there's a
480efc27b52SDave Chinner 			 * good chance subsequent allocations will be
481efc27b52SDave Chinner 			 * contiguous.
482efc27b52SDave Chinner 			 */
483efc27b52SDave Chinner 			if (bbno - fbno >= args->maxlen) {
484efc27b52SDave Chinner 				/* left candidate fits perfect */
485efc27b52SDave Chinner 				fend = bbno;
486efc27b52SDave Chinner 			} else if (fend - bend >= args->maxlen * 4) {
487efc27b52SDave Chinner 				/* right candidate has enough free space */
488efc27b52SDave Chinner 				fbno = bend;
489efc27b52SDave Chinner 			} else if (bbno - fbno >= args->minlen) {
490efc27b52SDave Chinner 				/* left candidate fits minimum requirement */
491efc27b52SDave Chinner 				fend = bbno;
492efc27b52SDave Chinner 			} else {
493efc27b52SDave Chinner 				goto fail;
494efc27b52SDave Chinner 			}
495efc27b52SDave Chinner 		}
496efc27b52SDave Chinner 
497efc27b52SDave Chinner 		flen = fend - fbno;
498efc27b52SDave Chinner 	}
499ebf55872SChristoph Hellwig out:
500efc27b52SDave Chinner 
501ebf55872SChristoph Hellwig 	if (fbno != *bno || flen != *len) {
502ebf55872SChristoph Hellwig 		trace_xfs_extent_busy_trim(args->mp, args->agno, *bno, *len,
503efc27b52SDave Chinner 					  fbno, flen);
504ebf55872SChristoph Hellwig 		*bno = fbno;
505ebf55872SChristoph Hellwig 		*len = flen;
506ebf55872SChristoph Hellwig 		*busy_gen = args->pag->pagb_gen;
507ebf55872SChristoph Hellwig 		ret = true;
508efc27b52SDave Chinner 	}
509ebf55872SChristoph Hellwig 	spin_unlock(&args->pag->pagb_lock);
510ebf55872SChristoph Hellwig 	return ret;
511efc27b52SDave Chinner fail:
512efc27b52SDave Chinner 	/*
513efc27b52SDave Chinner 	 * Return a zero extent length as failure indications.  All callers
514efc27b52SDave Chinner 	 * re-check if the trimmed extent satisfies the minlen requirement.
515efc27b52SDave Chinner 	 */
516ebf55872SChristoph Hellwig 	flen = 0;
517ebf55872SChristoph Hellwig 	goto out;
518efc27b52SDave Chinner }
519efc27b52SDave Chinner 
5204ecbfe63SDave Chinner STATIC void
xfs_extent_busy_clear_one(struct xfs_mount * mp,struct xfs_perag * pag,struct xfs_extent_busy * busyp)5214ecbfe63SDave Chinner xfs_extent_busy_clear_one(
522efc27b52SDave Chinner 	struct xfs_mount	*mp,
523efc27b52SDave Chinner 	struct xfs_perag	*pag,
5244ecbfe63SDave Chinner 	struct xfs_extent_busy	*busyp)
525efc27b52SDave Chinner {
526efc27b52SDave Chinner 	if (busyp->length) {
5274ecbfe63SDave Chinner 		trace_xfs_extent_busy_clear(mp, busyp->agno, busyp->bno,
528efc27b52SDave Chinner 						busyp->length);
529efc27b52SDave Chinner 		rb_erase(&busyp->rb_node, &pag->pagb_tree);
530efc27b52SDave Chinner 	}
531efc27b52SDave Chinner 
532efc27b52SDave Chinner 	list_del_init(&busyp->list);
533efc27b52SDave Chinner 	kmem_free(busyp);
534efc27b52SDave Chinner }
535efc27b52SDave Chinner 
536ebf55872SChristoph Hellwig static void
xfs_extent_busy_put_pag(struct xfs_perag * pag,bool wakeup)537ebf55872SChristoph Hellwig xfs_extent_busy_put_pag(
538ebf55872SChristoph Hellwig 	struct xfs_perag	*pag,
539ebf55872SChristoph Hellwig 	bool			wakeup)
540ebf55872SChristoph Hellwig 		__releases(pag->pagb_lock)
541ebf55872SChristoph Hellwig {
542ebf55872SChristoph Hellwig 	if (wakeup) {
543ebf55872SChristoph Hellwig 		pag->pagb_gen++;
544ebf55872SChristoph Hellwig 		wake_up_all(&pag->pagb_wait);
545ebf55872SChristoph Hellwig 	}
546ebf55872SChristoph Hellwig 
547ebf55872SChristoph Hellwig 	spin_unlock(&pag->pagb_lock);
548ebf55872SChristoph Hellwig 	xfs_perag_put(pag);
549ebf55872SChristoph Hellwig }
550ebf55872SChristoph Hellwig 
551efc27b52SDave Chinner /*
552efc27b52SDave Chinner  * Remove all extents on the passed in list from the busy extents tree.
553efc27b52SDave Chinner  * If do_discard is set skip extents that need to be discarded, and mark
554efc27b52SDave Chinner  * these as undergoing a discard operation instead.
555efc27b52SDave Chinner  */
556efc27b52SDave Chinner void
xfs_extent_busy_clear(struct xfs_mount * mp,struct list_head * list,bool do_discard)5574ecbfe63SDave Chinner xfs_extent_busy_clear(
558efc27b52SDave Chinner 	struct xfs_mount	*mp,
559efc27b52SDave Chinner 	struct list_head	*list,
560efc27b52SDave Chinner 	bool			do_discard)
561efc27b52SDave Chinner {
5624ecbfe63SDave Chinner 	struct xfs_extent_busy	*busyp, *n;
563efc27b52SDave Chinner 	struct xfs_perag	*pag = NULL;
564efc27b52SDave Chinner 	xfs_agnumber_t		agno = NULLAGNUMBER;
565ebf55872SChristoph Hellwig 	bool			wakeup = false;
566efc27b52SDave Chinner 
567efc27b52SDave Chinner 	list_for_each_entry_safe(busyp, n, list, list) {
568efc27b52SDave Chinner 		if (busyp->agno != agno) {
569ebf55872SChristoph Hellwig 			if (pag)
570ebf55872SChristoph Hellwig 				xfs_extent_busy_put_pag(pag, wakeup);
571efc27b52SDave Chinner 			agno = busyp->agno;
572ebf55872SChristoph Hellwig 			pag = xfs_perag_get(mp, agno);
573ebf55872SChristoph Hellwig 			spin_lock(&pag->pagb_lock);
574ebf55872SChristoph Hellwig 			wakeup = false;
575efc27b52SDave Chinner 		}
576efc27b52SDave Chinner 
577efc27b52SDave Chinner 		if (do_discard && busyp->length &&
578ebf55872SChristoph Hellwig 		    !(busyp->flags & XFS_EXTENT_BUSY_SKIP_DISCARD)) {
5794ecbfe63SDave Chinner 			busyp->flags = XFS_EXTENT_BUSY_DISCARDED;
580ebf55872SChristoph Hellwig 		} else {
5814ecbfe63SDave Chinner 			xfs_extent_busy_clear_one(mp, pag, busyp);
582ebf55872SChristoph Hellwig 			wakeup = true;
583ebf55872SChristoph Hellwig 		}
584efc27b52SDave Chinner 	}
585efc27b52SDave Chinner 
586ebf55872SChristoph Hellwig 	if (pag)
587ebf55872SChristoph Hellwig 		xfs_extent_busy_put_pag(pag, wakeup);
588ebf55872SChristoph Hellwig }
589ebf55872SChristoph Hellwig 
590ebf55872SChristoph Hellwig /*
591ebf55872SChristoph Hellwig  * Flush out all busy extents for this AG.
5928ebbf262SDave Chinner  *
5938ebbf262SDave Chinner  * If the current transaction is holding busy extents, the caller may not want
5948ebbf262SDave Chinner  * to wait for committed busy extents to resolve. If we are being told just to
5958ebbf262SDave Chinner  * try a flush or progress has been made since we last skipped a busy extent,
5968ebbf262SDave Chinner  * return immediately to allow the caller to try again.
5978ebbf262SDave Chinner  *
5988ebbf262SDave Chinner  * If we are freeing extents, we might actually be holding the only free extents
5998ebbf262SDave Chinner  * in the transaction busy list and the log force won't resolve that situation.
6008ebbf262SDave Chinner  * In this case, we must return -EAGAIN to avoid a deadlock by informing the
6018ebbf262SDave Chinner  * caller it needs to commit the busy extents it holds before retrying the
6028ebbf262SDave Chinner  * extent free operation.
603ebf55872SChristoph Hellwig  */
6048ebbf262SDave Chinner int
xfs_extent_busy_flush(struct xfs_trans * tp,struct xfs_perag * pag,unsigned busy_gen,uint32_t alloc_flags)605ebf55872SChristoph Hellwig xfs_extent_busy_flush(
6068ebbf262SDave Chinner 	struct xfs_trans	*tp,
607ebf55872SChristoph Hellwig 	struct xfs_perag	*pag,
6086a2a9d77SDave Chinner 	unsigned		busy_gen,
6096a2a9d77SDave Chinner 	uint32_t		alloc_flags)
610ebf55872SChristoph Hellwig {
611ebf55872SChristoph Hellwig 	DEFINE_WAIT		(wait);
6122b56c285SChristoph Hellwig 	int			error;
613ebf55872SChristoph Hellwig 
6148ebbf262SDave Chinner 	error = xfs_log_force(tp->t_mountp, XFS_LOG_SYNC);
615ebf55872SChristoph Hellwig 	if (error)
6168ebbf262SDave Chinner 		return error;
617ebf55872SChristoph Hellwig 
6188ebbf262SDave Chinner 	/* Avoid deadlocks on uncommitted busy extents. */
6198ebbf262SDave Chinner 	if (!list_empty(&tp->t_busy)) {
6208ebbf262SDave Chinner 		if (alloc_flags & XFS_ALLOC_FLAG_TRYFLUSH)
6218ebbf262SDave Chinner 			return 0;
6228ebbf262SDave Chinner 
6238ebbf262SDave Chinner 		if (busy_gen != READ_ONCE(pag->pagb_gen))
6248ebbf262SDave Chinner 			return 0;
6258ebbf262SDave Chinner 
6268ebbf262SDave Chinner 		if (alloc_flags & XFS_ALLOC_FLAG_FREEING)
6278ebbf262SDave Chinner 			return -EAGAIN;
6288ebbf262SDave Chinner 	}
6298ebbf262SDave Chinner 
6308ebbf262SDave Chinner 	/* Wait for committed busy extents to resolve. */
631ebf55872SChristoph Hellwig 	do {
632ebf55872SChristoph Hellwig 		prepare_to_wait(&pag->pagb_wait, &wait, TASK_KILLABLE);
633ebf55872SChristoph Hellwig 		if  (busy_gen != READ_ONCE(pag->pagb_gen))
634ebf55872SChristoph Hellwig 			break;
635ebf55872SChristoph Hellwig 		schedule();
636ebf55872SChristoph Hellwig 	} while (1);
637ebf55872SChristoph Hellwig 
638ebf55872SChristoph Hellwig 	finish_wait(&pag->pagb_wait, &wait);
6398ebbf262SDave Chinner 	return 0;
640ebf55872SChristoph Hellwig }
641ebf55872SChristoph Hellwig 
642ebf55872SChristoph Hellwig void
xfs_extent_busy_wait_all(struct xfs_mount * mp)643ebf55872SChristoph Hellwig xfs_extent_busy_wait_all(
644ebf55872SChristoph Hellwig 	struct xfs_mount	*mp)
645ebf55872SChristoph Hellwig {
646f250eedcSDave Chinner 	struct xfs_perag	*pag;
647ebf55872SChristoph Hellwig 	DEFINE_WAIT		(wait);
648ebf55872SChristoph Hellwig 	xfs_agnumber_t		agno;
649ebf55872SChristoph Hellwig 
650f250eedcSDave Chinner 	for_each_perag(mp, agno, pag) {
651ebf55872SChristoph Hellwig 		do {
652ebf55872SChristoph Hellwig 			prepare_to_wait(&pag->pagb_wait, &wait, TASK_KILLABLE);
653ebf55872SChristoph Hellwig 			if  (RB_EMPTY_ROOT(&pag->pagb_tree))
654ebf55872SChristoph Hellwig 				break;
655ebf55872SChristoph Hellwig 			schedule();
656ebf55872SChristoph Hellwig 		} while (1);
657ebf55872SChristoph Hellwig 		finish_wait(&pag->pagb_wait, &wait);
658efc27b52SDave Chinner 	}
659efc27b52SDave Chinner }
660efc27b52SDave Chinner 
661efc27b52SDave Chinner /*
662efc27b52SDave Chinner  * Callback for list_sort to sort busy extents by the AG they reside in.
663efc27b52SDave Chinner  */
664efc27b52SDave Chinner int
xfs_extent_busy_ag_cmp(void * priv,const struct list_head * l1,const struct list_head * l2)6654ecbfe63SDave Chinner xfs_extent_busy_ag_cmp(
666efc27b52SDave Chinner 	void			*priv,
6674f0f586bSSami Tolvanen 	const struct list_head	*l1,
6684f0f586bSSami Tolvanen 	const struct list_head	*l2)
669efc27b52SDave Chinner {
67046694129SChristoph Hellwig 	struct xfs_extent_busy	*b1 =
67146694129SChristoph Hellwig 		container_of(l1, struct xfs_extent_busy, list);
67246694129SChristoph Hellwig 	struct xfs_extent_busy	*b2 =
67346694129SChristoph Hellwig 		container_of(l2, struct xfs_extent_busy, list);
67446694129SChristoph Hellwig 	s32 diff;
67546694129SChristoph Hellwig 
67646694129SChristoph Hellwig 	diff = b1->agno - b2->agno;
67746694129SChristoph Hellwig 	if (!diff)
67846694129SChristoph Hellwig 		diff = b1->bno - b2->bno;
67946694129SChristoph Hellwig 	return diff;
680efc27b52SDave Chinner }
681