svn commit: r341602 - head/sys/kern

Alan Cox alc at FreeBSD.org
Wed Dec 5 18:26:41 UTC 2018


Author: alc
Date: Wed Dec  5 18:26:40 2018
New Revision: 341602
URL: https://svnweb.freebsd.org/changeset/base/341602

Log:
  Terminate a blist_alloc search when a blst_meta_alloc call fails with
  cursor == 0.
  
  Every call to blst_meta_alloc but the one at the root is made only when the
  meta-node is known to include a free block, so that either the allocation
  will succeed, the node hint will be updated, or the last block of the meta-
  node range is, and remains, free.  But the call at the root is made without
  checking that there is a free block, so in the case that every block is
  allocated, there is no hint update to prevent the current code from looping
  forever.
  
  Submitted by:	Doug Moore <dougm at rice.edu>
  Reported by:	pho
  Reviewed by:	pho
  Tested by:	pho
  X-MFC with:	r340402
  Differential Revision:	https://reviews.freebsd.org/D17999

Modified:
  head/sys/kern/subr_blist.c

Modified: head/sys/kern/subr_blist.c
==============================================================================
--- head/sys/kern/subr_blist.c	Wed Dec  5 18:19:29 2018	(r341601)
+++ head/sys/kern/subr_blist.c	Wed Dec  5 18:26:40 2018	(r341602)
@@ -295,9 +295,9 @@ blist_alloc(blist_t bl, daddr_t count)
 	 * This loop iterates at most twice.  An allocation failure in the
 	 * first iteration leads to a second iteration only if the cursor was
 	 * non-zero.  When the cursor is zero, an allocation failure will
-	 * reduce the hint, stopping further iterations.
+	 * stop further iterations.
 	 */
-	while (count <= bl->bl_root->bm_bighint) {
+	for (;;) {
 		blk = blst_meta_alloc(bl->bl_root, bl->bl_cursor, count,
 		    bl->bl_radix);
 		if (blk != SWAPBLK_NONE) {
@@ -306,10 +306,10 @@ blist_alloc(blist_t bl, daddr_t count)
 			if (bl->bl_cursor == bl->bl_blocks)
 				bl->bl_cursor = 0;
 			return (blk);
-		}
+		} else if (bl->bl_cursor == 0)
+			return (SWAPBLK_NONE);
 		bl->bl_cursor = 0;
 	}
-	return (SWAPBLK_NONE);
 }
 
 /*


More information about the svn-src-head mailing list