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:
parent
11dc48dfde
commit
b38520f09c
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=225641
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user