From owner-svn-src-all@FreeBSD.ORG Sat Sep 3 08:08:24 2011 Return-Path: Delivered-To: svn-src-all@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 6100E1065673; Sat, 3 Sep 2011 08:08:24 +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 5185B8FC16; Sat, 3 Sep 2011 08:08:24 +0000 (UTC) Received: from svn.freebsd.org (localhost [127.0.0.1]) by svn.freebsd.org (8.14.4/8.14.4) with ESMTP id p8388OEr036229; Sat, 3 Sep 2011 08:08:24 GMT (envelope-from trasz@svn.freebsd.org) Received: (from trasz@localhost) by svn.freebsd.org (8.14.4/8.14.4/Submit) id p8388O67036227; Sat, 3 Sep 2011 08:08:24 GMT (envelope-from trasz@svn.freebsd.org) Message-Id: <201109030808.p8388O67036227@svn.freebsd.org> From: Edward Tomasz Napierala Date: Sat, 3 Sep 2011 08:08: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: r225364 - head/sys/kern X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 03 Sep 2011 08:08:24 -0000 Author: trasz Date: Sat Sep 3 08:08:24 2011 New Revision: 225364 URL: http://svn.freebsd.org/changeset/base/225364 Log: Fix panic that happens when fork(2) fails due to a limit other than the rctl one - for example, it happens when someone reaches maximum number of processes in the system. Approved by: re (kib) Modified: head/sys/kern/kern_racct.c Modified: head/sys/kern/kern_racct.c ============================================================================== --- head/sys/kern/kern_racct.c Sat Sep 3 08:03:25 2011 (r225363) +++ head/sys/kern/kern_racct.c Sat Sep 3 08:08:24 2011 (r225364) @@ -605,6 +605,7 @@ out: void racct_proc_exit(struct proc *p) { + int i; uint64_t runtime; PROC_LOCK(p); @@ -618,14 +619,18 @@ racct_proc_exit(struct proc *p) if (runtime < p->p_prev_runtime) runtime = p->p_prev_runtime; #endif - racct_set(p, RACCT_CPU, runtime); + mtx_lock(&racct_lock); + racct_set_locked(p, RACCT_CPU, runtime); - /* - * XXX: Free this some other way. - */ - racct_set(p, RACCT_NPTS, 0); - racct_set(p, RACCT_NTHR, 0); - racct_set(p, RACCT_RSS, 0); + for (i = 0; i <= RACCT_MAX; i++) { + if (p->p_racct->r_resources[i] == 0) + continue; + if (!RACCT_IS_RECLAIMABLE(i)) + continue; + racct_set_locked(p, i, 0); + } + + mtx_unlock(&racct_lock); PROC_UNLOCK(p); #ifdef RCTL