Date: Sat, 15 Aug 2009 13:01:01 GMT From: Edward Tomasz Napierala <trasz@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 167361 for review Message-ID: <200908151301.n7FD11NX067610@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://perforce.freebsd.org/chv.cgi?CH=167361 Change 167361 by trasz@trasz_anger on 2009/08/15 13:00:39 Finish implementation of few things, get rid of hrl_{alloc,allocated,free}(). Affected files ... .. //depot/projects/soc2009/trasz_limits/sys/kern/init_main.c#11 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#55 edit .. //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#7 edit .. //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#31 edit .. //depot/projects/soc2009/trasz_limits/sys/sys/loginclass.h#4 edit Differences ... ==== //depot/projects/soc2009/trasz_limits/sys/kern/init_main.c#11 (text+ko) ==== @@ -517,7 +517,7 @@ * Charge root for one process. */ (void)chgproccnt(p->p_ucred->cr_ruidinfo, 1, 0); - error = hrl_alloc(HRL_RESOURCE_MAXPROCESSES, 1); + error = hrl_alloc_proc(p, HRL_RESOURCE_MAXPROCESSES, 1); KASSERT(error == 0, ("hrl_alloc failed")); } SYSINIT(p0init, SI_SUB_INTRINSIC, SI_ORDER_FIRST, proc0_init, NULL); ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#55 (text+ko) ==== @@ -256,8 +256,9 @@ static int64_t hrl_available_resource(const struct proc *p, const struct hrl_rule *rule) { - int resource; - int64_t available; + int resource, i; + int64_t available, found = 0; + struct ucred *cred = p->p_ucred; mtx_assert(&hrl_lock, MA_OWNED); @@ -269,27 +270,30 @@ break; case HRL_SUBJECT_USER: available = rule->hr_amount - - p->p_ucred->cr_ruidinfo->ui_usage.hu_resources[resource]; + cred->cr_ruidinfo->ui_usage.hu_resources[resource]; break; case HRL_SUBJECT_GROUP: if (hrl_group_accounting) { - /* - * XXX - */ - available = INT64_MAX; + for (i = 0; i < cred->cr_ngroups; i++) { + if (cred->cr_gidinfos[i]->gi_gid != + rule->hr_subject_id) + continue; + + found = 1; + available = rule->hr_amount - + cred->cr_gidinfos[i]->gi_usage.hu_resources[resource]; + } + KASSERT(found, ("hrl_available_resource: group not found")); } break; case HRL_SUBJECT_LOGINCLASS: - /* - * XXX - */ + available = rule->hr_amount - + p->p_loginclass->lc_usage.hu_resources[resource]; available = INT64_MAX; break; case HRL_SUBJECT_JAIL: - /* - * XXX - */ - available = INT64_MAX; + available = rule->hr_amount - + cred->cr_prison->pr_usage.hu_resources[resource]; break; default: panic("hrl_compute_available: unknown per %d", @@ -487,6 +491,7 @@ return (error); } p->p_usage.hu_resources[resource] += amount; + p->p_loginclass->lc_usage.hu_resources[resource] += amount; cred = p->p_ucred; cred->cr_ruidinfo->ui_usage.hu_resources[resource] += amount; for (pr = cred->cr_prison; pr != NULL; pr = pr->pr_parent) @@ -550,6 +555,7 @@ } } p->p_usage.hu_resources[resource] = amount; + p->p_loginclass->lc_usage.hu_resources[resource] += diff; cred = p->p_ucred; cred->cr_ruidinfo->ui_usage.hu_resources[resource] += diff; for (pr = cred->cr_prison; pr != NULL; pr = pr->pr_parent) @@ -604,6 +610,7 @@ "%lld for %s (pid %d)", amount, hrl_resource_name(resource), p->p_usage.hu_resources[resource], p->p_comm, p->p_pid)); p->p_usage.hu_resources[resource] -= amount; + p->p_loginclass->lc_usage.hu_resources[resource] -= amount; cred = p->p_ucred; cred->cr_ruidinfo->ui_usage.hu_resources[resource] -= amount; for (pr = cred->cr_prison; pr != NULL; pr = pr->pr_parent) @@ -633,26 +640,7 @@ mtx_unlock(&hrl_lock); } -/* - * Increase allocation of 'resource' for current process by 'amount'. - * Return 0 if it's below limits, or errno, if it's not. - */ -int -hrl_alloc(int resource, uint64_t amount) -{ - return (hrl_alloc_proc(curproc, resource, amount)); -} - -/* - * Decrease allocation of 'resource' for current process by 'amount'. - */ void -hrl_free(int resource, uint64_t amount) -{ - hrl_free_proc(curproc, resource, amount); -} - -void hrl_usage_add(struct hrl_usage *dest, const struct hrl_usage *src) { int i; @@ -754,7 +742,7 @@ } static int -str2id(const char *str, id_t *value) +str2id(const char *str, long *value) { char *end; @@ -1341,6 +1329,16 @@ } static int +hrl_get_usage_lc(struct thread *td, int lcp, struct sbuf **outputsbuf) +{ + struct loginclass *lc = (struct loginclass *)lcp; + + *outputsbuf = hrl_usage_to_sbuf(&lc->lc_usage); + + return (0); +} + +static int hrl_get_usage_jid(struct thread *td, id_t jid, struct sbuf **outputsbuf) { struct prison *pr; @@ -1388,6 +1386,10 @@ error = hrl_get_usage_gid(td, filter->hr_subject_id, &outputsbuf); break; + case HRL_SUBJECT_LOGINCLASS: + error = hrl_get_usage_lc(td, filter->hr_subject_id, + &outputsbuf); + break; case HRL_SUBJECT_JAIL: error = hrl_get_usage_jid(td, filter->hr_subject_id, &outputsbuf); ==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#7 (text+ko) ==== @@ -83,9 +83,17 @@ void loginclass_release(struct loginclass *lc) { + int i; mtx_lock(&loginclasses_lock); if (refcount_release(&lc->lc_refcount)) { + for (i = 0; i < HRL_RESOURCE_MAX; i++) { + if (lc->lc_usage.hu_resources[i] != 0) + printf("loginclass_release: freeing " + "loginclass \"%s\", resource %d = %lld\n", + lc->lc_name, i, + lc->lc_usage.hu_resources[i]); + } LIST_REMOVE(lc, lc_next); mtx_unlock(&loginclasses_lock); free(lc, M_LOGINCLASS); ==== //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#31 (text+ko) ==== @@ -55,7 +55,7 @@ */ struct hrl_rule { int hr_subject; - id_t hr_subject_id; + long hr_subject_id; int hr_per; int hr_resource; int hr_action; @@ -131,9 +131,6 @@ struct proc; -int hrl_alloc(int object, uint64_t amount); -int hrl_allocated(int object, uint64_t amount); -void hrl_free(int object, uint64_t amount); int hrl_alloc_proc(struct proc *p, int object, uint64_t amount); int hrl_allocated_proc(struct proc *p, int object, uint64_t amount); void hrl_free_proc(struct proc *p, int object, uint64_t amount); ==== //depot/projects/soc2009/trasz_limits/sys/sys/loginclass.h#4 (text+ko) ==== @@ -27,6 +27,8 @@ #ifndef _SYS_LOGINCLASS_H_ #define _SYS_LOGINCLASS_H_ +#include <sys/hrl.h> + /* * Exactly one of these structures exists per login class. */
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200908151301.n7FD11NX067610>