diff options
author | trasz <trasz@FreeBSD.org> | 2011-09-17 19:55:32 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2011-09-17 19:55:32 +0000 |
commit | 885c3974292380cb965fd99f2a4371e9e3225697 (patch) | |
tree | 195bcf812044f53fbd8420e9df679c97560bf120 /sys/kern | |
parent | 71b574423035f1fdf0afadd60afd9789d1cd3753 (diff) | |
download | FreeBSD-src-885c3974292380cb965fd99f2a4371e9e3225697.zip FreeBSD-src-885c3974292380cb965fd99f2a4371e9e3225697.tar.gz |
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)
Diffstat (limited to 'sys/kern')
-rw-r--r-- | sys/kern/kern_exit.c | 20 | ||||
-rw-r--r-- | sys/kern/kern_fork.c | 24 |
2 files changed, 7 insertions, 37 deletions
diff --git a/sys/kern/kern_exit.c b/sys/kern/kern_exit.c index 9be54de..49192bf 100644 --- a/sys/kern/kern_exit.c +++ b/sys/kern/kern_exit.c @@ -765,12 +765,12 @@ proc_reap(struct thread *td, struct proc *p, int *status, int options, /* * 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); diff --git a/sys/kern/kern_fork.c b/sys/kern/kern_fork.c index df2b725..0a27cc0 100644 --- a/sys/kern/kern_fork.c +++ b/sys/kern/kern_fork.c @@ -806,14 +806,6 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp, 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 pages, struct proc **procp, */ 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 pages, struct proc **procp, * 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); } |