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