Module Name:    src
Committed By:   rmind
Date:           Fri May 28 23:41:15 UTC 2010

Modified Files:
        src/sys/uvm: uvm_aobj.c uvm_fault.c

Log Message:
uvm_fault_{upper,lower}_done: move drop-swap outside the page-queues lock.
Assert for object lock being held (or ref count 0) in uao_set_swslot().


To generate a diff of this commit:
cvs rdiff -u -r1.108 -r1.109 src/sys/uvm/uvm_aobj.c
cvs rdiff -u -r1.173 -r1.174 src/sys/uvm/uvm_fault.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/uvm/uvm_aobj.c
diff -u src/sys/uvm/uvm_aobj.c:1.108 src/sys/uvm/uvm_aobj.c:1.109
--- src/sys/uvm/uvm_aobj.c:1.108	Wed Oct 21 21:12:07 2009
+++ src/sys/uvm/uvm_aobj.c	Fri May 28 23:41:14 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_aobj.c,v 1.108 2009/10/21 21:12:07 rmind Exp $	*/
+/*	$NetBSD: uvm_aobj.c,v 1.109 2010/05/28 23:41:14 rmind Exp $	*/
 
 /*
  * Copyright (c) 1998 Chuck Silvers, Charles D. Cranor and
@@ -43,7 +43,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_aobj.c,v 1.108 2009/10/21 21:12:07 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_aobj.c,v 1.109 2010/05/28 23:41:14 rmind Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -319,6 +319,8 @@
 	UVMHIST_LOG(pdhist, "aobj %p pageidx %d slot %d",
 	    aobj, pageidx, slot, 0);
 
+	KASSERT(mutex_owned(&uobj->vmobjlock) || uobj->uo_refs == 0);
+
 	/*
 	 * if noswap flag is set, then we can't set a non-zero slot.
 	 */

Index: src/sys/uvm/uvm_fault.c
diff -u src/sys/uvm/uvm_fault.c:1.173 src/sys/uvm/uvm_fault.c:1.174
--- src/sys/uvm/uvm_fault.c:1.173	Wed Feb 24 15:58:26 2010
+++ src/sys/uvm/uvm_fault.c	Fri May 28 23:41:14 2010
@@ -1,4 +1,4 @@
-/*	$NetBSD: uvm_fault.c,v 1.173 2010/02/24 15:58:26 uebayasi Exp $	*/
+/*	$NetBSD: uvm_fault.c,v 1.174 2010/05/28 23:41:14 rmind Exp $	*/
 
 /*
  *
@@ -39,7 +39,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.173 2010/02/24 15:58:26 uebayasi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: uvm_fault.c,v 1.174 2010/05/28 23:41:14 rmind Exp $");
 
 #include "opt_uvmhist.h"
 
@@ -1512,6 +1512,8 @@
 	struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
 	struct uvm_object *uobj, struct vm_anon *anon, struct vm_page *pg)
 {
+	const bool wire_paging = flt->wire_paging;
+
 	UVMHIST_FUNC("uvm_fault_upper_done"); UVMHIST_CALLED(maphist);
 
 	/*
@@ -1519,7 +1521,7 @@
 	 */
 
 	mutex_enter(&uvm_pageqlock);
-	if (flt->wire_paging) {
+	if (wire_paging) {
 		uvm_pagewire(pg);
 
 		/*
@@ -1530,11 +1532,15 @@
 		 */
 
 		pg->flags &= ~(PG_CLEAN);
-		uvm_anon_dropswap(anon);
+
 	} else {
 		uvm_pageactivate(pg);
 	}
 	mutex_exit(&uvm_pageqlock);
+
+	if (wire_paging) {
+		uvm_anon_dropswap(anon);
+	}
 }
 
 /*
@@ -2206,6 +2212,8 @@
 	struct uvm_faultinfo *ufi, struct uvm_faultctx *flt,
 	struct uvm_object *uobj, struct vm_anon *anon, struct vm_page *pg)
 {
+	bool dropswap = false;
+
 	UVMHIST_FUNC("uvm_fault_lower_done"); UVMHIST_CALLED(maphist);
 
 	mutex_enter(&uvm_pageqlock);
@@ -2222,13 +2230,16 @@
 
 			KASSERT(uobj != NULL);
 			pg->flags &= ~(PG_CLEAN);
-			uao_dropswap(uobj, pg->offset >> PAGE_SHIFT);
+			dropswap = true;
 		}
 	} else {
 		uvm_pageactivate(pg);
 	}
 	mutex_exit(&uvm_pageqlock);
 
+	if (dropswap) {
+		uao_dropswap(uobj, pg->offset >> PAGE_SHIFT);
+	}
 	if (pg->flags & PG_WANTED)
 		wakeup(pg);
 

Reply via email to