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);