Module Name: src Committed By: matt Date: Fri Feb 17 23:36:04 UTC 2012
Modified Files: src/sys/uvm [matt-nb5-mips64]: uvm_pdaemon.c Log Message: Change way waiters are handled. To generate a diff of this commit: cvs rdiff -u -r1.93.4.2.4.6 -r1.93.4.2.4.7 src/sys/uvm/uvm_pdaemon.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_pdaemon.c diff -u src/sys/uvm/uvm_pdaemon.c:1.93.4.2.4.6 src/sys/uvm/uvm_pdaemon.c:1.93.4.2.4.7 --- src/sys/uvm/uvm_pdaemon.c:1.93.4.2.4.6 Thu Feb 16 04:20:45 2012 +++ src/sys/uvm/uvm_pdaemon.c Fri Feb 17 23:36:04 2012 @@ -1,4 +1,4 @@ -/* $NetBSD: uvm_pdaemon.c,v 1.93.4.2.4.6 2012/02/16 04:20:45 matt Exp $ */ +/* $NetBSD: uvm_pdaemon.c,v 1.93.4.2.4.7 2012/02/17 23:36:04 matt Exp $ */ /* * Copyright (c) 1997 Charles D. Cranor and Washington University. @@ -71,7 +71,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.93.4.2.4.6 2012/02/16 04:20:45 matt Exp $"); +__KERNEL_RCSID(0, "$NetBSD: uvm_pdaemon.c,v 1.93.4.2.4.7 2012/02/17 23:36:04 matt Exp $"); #include "opt_uvmhist.h" #include "opt_readahead.h" @@ -170,6 +170,7 @@ uvm_wait(const char *wmsg) uvm_pdinfo.pd_waiters++; wakeup(&uvm.pagedaemon); /* wake the daemon! */ UVM_UNLOCK_AND_WAIT(&uvmexp.free, &uvm_fpageqlock, false, wmsg, timo); + uvm_pdinfo.pd_waiters--; } @@ -372,12 +373,19 @@ uvm_pageout(void *arg) * active paging, then wait. */ if (pdinfo->pd_waiters == 0 - || TAILQ_FIRST(&pdinfo->pd_pendingq) == NULL) { + && TAILQ_FIRST(&pdinfo->pd_pendingq) == NULL) { UVMHIST_LOG(pdhist," <<SLEEPING>>",0,0,0,0); UVM_UNLOCK_AND_WAIT(&uvm.pagedaemon, &uvm_fpageqlock, false, "pgdaemon", 0); uvmexp.pdwoke++; UVMHIST_LOG(pdhist," <<WOKE UP>>",0,0,0,0); + } else if (TAILQ_FIRST(&pdinfo->pd_pendingq) == NULL) { + /* + * Someone is waiting but no group are pending. + * Let's kick ourselves to find groups that need work. + */ + uvm_kick_pdaemon(); + mutex_spin_exit(&uvm_fpageqlock); } else { mutex_spin_exit(&uvm_fpageqlock); } @@ -460,7 +468,6 @@ uvm_pageout(void *arg) } if (need_wakeup) { - pdinfo->pd_waiters = 0; wakeup(&uvmexp.free); } KASSERT (!need_free || need_wakeup); @@ -569,7 +576,6 @@ uvm_pageout_done(struct vm_page *pg, boo if (grp->pgrp_free * uvmexp.npggroups <= uvmexp.reserve_kernel) { wakeup(&uvm.pagedaemon); } else { - pdinfo->pd_waiters = 0; wakeup(&uvmexp.free); }