PERFORCE change 167361 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Sat Aug 15 13:01:02 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167361
Change 167361 by trasz at 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.
*/
More information about the p4-projects
mailing list