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

Kip Macy kmacy at FreeBSD.org
Tue May 26 20:14:53 UTC 2009


Author: kmacy
Date: Tue May 26 20:14:52 2009
New Revision: 192851
URL: http://svn.freebsd.org/changeset/base/192851

Log:
  further addition of _locked routines to avoid recursion on 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 20:13:17 2009	(r192850)
+++ user/kmacy/releng_7_2_fcs/sys/vm/vm_page.c	Tue May 26 20:14:52 2009	(r192851)
@@ -148,7 +148,9 @@ TUNABLE_INT("vm.boot_pages", &boot_pages
 SYSCTL_INT(_vm, OID_AUTO, boot_pages, CTLFLAG_RD, &boot_pages, 0,
 	"number of pages allocated for bootstrapping the VM system");
 
-static void vm_page_enqueue(int queue, vm_page_t m);
+static void _vm_page_enqueue(int queue, vm_page_t m, int locked);
+static void _vm_page_free_toq(vm_page_t m, int locked);
+static void _vm_pageq_remove(vm_page_t m, int locked);
 
 /*
  *	vm_set_page_size:
@@ -517,6 +519,14 @@ vm_page_free(vm_page_t m)
 	vm_page_free_toq(m);
 }
 
+void
+vm_page_free_locked(vm_page_t m)
+{
+
+	m->flags &= ~PG_ZERO;
+	_vm_page_free_toq(m, 1);
+}
+
 /*
  *	vm_page_free_zero:
  *
@@ -530,6 +540,14 @@ vm_page_free_zero(vm_page_t m)
 	vm_page_free_toq(m);
 }
 
+void
+vm_page_free_zero_locked(vm_page_t m)
+{
+
+	m->flags |= PG_ZERO;
+	_vm_page_free_toq(m, 1);
+}
+
 /*
  *	vm_page_sleep:
  *
@@ -1266,13 +1284,15 @@ vm_page_requeue(vm_page_t m)
  *	The queue containing the given page must be locked.
  *	This routine may not block.
  */
-void
-vm_pageq_remove_locked(vm_page_t m)
+static __inline void
+_vm_pageq_remove(vm_page_t m, int locked)
 {
 	int queue;
 	struct vpgqueues *pq;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	if (locked == 0)
+		vm_page_lock_queues();
+
 	queue = VM_PAGE_GETQUEUE(m);
 	if (queue != PQ_NONE) {
 		VM_PAGE_SETQUEUE2(m, PQ_NONE);
@@ -1280,14 +1300,23 @@ vm_pageq_remove_locked(vm_page_t m)
 		TAILQ_REMOVE(&pq->pl, m, pageq);
 		(*pq->cnt)--;
 	}
+	if (locked == 0)
+		vm_page_unlock_queues();
 }
+
+void
+vm_pageq_remove_locked(vm_page_t m)
+{
+
+	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	_vm_pageq_remove(m, 1);
+}
+
 void
 vm_pageq_remove(vm_page_t m)
 {
 	mtx_assert(&vm_page_queue_mtx, MA_NOTOWNED);
-	vm_page_lock_queues();
-	vm_pageq_remove_locked(m);
-	vm_page_unlock_queues();
+	_vm_pageq_remove(m, 0);
 }
 
 /*
@@ -1298,23 +1327,26 @@ vm_pageq_remove(vm_page_t m)
  *	The page queues must be locked.
  */
 static void
-vm_page_enqueue_locked(int queue, vm_page_t m)
+_vm_page_enqueue(int queue, vm_page_t m, int locked)
 {
 	struct vpgqueues *vpq;
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	if (locked == 0) {
+		mtx_assert(&vm_page_queue_mtx, MA_NOTOWNED);
+		vm_page_lock_queues();
+	}
+#ifdef INVARIANTS
+	/* avoid dangling else */
+	else 
+		mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+#endif
+	
 	vpq = &vm_page_queues[queue];
 	VM_PAGE_SETQUEUE2(m, queue);
 	TAILQ_INSERT_TAIL(&vpq->pl, m, pageq);
 	++*vpq->cnt;
-}
-
-static void
-vm_page_enqueue(int queue, vm_page_t m)
-{
-	vm_page_lock_queues();
-	vm_page_enqueue_locked(queue, m);
-	vm_page_unlock_queues();
+	if (locked == 0)
+		vm_page_unlock_queues();
 }
 
 /*
@@ -1338,7 +1370,7 @@ vm_page_activate_locked(vm_page_t m)
 		if (m->wire_count == 0 && (m->flags & PG_UNMANAGED) == 0) {
 			if (m->act_count < ACT_INIT)
 				m->act_count = ACT_INIT;
-			vm_page_enqueue(PQ_ACTIVE, m);
+			_vm_page_enqueue(PQ_ACTIVE, m, 1);
 		}
 	} else {
 		if (m->act_count < ACT_INIT)
@@ -1399,8 +1431,8 @@ vm_page_free_wakeup(void)
  *	This routine may not block.
  */
 
-void
-vm_page_free_toq(vm_page_t m)
+static void
+_vm_page_free_toq(vm_page_t m, int locked)
 {
 
 	PCPU_INC(cnt.v_tfree);
@@ -1440,7 +1472,7 @@ vm_page_free_toq(vm_page_t m)
 	 * return, otherwise delay object association removal.
 	 */
 	if ((m->flags & PG_FICTITIOUS) != 0) {
-		vm_pageq_remove(m);
+		_vm_pageq_remove(m, locked);
 		return;
 	}
 
@@ -1449,12 +1481,10 @@ vm_page_free_toq(vm_page_t m)
 
 	if (m->hold_count != 0) {
 		m->flags &= ~PG_ZERO;
-		vm_page_lock_queues();
-		vm_pageq_remove_locked(m);
-		vm_page_enqueue_locked(PQ_HOLD, m);
-		vm_page_unlock_queues();
+		_vm_pageq_remove(m, locked);
+		_vm_page_enqueue(PQ_HOLD, m, locked);
 	} else {
-		vm_pageq_remove(m);
+		_vm_pageq_remove(m, locked);
 		mtx_lock(&vm_page_queue_free_mtx);
 		m->flags |= PG_FREE;
 		cnt.v_free_count++;
@@ -1473,6 +1503,20 @@ vm_page_free_toq(vm_page_t m)
 	}
 }
 
+void
+vm_page_free_toq(vm_page_t m)
+{
+
+	_vm_page_free_toq(m, 0);
+}
+
+void
+vm_page_free_toq_locked(vm_page_t m)
+{
+
+	_vm_page_free_toq(m, 1);
+}
+
 /*
  *	vm_page_wire:
  *
@@ -1546,10 +1590,10 @@ vm_page_unwire(vm_page_t m, int activate
 			if (m->flags & PG_UNMANAGED) {
 				;
 			} else if (activate)
-				vm_page_enqueue(PQ_ACTIVE, m);
+				_vm_page_enqueue(PQ_ACTIVE, m, 0);
 			else {
 				vm_page_flag_clear(m, PG_WINATCFLS);
-				vm_page_enqueue(PQ_INACTIVE, m);
+				_vm_page_enqueue(PQ_INACTIVE, m, 0);
 			}
 		}
 	} else {
@@ -1694,10 +1738,7 @@ _vm_page_cache(vm_page_t m, int locked)
 	/*
 	 * Remove the page from the paging queues.
 	 */
-	if (locked)
-		vm_pageq_remove_locked(m);
-	else
-		vm_pageq_remove(m);
+	_vm_pageq_remove(m, locked);
 	/*
 	 * Remove the page from the object's collection of resident
 	 * pages. 

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 20:13:17 2009	(r192850)
+++ user/kmacy/releng_7_2_fcs/sys/vm/vm_page.h	Tue May 26 20:14:52 2009	(r192851)
@@ -314,6 +314,8 @@ void vm_page_hold(vm_page_t mem);
 void vm_page_unhold(vm_page_t mem);
 void vm_page_free(vm_page_t m);
 void vm_page_free_zero(vm_page_t m);
+void vm_page_free_locked(vm_page_t m);
+void vm_page_free_zero_locked(vm_page_t m);
 void vm_page_dirty(vm_page_t m);
 void vm_page_wakeup(vm_page_t m);
 
@@ -353,6 +355,7 @@ void vm_page_test_dirty (vm_page_t);
 int vm_page_bits (int, int);
 void vm_page_zero_invalid(vm_page_t m, boolean_t setvalid);
 void vm_page_free_toq(vm_page_t m);
+void vm_page_free_toq_locked(vm_page_t m);
 void vm_page_zero_idle_wakeup(void);
 void vm_page_cowfault (vm_page_t);
 int vm_page_cowsetup(vm_page_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 20:13:17 2009	(r192850)
+++ user/kmacy/releng_7_2_fcs/sys/vm/vm_pageout.c	Tue May 26 20:14:52 2009	(r192851)
@@ -870,7 +870,7 @@ rescan0:
 			/*
 			 * Invalid pages can be easily freed
 			 */
-			vm_page_free(m);
+			vm_page_free_locked(m);
 			cnt.v_dfree++;
 			--page_shortage;
 		} else if (m->dirty == 0) {


More information about the svn-src-user mailing list