Enable accounting for RACCT_NPROC and RACCT_NTHR.

Sponsored by:	The FreeBSD Foundation
Reviewed by:	kib (earlier version)
This commit is contained in:
Edward Tomasz Napierala 2011-03-31 19:22:11 +00:00
parent e4dcb7046a
commit 58c77a9d53
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=220222
4 changed files with 55 additions and 5 deletions

View File

@ -557,6 +557,9 @@ proc0_init(void *dummy __unused)
* Charge root for one process. * Charge root for one process.
*/ */
(void)chgproccnt(p->p_ucred->cr_ruidinfo, 1, 0); (void)chgproccnt(p->p_ucred->cr_ruidinfo, 1, 0);
PROC_LOCK(p);
racct_add_force(p, RACCT_NPROC, 1);
PROC_UNLOCK(p);
} }
SYSINIT(p0init, SI_SUB_INTRINSIC, SI_ORDER_FIRST, proc0_init, NULL); SYSINIT(p0init, SI_SUB_INTRINSIC, SI_ORDER_FIRST, proc0_init, NULL);

View File

@ -177,6 +177,7 @@ exit1(struct thread *td, int rv)
} }
KASSERT(p->p_numthreads == 1, KASSERT(p->p_numthreads == 1,
("exit1: proc %p exiting with %d threads", p, p->p_numthreads)); ("exit1: proc %p exiting with %d threads", p, p->p_numthreads));
racct_sub(p, RACCT_NTHR, 1);
/* /*
* Wakeup anyone in procfs' PIOCWAIT. They should have a hold * Wakeup anyone in procfs' PIOCWAIT. They should have a hold
* on our vmspace, so we should block below until they have * on our vmspace, so we should block below until they have
@ -745,6 +746,9 @@ proc_reap(struct thread *td, struct proc *p, int *status, int options,
* Destroy resource accounting information associated with the process. * Destroy resource accounting information associated with the process.
*/ */
racct_proc_exit(p); racct_proc_exit(p);
PROC_LOCK(p->p_pptr);
racct_sub(p->p_pptr, RACCT_NPROC, 1);
PROC_UNLOCK(p->p_pptr);
/* /*
* Free credentials, arguments, and sigacts. * Free credentials, arguments, and sigacts.
@ -905,7 +909,11 @@ proc_reparent(struct proc *child, struct proc *parent)
if (child->p_pptr == parent) if (child->p_pptr == parent)
return; return;
PROC_LOCK(parent);
racct_add_force(parent, RACCT_NPROC, 1);
PROC_UNLOCK(parent);
PROC_LOCK(child->p_pptr); PROC_LOCK(child->p_pptr);
racct_sub(child->p_pptr, RACCT_NPROC, 1);
sigqueue_take(child->p_ksi); sigqueue_take(child->p_ksi);
PROC_UNLOCK(child->p_pptr); PROC_UNLOCK(child->p_pptr);
LIST_REMOVE(child, p_sibling); LIST_REMOVE(child, p_sibling);

View File

@ -734,6 +734,12 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
return (fork_norfproc(td, flags)); return (fork_norfproc(td, flags));
} }
PROC_LOCK(p1);
error = racct_add(p1, RACCT_NPROC, 1);
PROC_UNLOCK(p1);
if (error != 0)
return (EAGAIN);
mem_charged = 0; mem_charged = 0;
vm2 = NULL; vm2 = NULL;
if (pages == 0) if (pages == 0)
@ -816,6 +822,17 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
goto fail; goto fail;
} }
/*
* After fork, there is exactly one thread running.
*/
PROC_LOCK(newproc);
error = racct_set(newproc, RACCT_NTHR, 1);
PROC_UNLOCK(newproc);
if (error != 0) {
error = EAGAIN;
goto fail;
}
/* /*
* Increment the count of procs running with this uid. Don't allow * Increment the count of procs running with this uid. Don't allow
* a nonprivileged user to exceed their current limit. * a nonprivileged user to exceed their current limit.
@ -857,6 +874,9 @@ fork1(struct thread *td, int flags, int pages, struct proc **procp)
vmspace_free(vm2); vmspace_free(vm2);
uma_zfree(proc_zone, newproc); uma_zfree(proc_zone, newproc);
pause("fork", hz / 2); pause("fork", hz / 2);
PROC_LOCK(p1);
racct_sub(p1, RACCT_NPROC, 1);
PROC_UNLOCK(p1);
return (error); return (error);
} }

View File

@ -36,6 +36,7 @@ __FBSDID("$FreeBSD$");
#include <sys/priv.h> #include <sys/priv.h>
#include <sys/proc.h> #include <sys/proc.h>
#include <sys/posix4.h> #include <sys/posix4.h>
#include <sys/racct.h>
#include <sys/resourcevar.h> #include <sys/resourcevar.h>
#include <sys/rwlock.h> #include <sys/rwlock.h>
#include <sys/sched.h> #include <sys/sched.h>
@ -184,10 +185,18 @@ create_thread(struct thread *td, mcontext_t *ctx,
} }
} }
PROC_LOCK(td->td_proc);
error = racct_add(p, RACCT_NTHR, 1);
PROC_UNLOCK(td->td_proc);
if (error != 0)
return (EPROCLIM);
/* Initialize our td */ /* Initialize our td */
newtd = thread_alloc(0); newtd = thread_alloc(0);
if (newtd == NULL) if (newtd == NULL) {
return (ENOMEM); error = ENOMEM;
goto fail;
}
/* /*
* Try the copyout as soon as we allocate the td so we don't * Try the copyout as soon as we allocate the td so we don't
@ -203,7 +212,8 @@ create_thread(struct thread *td, mcontext_t *ctx,
(parent_tid != NULL && (parent_tid != NULL &&
suword_lwpid(parent_tid, newtd->td_tid))) { suword_lwpid(parent_tid, newtd->td_tid))) {
thread_free(newtd); thread_free(newtd);
return (EFAULT); error = EFAULT;
goto fail;
} }
bzero(&newtd->td_startzero, bzero(&newtd->td_startzero,
@ -220,7 +230,7 @@ create_thread(struct thread *td, mcontext_t *ctx,
if (error != 0) { if (error != 0) {
thread_free(newtd); thread_free(newtd);
crfree(td->td_ucred); crfree(td->td_ucred);
return (error); goto fail;
} }
} else { } else {
/* Set up our machine context. */ /* Set up our machine context. */
@ -233,7 +243,7 @@ create_thread(struct thread *td, mcontext_t *ctx,
if (error != 0) { if (error != 0) {
thread_free(newtd); thread_free(newtd);
crfree(td->td_ucred); crfree(td->td_ucred);
return (error); goto fail;
} }
} }
@ -265,6 +275,12 @@ create_thread(struct thread *td, mcontext_t *ctx,
thread_unlock(newtd); thread_unlock(newtd);
return (0); return (0);
fail:
PROC_LOCK(p);
racct_sub(p, RACCT_NTHR, 1);
PROC_UNLOCK(p);
return (error);
} }
int int
@ -294,7 +310,10 @@ thr_exit(struct thread *td, struct thr_exit_args *uap)
} }
rw_wlock(&tidhash_lock); rw_wlock(&tidhash_lock);
PROC_LOCK(p); PROC_LOCK(p);
racct_sub(p, RACCT_NTHR, 1);
/* /*
* Shutting down last thread in the proc. This will actually * Shutting down last thread in the proc. This will actually
* call exit() in the trampoline when it returns. * call exit() in the trampoline when it returns.