From owner-svn-src-head@FreeBSD.ORG Wed Apr 6 16:24:25 2011 Return-Path: Delivered-To: svn-src-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 4C7A1106566B; Wed, 6 Apr 2011 16:24:25 +0000 (UTC) (envelope-from trasz@FreeBSD.org) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:4f8:fff6::2c]) by mx1.freebsd.org (Postfix) with ESMTP id 2321A8FC17; Wed, 6 Apr 2011 16:24:25 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.3/8.14.3) with ESMTP id p36GOPrZ097116; Wed, 6 Apr 2011 16:24:25 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.3/8.14.3/Submit) id p36GOO8o097114; Wed, 6 Apr 2011 16:24:24 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <201104061624.p36GOO8o097114@svn.freebsd.org> From: Edward Tomasz Napierala Date: Wed, 6 Apr 2011 16:24:24 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org X-SVN-Group: head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cc: Subject: svn commit: r220386 - head/sys/vm X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Apr 2011 16:24:25 -0000 Author: trasz Date: Wed Apr 6 16:24:24 2011 New Revision: 220386 URL: http://svn.freebsd.org/changeset/base/220386 Log: Add RACCT_RSS. Sponsored by: The FreeBSD Foundation Reviewed by: kib (earlier version) Modified: head/sys/vm/vm_pageout.c Modified: head/sys/vm/vm_pageout.c ============================================================================== --- head/sys/vm/vm_pageout.c Wed Apr 6 15:45:32 2011 (r220385) +++ head/sys/vm/vm_pageout.c Wed Apr 6 16:24:24 2011 (r220386) @@ -86,6 +86,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -1631,11 +1632,16 @@ vm_daemon() struct proc *p; struct thread *td; struct vmspace *vm; - int breakout, swapout_flags; + int breakout, swapout_flags, tryagain, attempts; + uint64_t rsize, ravailable; while (TRUE) { mtx_lock(&vm_daemon_mtx); +#ifdef RACCT + msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep", hz); +#else msleep(&vm_daemon_needed, &vm_daemon_mtx, PPAUSE, "psleep", 0); +#endif swapout_flags = vm_pageout_req_swapout; vm_pageout_req_swapout = 0; mtx_unlock(&vm_daemon_mtx); @@ -1646,6 +1652,10 @@ vm_daemon() * scan the processes for exceeding their rlimits or if * process is swapped out -- deactivate pages */ + tryagain = 0; + attempts = 0; +again: + attempts++; sx_slock(&allproc_lock); FOREACH_PROC_IN_SYSTEM(p) { vm_pindex_t limit, size; @@ -1704,9 +1714,39 @@ vm_daemon() vm_pageout_map_deactivate_pages( &vm->vm_map, limit); } + rsize = IDX_TO_OFF(size); + PROC_LOCK(p); + racct_set(p, RACCT_RSS, rsize); + ravailable = racct_get_available(p, RACCT_RSS); + PROC_UNLOCK(p); + if (rsize > ravailable) { + /* + * Don't be overly aggressive; this might be + * an innocent process, and the limit could've + * been exceeded by some memory hog. Don't + * try to deactivate more than 1/4th of process' + * resident set size. + */ + if (attempts <= 8) { + if (ravailable < rsize - (rsize / 4)) + ravailable = rsize - (rsize / 4); + } + vm_pageout_map_deactivate_pages( + &vm->vm_map, OFF_TO_IDX(ravailable)); + /* Update RSS usage after paging out. */ + size = vmspace_resident_count(vm); + rsize = IDX_TO_OFF(size); + PROC_LOCK(p); + racct_set(p, RACCT_RSS, rsize); + PROC_UNLOCK(p); + if (rsize > ravailable) + tryagain = 1; + } vmspace_free(vm); } sx_sunlock(&allproc_lock); + if (tryagain != 0 && attempts <= 10) + goto again; } } #endif /* !defined(NO_SWAPPING) */