xref: /openbmc/linux/fs/xfs/xfs_extent_busy.c (revision d2f4a190)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
4  * Copyright (c) 2010 David Chinner.
5  * Copyright (c) 2011 Christoph Hellwig.
6  * All Rights Reserved.
7  */
8 #include "xfs.h"
9 #include "xfs_fs.h"
10 #include "xfs_format.h"
11 #include "xfs_log_format.h"
12 #include "xfs_shared.h"
13 #include "xfs_trans_resv.h"
14 #include "xfs_mount.h"
15 #include "xfs_alloc.h"
16 #include "xfs_extent_busy.h"
17 #include "xfs_trace.h"
18 #include "xfs_trans.h"
19 #include "xfs_log.h"
20 #include "xfs_ag.h"
21 
22 void
23 xfs_extent_busy_insert(
24 	struct xfs_trans	*tp,
25 	struct xfs_perag	*pag,
26 	xfs_agblock_t		bno,
27 	xfs_extlen_t		len,
28 	unsigned int		flags)
29 {
30 	struct xfs_extent_busy	*new;
31 	struct xfs_extent_busy	*busyp;
32 	struct rb_node		**rbp;
33 	struct rb_node		*parent = NULL;
34 
35 	new = kmem_zalloc(sizeof(struct xfs_extent_busy), 0);
36 	new->agno = pag->pag_agno;
37 	new->bno = bno;
38 	new->length = len;
39 	INIT_LIST_HEAD(&new->list);
40 	new->flags = flags;
41 
42 	/* trace before insert to be able to see failed inserts */
43 	trace_xfs_extent_busy(tp->t_mountp, pag->pag_agno, bno, len);
44 
45 	spin_lock(&pag->pagb_lock);
46 	rbp = &pag->pagb_tree.rb_node;
47 	while (*rbp) {
48 		parent = *rbp;
49 		busyp = rb_entry(parent, struct xfs_extent_busy, rb_node);
50 
51 		if (new->bno < busyp->bno) {
52 			rbp = &(*rbp)->rb_left;
53 			ASSERT(new->bno + new->length <= busyp->bno);
54 		} else if (new->bno > busyp->bno) {
55 			rbp = &(*rbp)->rb_right;
56 			ASSERT(bno >= busyp->bno + busyp->length);
57 		} else {
58 			ASSERT(0);
59 		}
60 	}
61 
62 	rb_link_node(&new->rb_node, parent, rbp);
63 	rb_insert_color(&new->rb_node, &pag->pagb_tree);
64 
65 	list_add(&new->list, &tp->t_busy);
66 	spin_unlock(&pag->pagb_lock);
67 }
68 
69 /*
70  * Search for a busy extent within the range of the extent we are about to
71  * allocate.  You need to be holding the busy extent tree lock when calling
72  * xfs_extent_busy_search(). This function returns 0 for no overlapping busy
73  * extent, -1 for an overlapping but not exact busy extent, and 1 for an exact
74  * match. This is done so that a non-zero return indicates an overlap that
75  * will require a synchronous transaction, but it can still be
76  * used to distinguish between a partial or exact match.
77  */
78 int
79 xfs_extent_busy_search(
80 	struct xfs_mount	*mp,
81 	struct xfs_perag	*pag,
82 	xfs_agblock_t		bno,
83 	xfs_extlen_t		len)
84 {
85 	struct rb_node		*rbp;
86 	struct xfs_extent_busy	*busyp;
87 	int			match = 0;
88 
89 	/* find closest start bno overlap */
90 	spin_lock(&pag->pagb_lock);
91 	rbp = pag->pagb_tree.rb_node;
92 	while (rbp) {
93 		busyp = rb_entry(rbp, struct xfs_extent_busy, rb_node);
94 		if (bno < busyp->bno) {
95 			/* may overlap, but exact start block is lower */
96 			if (bno + len > busyp->bno)
97 				match = -1;
98 			rbp = rbp->rb_left;
99 		} else if (bno > busyp->bno) {
100 			/* may overlap, but exact start block is higher */
101 			if (bno < busyp->bno + busyp->length)
102 				match = -1;
103 			rbp = rbp->rb_right;
104 		} else {
105 			/* bno matches busyp, length determines exact match */
106 			match = (busyp->length == len) ? 1 : -1;
107 			break;
108 		}
109 	}
110 	spin_unlock(&pag->pagb_lock);
111 	return match;
112 }
113 
114 /*
115  * The found free extent [fbno, fend] overlaps part or all of the given busy
116  * extent.  If the overlap covers the beginning, the end, or all of the busy
117  * extent, the overlapping portion can be made unbusy and used for the
118  * allocation.  We can't split a busy extent because we can't modify a
119  * transaction/CIL context busy list, but we can update an entry's block
120  * number or length.
121  *
122  * Returns true if the extent can safely be reused, or false if the search
123  * needs to be restarted.
124  */
125 STATIC bool
126 xfs_extent_busy_update_extent(
127 	struct xfs_mount	*mp,
128 	struct xfs_perag	*pag,
129 	struct xfs_extent_busy	*busyp,
130 	xfs_agblock_t		fbno,
131 	xfs_extlen_t		flen,
132 	bool			userdata) __releases(&pag->pagb_lock)
133 					  __acquires(&pag->pagb_lock)
134 {
135 	xfs_agblock_t		fend = fbno + flen;
136 	xfs_agblock_t		bbno = busyp->bno;
137 	xfs_agblock_t		bend = bbno + busyp->length;
138 
139 	/*
140 	 * This extent is currently being discarded.  Give the thread
141 	 * performing the discard a chance to mark the extent unbusy
142 	 * and retry.
143 	 */
144 	if (busyp->flags & XFS_EXTENT_BUSY_DISCARDED) {
145 		spin_unlock(&pag->pagb_lock);
146 		delay(1);
147 		spin_lock(&pag->pagb_lock);
148 		return false;
149 	}
150 
151 	/*
152 	 * If there is a busy extent overlapping a user allocation, we have
153 	 * no choice but to force the log and retry the search.
154 	 *
155 	 * Fortunately this does not happen during normal operation, but
156 	 * only if the filesystem is very low on space and has to dip into
157 	 * the AGFL for normal allocations.
158 	 */
159 	if (userdata)
160 		goto out_force_log;
161 
162 	if (bbno < fbno && bend > fend) {
163 		/*
164 		 * Case 1:
165 		 *    bbno           bend
166 		 *    +BBBBBBBBBBBBBBBBB+
167 		 *        +---------+
168 		 *        fbno   fend
169 		 */
170 
171 		/*
172 		 * We would have to split the busy extent to be able to track
173 		 * it correct, which we cannot do because we would have to
174 		 * modify the list of busy extents attached to the transaction
175 		 * or CIL context, which is immutable.
176 		 *
177 		 * Force out the log to clear the busy extent and retry the
178 		 * search.
179 		 */
180 		goto out_force_log;
181 	} else if (bbno >= fbno && bend <= fend) {
182 		/*
183 		 * Case 2:
184 		 *    bbno           bend
185 		 *    +BBBBBBBBBBBBBBBBB+
186 		 *    +-----------------+
187 		 *    fbno           fend
188 		 *
189 		 * Case 3:
190 		 *    bbno           bend
191 		 *    +BBBBBBBBBBBBBBBBB+
192 		 *    +--------------------------+
193 		 *    fbno                    fend
194 		 *
195 		 * Case 4:
196 		 *             bbno           bend
197 		 *             +BBBBBBBBBBBBBBBBB+
198 		 *    +--------------------------+
199 		 *    fbno                    fend
200 		 *
201 		 * Case 5:
202 		 *             bbno           bend
203 		 *             +BBBBBBBBBBBBBBBBB+
204 		 *    +-----------------------------------+
205 		 *    fbno                             fend
206 		 *
207 		 */
208 
209 		/*
210 		 * The busy extent is fully covered by the extent we are
211 		 * allocating, and can simply be removed from the rbtree.
212 		 * However we cannot remove it from the immutable list
213 		 * tracking busy extents in the transaction or CIL context,
214 		 * so set the length to zero to mark it invalid.
215 		 *
216 		 * We also need to restart the busy extent search from the
217 		 * tree root, because erasing the node can rearrange the
218 		 * tree topology.
219 		 */
220 		rb_erase(&busyp->rb_node, &pag->pagb_tree);
221 		busyp->length = 0;
222 		return false;
223 	} else if (fend < bend) {
224 		/*
225 		 * Case 6:
226 		 *              bbno           bend
227 		 *             +BBBBBBBBBBBBBBBBB+
228 		 *             +---------+
229 		 *             fbno   fend
230 		 *
231 		 * Case 7:
232 		 *             bbno           bend
233 		 *             +BBBBBBBBBBBBBBBBB+
234 		 *    +------------------+
235 		 *    fbno            fend
236 		 *
237 		 */
238 		busyp->bno = fend;
239 		busyp->length = bend - fend;
240 	} else if (bbno < fbno) {
241 		/*
242 		 * Case 8:
243 		 *    bbno           bend
244 		 *    +BBBBBBBBBBBBBBBBB+
245 		 *        +-------------+
246 		 *        fbno       fend
247 		 *
248 		 * Case 9:
249 		 *    bbno           bend
250 		 *    +BBBBBBBBBBBBBBBBB+
251 		 *        +----------------------+
252 		 *        fbno                fend
253 		 */
254 		busyp->length = fbno - busyp->bno;
255 	} else {
256 		ASSERT(0);
257 	}
258 
259 	trace_xfs_extent_busy_reuse(mp, pag->pag_agno, fbno, flen);
260 	return true;
261 
262 out_force_log:
263 	spin_unlock(&pag->pagb_lock);
264 	xfs_log_force(mp, XFS_LOG_SYNC);
265 	trace_xfs_extent_busy_force(mp, pag->pag_agno, fbno, flen);
266 	spin_lock(&pag->pagb_lock);
267 	return false;
268 }
269 
270 
271 /*
272  * For a given extent [fbno, flen], make sure we can reuse it safely.
273  */
274 void
275 xfs_extent_busy_reuse(
276 	struct xfs_mount	*mp,
277 	struct xfs_perag	*pag,
278 	xfs_agblock_t		fbno,
279 	xfs_extlen_t		flen,
280 	bool			userdata)
281 {
282 	struct rb_node		*rbp;
283 
284 	ASSERT(flen > 0);
285 	spin_lock(&pag->pagb_lock);
286 restart:
287 	rbp = pag->pagb_tree.rb_node;
288 	while (rbp) {
289 		struct xfs_extent_busy *busyp =
290 			rb_entry(rbp, struct xfs_extent_busy, rb_node);
291 		xfs_agblock_t	bbno = busyp->bno;
292 		xfs_agblock_t	bend = bbno + busyp->length;
293 
294 		if (fbno + flen <= bbno) {
295 			rbp = rbp->rb_left;
296 			continue;
297 		} else if (fbno >= bend) {
298 			rbp = rbp->rb_right;
299 			continue;
300 		}
301 
302 		if (!xfs_extent_busy_update_extent(mp, pag, busyp, fbno, flen,
303 						  userdata))
304 			goto restart;
305 	}
306 	spin_unlock(&pag->pagb_lock);
307 }
308 
309 /*
310  * For a given extent [fbno, flen], search the busy extent list to find a
311  * subset of the extent that is not busy.  If *rlen is smaller than
312  * args->minlen no suitable extent could be found, and the higher level
313  * code needs to force out the log and retry the allocation.
314  *
315  * Return the current busy generation for the AG if the extent is busy. This
316  * value can be used to wait for at least one of the currently busy extents
317  * to be cleared. Note that the busy list is not guaranteed to be empty after
318  * the gen is woken. The state of a specific extent must always be confirmed
319  * with another call to xfs_extent_busy_trim() before it can be used.
320  */
321 bool
322 xfs_extent_busy_trim(
323 	struct xfs_alloc_arg	*args,
324 	xfs_agblock_t		*bno,
325 	xfs_extlen_t		*len,
326 	unsigned		*busy_gen)
327 {
328 	xfs_agblock_t		fbno;
329 	xfs_extlen_t		flen;
330 	struct rb_node		*rbp;
331 	bool			ret = false;
332 
333 	ASSERT(*len > 0);
334 
335 	spin_lock(&args->pag->pagb_lock);
336 	fbno = *bno;
337 	flen = *len;
338 	rbp = args->pag->pagb_tree.rb_node;
339 	while (rbp && flen >= args->minlen) {
340 		struct xfs_extent_busy *busyp =
341 			rb_entry(rbp, struct xfs_extent_busy, rb_node);
342 		xfs_agblock_t	fend = fbno + flen;
343 		xfs_agblock_t	bbno = busyp->bno;
344 		xfs_agblock_t	bend = bbno + busyp->length;
345 
346 		if (fend <= bbno) {
347 			rbp = rbp->rb_left;
348 			continue;
349 		} else if (fbno >= bend) {
350 			rbp = rbp->rb_right;
351 			continue;
352 		}
353 
354 		if (bbno <= fbno) {
355 			/* start overlap */
356 
357 			/*
358 			 * Case 1:
359 			 *    bbno           bend
360 			 *    +BBBBBBBBBBBBBBBBB+
361 			 *        +---------+
362 			 *        fbno   fend
363 			 *
364 			 * Case 2:
365 			 *    bbno           bend
366 			 *    +BBBBBBBBBBBBBBBBB+
367 			 *    +-------------+
368 			 *    fbno       fend
369 			 *
370 			 * Case 3:
371 			 *    bbno           bend
372 			 *    +BBBBBBBBBBBBBBBBB+
373 			 *        +-------------+
374 			 *        fbno       fend
375 			 *
376 			 * Case 4:
377 			 *    bbno           bend
378 			 *    +BBBBBBBBBBBBBBBBB+
379 			 *    +-----------------+
380 			 *    fbno           fend
381 			 *
382 			 * No unbusy region in extent, return failure.
383 			 */
384 			if (fend <= bend)
385 				goto fail;
386 
387 			/*
388 			 * Case 5:
389 			 *    bbno           bend
390 			 *    +BBBBBBBBBBBBBBBBB+
391 			 *        +----------------------+
392 			 *        fbno                fend
393 			 *
394 			 * Case 6:
395 			 *    bbno           bend
396 			 *    +BBBBBBBBBBBBBBBBB+
397 			 *    +--------------------------+
398 			 *    fbno                    fend
399 			 *
400 			 * Needs to be trimmed to:
401 			 *                       +-------+
402 			 *                       fbno fend
403 			 */
404 			fbno = bend;
405 		} else if (bend >= fend) {
406 			/* end overlap */
407 
408 			/*
409 			 * Case 7:
410 			 *             bbno           bend
411 			 *             +BBBBBBBBBBBBBBBBB+
412 			 *    +------------------+
413 			 *    fbno            fend
414 			 *
415 			 * Case 8:
416 			 *             bbno           bend
417 			 *             +BBBBBBBBBBBBBBBBB+
418 			 *    +--------------------------+
419 			 *    fbno                    fend
420 			 *
421 			 * Needs to be trimmed to:
422 			 *    +-------+
423 			 *    fbno fend
424 			 */
425 			fend = bbno;
426 		} else {
427 			/* middle overlap */
428 
429 			/*
430 			 * Case 9:
431 			 *             bbno           bend
432 			 *             +BBBBBBBBBBBBBBBBB+
433 			 *    +-----------------------------------+
434 			 *    fbno                             fend
435 			 *
436 			 * Can be trimmed to:
437 			 *    +-------+        OR         +-------+
438 			 *    fbno fend                   fbno fend
439 			 *
440 			 * Backward allocation leads to significant
441 			 * fragmentation of directories, which degrades
442 			 * directory performance, therefore we always want to
443 			 * choose the option that produces forward allocation
444 			 * patterns.
445 			 * Preferring the lower bno extent will make the next
446 			 * request use "fend" as the start of the next
447 			 * allocation;  if the segment is no longer busy at
448 			 * that point, we'll get a contiguous allocation, but
449 			 * even if it is still busy, we will get a forward
450 			 * allocation.
451 			 * We try to avoid choosing the segment at "bend",
452 			 * because that can lead to the next allocation
453 			 * taking the segment at "fbno", which would be a
454 			 * backward allocation.  We only use the segment at
455 			 * "fbno" if it is much larger than the current
456 			 * requested size, because in that case there's a
457 			 * good chance subsequent allocations will be
458 			 * contiguous.
459 			 */
460 			if (bbno - fbno >= args->maxlen) {
461 				/* left candidate fits perfect */
462 				fend = bbno;
463 			} else if (fend - bend >= args->maxlen * 4) {
464 				/* right candidate has enough free space */
465 				fbno = bend;
466 			} else if (bbno - fbno >= args->minlen) {
467 				/* left candidate fits minimum requirement */
468 				fend = bbno;
469 			} else {
470 				goto fail;
471 			}
472 		}
473 
474 		flen = fend - fbno;
475 	}
476 out:
477 
478 	if (fbno != *bno || flen != *len) {
479 		trace_xfs_extent_busy_trim(args->mp, args->agno, *bno, *len,
480 					  fbno, flen);
481 		*bno = fbno;
482 		*len = flen;
483 		*busy_gen = args->pag->pagb_gen;
484 		ret = true;
485 	}
486 	spin_unlock(&args->pag->pagb_lock);
487 	return ret;
488 fail:
489 	/*
490 	 * Return a zero extent length as failure indications.  All callers
491 	 * re-check if the trimmed extent satisfies the minlen requirement.
492 	 */
493 	flen = 0;
494 	goto out;
495 }
496 
497 STATIC void
498 xfs_extent_busy_clear_one(
499 	struct xfs_mount	*mp,
500 	struct xfs_perag	*pag,
501 	struct xfs_extent_busy	*busyp)
502 {
503 	if (busyp->length) {
504 		trace_xfs_extent_busy_clear(mp, busyp->agno, busyp->bno,
505 						busyp->length);
506 		rb_erase(&busyp->rb_node, &pag->pagb_tree);
507 	}
508 
509 	list_del_init(&busyp->list);
510 	kmem_free(busyp);
511 }
512 
513 static void
514 xfs_extent_busy_put_pag(
515 	struct xfs_perag	*pag,
516 	bool			wakeup)
517 		__releases(pag->pagb_lock)
518 {
519 	if (wakeup) {
520 		pag->pagb_gen++;
521 		wake_up_all(&pag->pagb_wait);
522 	}
523 
524 	spin_unlock(&pag->pagb_lock);
525 	xfs_perag_put(pag);
526 }
527 
528 /*
529  * Remove all extents on the passed in list from the busy extents tree.
530  * If do_discard is set skip extents that need to be discarded, and mark
531  * these as undergoing a discard operation instead.
532  */
533 void
534 xfs_extent_busy_clear(
535 	struct xfs_mount	*mp,
536 	struct list_head	*list,
537 	bool			do_discard)
538 {
539 	struct xfs_extent_busy	*busyp, *n;
540 	struct xfs_perag	*pag = NULL;
541 	xfs_agnumber_t		agno = NULLAGNUMBER;
542 	bool			wakeup = false;
543 
544 	list_for_each_entry_safe(busyp, n, list, list) {
545 		if (busyp->agno != agno) {
546 			if (pag)
547 				xfs_extent_busy_put_pag(pag, wakeup);
548 			agno = busyp->agno;
549 			pag = xfs_perag_get(mp, agno);
550 			spin_lock(&pag->pagb_lock);
551 			wakeup = false;
552 		}
553 
554 		if (do_discard && busyp->length &&
555 		    !(busyp->flags & XFS_EXTENT_BUSY_SKIP_DISCARD)) {
556 			busyp->flags = XFS_EXTENT_BUSY_DISCARDED;
557 		} else {
558 			xfs_extent_busy_clear_one(mp, pag, busyp);
559 			wakeup = true;
560 		}
561 	}
562 
563 	if (pag)
564 		xfs_extent_busy_put_pag(pag, wakeup);
565 }
566 
567 /*
568  * Flush out all busy extents for this AG.
569  */
570 void
571 xfs_extent_busy_flush(
572 	struct xfs_mount	*mp,
573 	struct xfs_perag	*pag,
574 	unsigned		busy_gen)
575 {
576 	DEFINE_WAIT		(wait);
577 	int			error;
578 
579 	error = xfs_log_force(mp, XFS_LOG_SYNC);
580 	if (error)
581 		return;
582 
583 	do {
584 		prepare_to_wait(&pag->pagb_wait, &wait, TASK_KILLABLE);
585 		if  (busy_gen != READ_ONCE(pag->pagb_gen))
586 			break;
587 		schedule();
588 	} while (1);
589 
590 	finish_wait(&pag->pagb_wait, &wait);
591 }
592 
593 void
594 xfs_extent_busy_wait_all(
595 	struct xfs_mount	*mp)
596 {
597 	struct xfs_perag	*pag;
598 	DEFINE_WAIT		(wait);
599 	xfs_agnumber_t		agno;
600 
601 	for_each_perag(mp, agno, pag) {
602 		do {
603 			prepare_to_wait(&pag->pagb_wait, &wait, TASK_KILLABLE);
604 			if  (RB_EMPTY_ROOT(&pag->pagb_tree))
605 				break;
606 			schedule();
607 		} while (1);
608 		finish_wait(&pag->pagb_wait, &wait);
609 	}
610 }
611 
612 /*
613  * Callback for list_sort to sort busy extents by the AG they reside in.
614  */
615 int
616 xfs_extent_busy_ag_cmp(
617 	void			*priv,
618 	const struct list_head	*l1,
619 	const struct list_head	*l2)
620 {
621 	struct xfs_extent_busy	*b1 =
622 		container_of(l1, struct xfs_extent_busy, list);
623 	struct xfs_extent_busy	*b2 =
624 		container_of(l2, struct xfs_extent_busy, list);
625 	s32 diff;
626 
627 	diff = b1->agno - b2->agno;
628 	if (!diff)
629 		diff = b1->bno - b2->bno;
630 	return diff;
631 }
632