svn commit: r309203 - head/sys/vm

Alan Cox alc at FreeBSD.org
Sun Nov 27 01:42:55 UTC 2016


Author: alc
Date: Sun Nov 27 01:42:53 2016
New Revision: 309203
URL: https://svnweb.freebsd.org/changeset/base/309203

Log:
  Recursion on the free page queue mutex occurred when UMA needed to allocate
  a new page of radix trie nodes to complete a vm_radix_insert() operation
  that was requested by vm_page_cache().  Specifically, vm_page_cache()
  already held the free page queue lock when UMA tried to acquire it through
  a call to vm_page_alloc().  This code path no longer exists, so there is no
  longer any reason to allow recursion on the free page queue mutex.
  
  Improve nearby comments.
  
  Reviewed by:	kib, markj
  Tested by:	pho
  Sponsored by:	Dell EMC Isilon
  Differential Revision:	https://reviews.freebsd.org/D8628

Modified:
  head/sys/vm/vm_page.c

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c	Sat Nov 26 23:22:32 2016	(r309202)
+++ head/sys/vm/vm_page.c	Sun Nov 27 01:42:53 2016	(r309203)
@@ -1512,19 +1512,17 @@ vm_page_alloc(vm_object_t object, vm_pin
 	}
 
 	/*
-	 * The page allocation request can came from consumers which already
-	 * hold the free page queue mutex, like vm_page_insert() in
-	 * vm_page_cache().
+	 * Allocate a page if the number of free pages exceeds the minimum
+	 * for the request class.
 	 */
-	mtx_lock_flags(&vm_page_queue_free_mtx, MTX_RECURSE);
+	mtx_lock(&vm_page_queue_free_mtx);
 	if (vm_cnt.v_free_count > vm_cnt.v_free_reserved ||
 	    (req_class == VM_ALLOC_SYSTEM &&
 	    vm_cnt.v_free_count > vm_cnt.v_interrupt_free_min) ||
 	    (req_class == VM_ALLOC_INTERRUPT &&
 	    vm_cnt.v_free_count > 0)) {
 		/*
-		 * Allocate from the free queue if the number of free pages
-		 * exceeds the minimum for the request class.
+		 * Can we allocate the page from a reservation?
 		 */
 #if VM_NRESERVLEVEL > 0
 		if (object == NULL || (object->flags & (OBJ_COLORED |
@@ -1532,6 +1530,9 @@ vm_page_alloc(vm_object_t object, vm_pin
 		    vm_reserv_alloc_page(object, pindex, mpred)) == NULL)
 #endif
 		{
+			/*
+			 * If not, allocate it from the free page queues.
+			 */
 			m = vm_phys_alloc_pages(object != NULL ?
 			    VM_FREEPOOL_DEFAULT : VM_FREEPOOL_DIRECT, 0);
 #if VM_NRESERVLEVEL > 0
@@ -1841,7 +1842,7 @@ vm_page_alloc_freelist(int flind, int re
 	/*
 	 * Do not allocate reserved pages unless the req has asked for it.
 	 */
-	mtx_lock_flags(&vm_page_queue_free_mtx, MTX_RECURSE);
+	mtx_lock(&vm_page_queue_free_mtx);
 	if (vm_cnt.v_free_count > vm_cnt.v_free_reserved ||
 	    (req_class == VM_ALLOC_SYSTEM &&
 	    vm_cnt.v_free_count > vm_cnt.v_interrupt_free_min) ||


More information about the svn-src-all mailing list