svn commit: r225641 - head/sys/kern
Edward Tomasz Napierala
trasz at FreeBSD.org
Sat Sep 17 19:55:33 UTC 2011
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);
}
More information about the svn-src-head
mailing list