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)
This commit is contained in:
Edward Tomasz Napierala 2011-09-17 19:55:32 +00:00
parent 11dc48dfde
commit b38520f09c
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=225641
2 changed files with 7 additions and 37 deletions

View File

@ -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 @@ kern_wait(struct thread *td, pid_t pid, int *status, int options,
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);

View File

@ -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 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp,
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);
}