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) ||
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to