diff options
author | trasz <trasz@FreeBSD.org> | 2011-03-29 17:47:25 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2011-03-29 17:47:25 +0000 |
commit | b8d3e8755df2ce0e93cf3b2ab68e0c4275c5565f (patch) | |
tree | 304753d7f5287660a242996801bd5664ee945d3a /sys/kern/kern_resource.c | |
parent | 056d03857b74836195225ca4b0216f0d197477b7 (diff) | |
download | FreeBSD-src-b8d3e8755df2ce0e93cf3b2ab68e0c4275c5565f.zip FreeBSD-src-b8d3e8755df2ce0e93cf3b2ab68e0c4275c5565f.tar.gz |
Add racct. It's an API to keep per-process, per-jail, per-loginclass
and per-loginclass resource accounting information, to be used by the new
resource limits code. It's connected to the build, but the code that
actually calls the new functions will come later.
Sponsored by: The FreeBSD Foundation
Reviewed by: kib (earlier version)
Diffstat (limited to 'sys/kern/kern_resource.c')
-rw-r--r-- | sys/kern/kern_resource.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 66b6e2d..fa7437d 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -50,6 +50,7 @@ __FBSDID("$FreeBSD$"); #include <sys/priv.h> #include <sys/proc.h> #include <sys/refcount.h> +#include <sys/racct.h> #include <sys/resourcevar.h> #include <sys/rwlock.h> #include <sys/sched.h> @@ -1201,6 +1202,7 @@ uifind(uid) if (uip == NULL) { rw_runlock(&uihashtbl_lock); uip = malloc(sizeof(*uip), M_UIDINFO, M_WAITOK | M_ZERO); + racct_create(&uip->ui_racct); rw_wlock(&uihashtbl_lock); /* * There's a chance someone created our uidinfo while we @@ -1209,6 +1211,7 @@ uifind(uid) */ if ((old_uip = uilookup(uid)) != NULL) { /* Someone else beat us to it. */ + racct_destroy(&uip->ui_racct); free(uip, M_UIDINFO); uip = old_uip; } else { @@ -1264,6 +1267,7 @@ uifree(uip) /* Prepare for suboptimal case. */ rw_wlock(&uihashtbl_lock); if (refcount_release(&uip->ui_ref)) { + racct_destroy(&uip->ui_racct); LIST_REMOVE(uip, ui_hash); rw_wunlock(&uihashtbl_lock); if (uip->ui_sbsize != 0) @@ -1286,6 +1290,22 @@ uifree(uip) rw_wunlock(&uihashtbl_lock); } +void +ui_racct_foreach(void (*callback)(struct racct *racct, + void *arg2, void *arg3), void *arg2, void *arg3) +{ + struct uidinfo *uip; + struct uihashhead *uih; + + rw_rlock(&uihashtbl_lock); + for (uih = &uihashtbl[uihash]; uih >= uihashtbl; uih--) { + LIST_FOREACH(uip, uih, ui_hash) { + (callback)(uip->ui_racct, arg2, arg3); + } + } + rw_runlock(&uihashtbl_lock); +} + /* * Change the count associated with number of processes * a given user is using. When 'max' is 0, don't enforce a limit |