Module Name: src Committed By: yamt Date: Mon Jun 20 23:18:58 UTC 2011
Modified Files: src/sys/uvm: uvm_pdpolicy_clockpro.c Log Message: band-aid fix after the merge of rmind-uvmplock branch. To generate a diff of this commit: cvs rdiff -u -r1.16 -r1.17 src/sys/uvm/uvm_pdpolicy_clockpro.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_pdpolicy_clockpro.c diff -u src/sys/uvm/uvm_pdpolicy_clockpro.c:1.16 src/sys/uvm/uvm_pdpolicy_clockpro.c:1.17 --- src/sys/uvm/uvm_pdpolicy_clockpro.c:1.16 Sat Feb 5 13:33:47 2011 +++ src/sys/uvm/uvm_pdpolicy_clockpro.c Mon Jun 20 23:18:58 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_pdpolicy_clockpro.c,v 1.16 2011/02/05 13:33:47 yamt Exp $ */ +/* $NetBSD: uvm_pdpolicy_clockpro.c,v 1.17 2011/06/20 23:18:58 yamt Exp $ */ /*- * Copyright (c)2005, 2006 YAMAMOTO Takashi, @@ -43,7 +43,7 @@ #else /* defined(PDSIM) */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_pdpolicy_clockpro.c,v 1.16 2011/02/05 13:33:47 yamt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_pdpolicy_clockpro.c,v 1.17 2011/06/20 23:18:58 yamt Exp $"); #include "opt_ddb.h" @@ -54,6 +54,7 @@ #include <sys/hash.h> #include <uvm/uvm.h> +#include <uvm/uvm_pdaemon.h> /* for uvmpd_trylockowner */ #include <uvm/uvm_pdpolicy.h> #include <uvm/uvm_pdpolicy_impl.h> @@ -117,6 +118,9 @@ PDPOL_EVCNT_DEFINE(speculativehit2) PDPOL_EVCNT_DEFINE(speculativemiss) +PDPOL_EVCNT_DEFINE(locksuccess) +PDPOL_EVCNT_DEFINE(lockfail) + #define PQ_REFERENCED PQ_PRIVATE1 #define PQ_HOT PQ_PRIVATE2 #define PQ_TEST PQ_PRIVATE3 @@ -630,21 +634,37 @@ } static void -clockpro_movereferencebit(struct vm_page *pg) +clockpro_movereferencebit(struct vm_page *pg, bool locked) { + kmutex_t *lock; bool referenced; + KASSERT(!locked || uvm_page_locked_p(pg)); + if (!locked) { + lock = uvmpd_trylockowner(pg); + if (lock == NULL) { + /* + * XXXuvmplock + */ + PDPOL_EVCNT_INCR(lockfail); + return; + } + PDPOL_EVCNT_INCR(locksuccess); + } referenced = pmap_clear_reference(pg); + if (!locked) { + mutex_exit(lock); + } if (referenced) { pg->pqflags |= PQ_REFERENCED; } } static void -clockpro_clearreferencebit(struct vm_page *pg) +clockpro_clearreferencebit(struct vm_page *pg, bool locked) { - clockpro_movereferencebit(pg); + clockpro_movereferencebit(pg, locked); pg->pqflags &= ~PQ_REFERENCED; } @@ -660,7 +680,7 @@ KASSERT(pg != NULL); KASSERT(clockpro_getq(pg) == CLOCKPRO_NEWQ); if ((pg->pqflags & PQ_INITIALREF) != 0) { - clockpro_clearreferencebit(pg); + clockpro_clearreferencebit(pg, false); pg->pqflags &= ~PQ_INITIALREF; } /* place at the list head */ @@ -763,7 +783,7 @@ pg->pqflags |= PQ_TEST; } s->s_ncold++; - clockpro_clearreferencebit(pg); + clockpro_clearreferencebit(pg, false); clockpro___enqueuetail(pg); #else /* defined(USEONCE2) */ if (speculative) { @@ -929,7 +949,7 @@ dump("hot done"); return; } - clockpro_movereferencebit(pg); + clockpro_movereferencebit(pg, false); if ((pg->pqflags & PQ_REFERENCED) == 0) { PDPOL_EVCNT_INCR(hhotunref); uvmexp.pddeact++; @@ -1016,7 +1036,7 @@ #endif /* defined(LISTQ) */ KASSERT((pg->pqflags & PQ_HOT) == 0); uvmexp.pdscans++; - clockpro_movereferencebit(pg); + clockpro_movereferencebit(pg, false); if ((pg->pqflags & PQ_SPECULATIVE) != 0) { KASSERT((pg->pqflags & PQ_TEST) == 0); if ((pg->pqflags & PQ_REFERENCED) != 0) { @@ -1088,7 +1108,7 @@ uvmpdpol_pagedeactivate(struct vm_page *pg) { - clockpro_clearreferencebit(pg); + clockpro_clearreferencebit(pg, true); } void @@ -1110,7 +1130,7 @@ if (uvmpdpol_pageisqueued_p(pg)) { return; } - clockpro_clearreferencebit(pg); + clockpro_clearreferencebit(pg, true); pg->pqflags |= PQ_SPECULATIVE; clockpro_pageenqueue(pg); #else @@ -1267,6 +1287,12 @@ #if defined(DDB) +#if 0 /* XXXuvmplock */ +#define _pmap_is_referenced(pg) pmap_is_referenced(pg) +#else +#define _pmap_is_referenced(pg) false +#endif + void clockpro_dump(void); void @@ -1299,7 +1325,7 @@ if ((pg->pqflags & PQ_INITIALREF) != 0) { \ ninitialref++; \ } else if ((pg->pqflags & PQ_REFERENCED) != 0 || \ - pmap_is_referenced(pg)) { \ + _pmap_is_referenced(pg)) { \ nref++; \ } \ } @@ -1381,7 +1407,7 @@ (pg->pqflags & PQ_HOT) ? "H" : "", (pg->pqflags & PQ_TEST) ? "T" : "", (pg->pqflags & PQ_REFERENCED) ? "R" : "", - pmap_is_referenced(pg) ? "r" : "", + _pmap_is_referenced(pg) ? "r" : "", (pg->pqflags & PQ_INITIALREF) ? "I" : "", (pg->pqflags & PQ_SPECULATIVE) ? "S" : "" );