svn commit: r192847 - user/kmacy/releng_7_2_fcs/sys/vm

Kip Macy kmacy at FreeBSD.org
Tue May 26 19:39:12 UTC 2009


Author: kmacy
Date: Tue May 26 19:39:09 2009
New Revision: 192847
URL: http://svn.freebsd.org/changeset/base/192847

Log:
  add vm_page_cache_locked interface to avoid recursive acquisition of the page queue mutex

Modified:
  user/kmacy/releng_7_2_fcs/sys/vm/vm_page.c
  user/kmacy/releng_7_2_fcs/sys/vm/vm_page.h
  user/kmacy/releng_7_2_fcs/sys/vm/vm_pageout.c

Modified: user/kmacy/releng_7_2_fcs/sys/vm/vm_page.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/vm/vm_page.c	Tue May 26 19:06:56 2009	(r192846)
+++ user/kmacy/releng_7_2_fcs/sys/vm/vm_page.c	Tue May 26 19:39:09 2009	(r192847)
@@ -1660,8 +1660,8 @@ vm_page_try_to_free(vm_page_t m)
  *
  * This routine may not block.
  */
-void
-vm_page_cache(vm_page_t m)
+static void
+_vm_page_cache(vm_page_t m, int locked)
 {
 	vm_object_t object;
 	vm_page_t root;
@@ -1694,8 +1694,10 @@ vm_page_cache(vm_page_t m)
 	/*
 	 * Remove the page from the paging queues.
 	 */
-	vm_pageq_remove(m);
-
+	if (locked)
+		vm_pageq_remove_locked(m);
+	else
+		vm_pageq_remove(m);
 	/*
 	 * Remove the page from the object's collection of resident
 	 * pages. 
@@ -1764,6 +1766,20 @@ vm_page_cache(vm_page_t m)
 	}
 }
 
+void
+vm_page_cache(vm_page_t m)
+{
+
+	_vm_page_cache(m, 0);
+}
+
+void
+vm_page_cache_locked(vm_page_t m)
+{
+
+	_vm_page_cache(m, 1);
+}
+
 /*
  * vm_page_dontneed
  *

Modified: user/kmacy/releng_7_2_fcs/sys/vm/vm_page.h
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/vm/vm_page.h	Tue May 26 19:06:56 2009	(r192846)
+++ user/kmacy/releng_7_2_fcs/sys/vm/vm_page.h	Tue May 26 19:39:09 2009	(r192847)
@@ -325,6 +325,7 @@ void vm_page_activate_locked (vm_page_t)
 vm_page_t vm_page_alloc (vm_object_t, vm_pindex_t, int);
 vm_page_t vm_page_grab (vm_object_t, vm_pindex_t, int);
 void vm_page_cache (register vm_page_t);
+void vm_page_cache_locked (register vm_page_t);
 void vm_page_cache_free(vm_object_t, vm_pindex_t, vm_pindex_t);
 void vm_page_cache_remove(vm_page_t);
 void vm_page_cache_transfer(vm_object_t, vm_pindex_t, vm_object_t);

Modified: user/kmacy/releng_7_2_fcs/sys/vm/vm_pageout.c
==============================================================================
--- user/kmacy/releng_7_2_fcs/sys/vm/vm_pageout.c	Tue May 26 19:06:56 2009	(r192846)
+++ user/kmacy/releng_7_2_fcs/sys/vm/vm_pageout.c	Tue May 26 19:39:09 2009	(r192847)
@@ -878,7 +878,7 @@ rescan0:
 			 * Clean pages can be placed onto the cache queue.
 			 * This effectively frees them.
 			 */
-			vm_page_cache(m);
+			vm_page_cache_locked(m);
 			--page_shortage;
 		} else if ((m->flags & PG_WINATCFLS) == 0 && pass == 0) {
 			/*
@@ -1157,7 +1157,7 @@ unlock_and_continue:
 				if (object->ref_count == 0) {
 					pmap_remove_all(m);
 					if (m->dirty == 0)
-						vm_page_cache(m);
+						vm_page_cache_locked(m);
 					else
 						vm_page_deactivate_locked(m);
 				} else {


More information about the svn-src-user mailing list