Date: Sat, 17 Sep 2011 19:55:33 +0000 (UTC) From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r225641 - head/sys/kern Message-ID: <201109171955.p8HJtXdA096852@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: trasz Date: Sat Sep 17 19:55:32 2011 New Revision: 225641 URL: http://svn.freebsd.org/changeset/base/225641 Log: Fix long-standing thinko regarding maxproc accounting. Basically, we were accounting the newly created process to its parent instead of the child itself. This caused problems later, when the child changed its credentials - the per-uid, per-jail etc counters were not properly updated, because the maxproc counter in the child process was 0. Approved by: re (kib) Modified: head/sys/kern/kern_exit.c head/sys/kern/kern_fork.c Modified: head/sys/kern/kern_exit.c ============================================================================== --- head/sys/kern/kern_exit.c Sat Sep 17 13:48:09 2011 (r225640) +++ head/sys/kern/kern_exit.c Sat Sep 17 19:55:32 2011 (r225641) @@ -765,12 +765,12 @@ proc_reap(struct thread *td, struct proc /* * Destroy resource accounting information associated with the process. */ - racct_proc_exit(p); #ifdef RACCT - PROC_LOCK(p->p_pptr); - racct_sub(p->p_pptr, RACCT_NPROC, 1); - PROC_UNLOCK(p->p_pptr); + PROC_LOCK(p); + racct_sub(p, RACCT_NPROC, 1); + PROC_UNLOCK(p); #endif + racct_proc_exit(p); /* * Free credentials, arguments, and sigacts. @@ -929,25 +929,13 @@ loop: void proc_reparent(struct proc *child, struct proc *parent) { -#ifdef RACCT - int locked; -#endif sx_assert(&proctree_lock, SX_XLOCKED); PROC_LOCK_ASSERT(child, MA_OWNED); if (child->p_pptr == parent) return; -#ifdef RACCT - locked = PROC_LOCKED(parent); - if (!locked) - PROC_LOCK(parent); - racct_add_force(parent, RACCT_NPROC, 1); - if (!locked) - PROC_UNLOCK(parent); -#endif PROC_LOCK(child->p_pptr); - racct_sub(child->p_pptr, RACCT_NPROC, 1); sigqueue_take(child->p_ksi); PROC_UNLOCK(child->p_pptr); LIST_REMOVE(child, p_sibling); Modified: head/sys/kern/kern_fork.c ============================================================================== --- head/sys/kern/kern_fork.c Sat Sep 17 13:48:09 2011 (r225640) +++ head/sys/kern/kern_fork.c Sat Sep 17 19:55:32 2011 (r225641) @@ -806,14 +806,6 @@ fork1(struct thread *td, int flags, int return (fork_norfproc(td, flags)); } -#ifdef RACCT - PROC_LOCK(p1); - error = racct_add(p1, RACCT_NPROC, 1); - PROC_UNLOCK(p1); - if (error != 0) - return (EAGAIN); -#endif - #ifdef PROCDESC /* * If required, create a process descriptor in the parent first; we @@ -822,14 +814,8 @@ fork1(struct thread *td, int flags, int */ if (flags & RFPROCDESC) { error = falloc(td, &fp_procdesc, procdescp, 0); - if (error != 0) { -#ifdef RACCT - PROC_LOCK(p1); - racct_sub(p1, RACCT_NPROC, 1); - PROC_UNLOCK(p1); -#endif + if (error != 0) return (error); - } } #endif @@ -920,7 +906,8 @@ fork1(struct thread *td, int flags, int * After fork, there is exactly one thread running. */ PROC_LOCK(newproc); - error = racct_set(newproc, RACCT_NTHR, 1); + error = racct_add(newproc, RACCT_NPROC, 1); + error += racct_add(newproc, RACCT_NTHR, 1); PROC_UNLOCK(newproc); if (error != 0) { error = EAGAIN; @@ -977,11 +964,6 @@ fail1: fdrop(fp_procdesc, td); #endif pause("fork", hz / 2); -#ifdef RACCT - PROC_LOCK(p1); - racct_sub(p1, RACCT_NPROC, 1); - PROC_UNLOCK(p1); -#endif return (error); }
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201109171955.p8HJtXdA096852>