PERFORCE change 167373 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Sat Aug 15 17:14:41 UTC 2009
http://perforce.freebsd.org/chv.cgi?CH=167373
Change 167373 by trasz at trasz_anger on 2009/08/15 17:14:28
Refactor things.
Affected files ...
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#58 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#10 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_prot.c#21 edit
.. //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#33 edit
Differences ...
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#58 (text+ko) ====
@@ -640,7 +640,7 @@
mtx_unlock(&hrl_lock);
}
-void
+static void
hrl_usage_add(struct hrl_usage *dest, const struct hrl_usage *src)
{
int i;
@@ -662,7 +662,7 @@
mtx_unlock(&hrl_lock);
}
-void
+static void
hrl_usage_subtract(struct hrl_usage *dest, const struct hrl_usage *src)
{
int i;
@@ -1637,13 +1637,14 @@
}
/*
- * Called after loginclass change, to adjust p_limits.
+ * Called just before loginclass change, to adjust p_limits and lc_usage.
*/
void
-hrl_proc_loginclass_changed(struct proc *p)
+hrl_proc_loginclass_changing(struct proc *p, struct loginclass *newlc)
{
int error;
struct hrl_limit *limit;
+ struct loginclass *lc = p->p_loginclass;
PROC_LOCK_ASSERT(p, MA_OWNED);
@@ -1664,12 +1665,18 @@
/*
* Now add rules for the current loginclass.
*/
- LIST_FOREACH(limit, &p->p_loginclass->lc_limits, hl_next) {
+ LIST_FOREACH(limit, &newlc->lc_limits, hl_next) {
error = hrl_limit_add_locked(&p->p_limits, limit->hl_rule);
KASSERT(error == 0, ("XXX: better error handling needed"));
}
mtx_unlock(&hrl_lock);
+
+ /*
+ * Adjust loginclass resource usage information.
+ */
+ hrl_usage_subtract(&lc->lc_usage, &p->p_usage);
+ hrl_usage_add(&newlc->lc_usage, &p->p_usage);
}
/*
@@ -1681,11 +1688,11 @@
* XXX: What about jails?
*/
void
-hrl_proc_ucred_changed(struct proc *p)
+hrl_proc_ucred_changing(struct proc *p, struct ucred *newcred)
{
int error, i;
- struct ucred *cred = p->p_ucred;
struct hrl_limit *limit;
+ struct uidinfo *olduip, *newuip;
PROC_LOCK_ASSERT(p, MA_OWNED);
@@ -1707,14 +1714,14 @@
/*
* Now add rules for the current user credentials.
*/
- LIST_FOREACH(limit, &cred->cr_ruidinfo->ui_limits, hl_next) {
+ LIST_FOREACH(limit, &newcred->cr_ruidinfo->ui_limits, hl_next) {
error = hrl_limit_add_locked(&p->p_limits, limit->hl_rule);
KASSERT(error == 0, ("XXX: better error handling needed"));
}
if (hrl_group_accounting) {
- for (i = 0; i < cred->cr_ngroups; i++) {
+ for (i = 0; i < newcred->cr_ngroups; i++) {
LIST_FOREACH(limit,
- &cred->cr_gidinfos[i]->gi_limits, hl_next) {
+ &newcred->cr_gidinfos[i]->gi_limits, hl_next) {
error = hrl_limit_add_locked(&p->p_limits,
limit->hl_rule);
KASSERT(error == 0,
@@ -1724,6 +1731,28 @@
}
mtx_unlock(&hrl_lock);
+
+ /*
+ * Fix up per-ruid resource consumption.
+ */
+ newuip = newcred->cr_ruidinfo;
+ olduip = p->p_ucred->cr_ruidinfo;
+ if (newuip != olduip) {
+ hrl_usage_subtract(&olduip->ui_usage, &p->p_usage);
+ hrl_usage_add(&newuip->ui_usage, &p->p_usage);
+ }
+
+ /*
+ * Fix up per-group resource consumption.
+ */
+ if (hrl_group_accounting) {
+ for (i = 0; i < p->p_ucred->cr_ngroups; i++)
+ hrl_usage_subtract(
+ &p->p_ucred->cr_gidinfos[i]->gi_usage, &p->p_usage);
+ for (i = 0; i < newcred->cr_ngroups; i++)
+ hrl_usage_add(
+ &newcred->cr_gidinfos[i]->gi_usage, &p->p_usage);
+ }
}
/*
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_loginclass.c#10 (text+ko) ====
@@ -200,11 +200,9 @@
newlc = loginclass_find(lcname);
PROC_LOCK(p);
+ hrl_proc_loginclass_changing(p, newlc);
oldlc = p->p_loginclass;
p->p_loginclass = newlc;
- hrl_usage_subtract(&oldlc->lc_usage, &p->p_usage);
- hrl_usage_add(&newlc->lc_usage, &p->p_usage);
- hrl_proc_loginclass_changed(p);
PROC_UNLOCK(p);
loginclass_release(oldlc);
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_prot.c#21 (text+ko) ====
@@ -2190,33 +2190,10 @@
void
change_cred(struct proc *p, struct ucred *newcred)
{
- int i;
- struct uidinfo *olduip, *newuip;
-
PROC_LOCK_ASSERT(p, MA_OWNED);
- /*
- * Fix up per-ruid resource consumption.
- */
- newuip = newcred->cr_ruidinfo;
- olduip = p->p_ucred->cr_ruidinfo;
- if (newuip != olduip) {
- hrl_usage_subtract(&olduip->ui_usage, &p->p_usage);
- hrl_usage_add(&newuip->ui_usage, &p->p_usage);
- }
-
- /*
- * Fix up per-group resource consumption.
- */
- if (hrl_group_accounting) {
- for (i = 0; i < p->p_ucred->cr_ngroups; i++)
- hrl_usage_subtract(&p->p_ucred->cr_gidinfos[i]->gi_usage, &p->p_usage);
- for (i = 0; i < newcred->cr_ngroups; i++)
- hrl_usage_add(&newcred->cr_gidinfos[i]->gi_usage, &p->p_usage);
- }
-
+ hrl_proc_ucred_changing(p, newcred);
p->p_ucred = newcred;
- hrl_proc_ucred_changed(p);
}
/*-
==== //depot/projects/soc2009/trasz_limits/sys/sys/hrl.h#33 (text+ko) ====
@@ -129,18 +129,18 @@
#ifdef _KERNEL
+struct loginclass;
struct proc;
+struct ucred;
int hrl_alloc(struct proc *p, int object, uint64_t amount);
int hrl_allocated(struct proc *p, int object, uint64_t amount);
void hrl_free(struct proc *p, int object, uint64_t amount);
-void hrl_usage_add(struct hrl_usage *dest, const struct hrl_usage *src);
-void hrl_usage_subtract(struct hrl_usage *dest, const struct hrl_usage *src);
void hrl_proc_exiting(struct proc *p);
-void hrl_proc_loginclass_changed(struct proc *p);
-void hrl_proc_ucred_changed(struct proc *p);
+void hrl_proc_loginclass_changing(struct proc *p, struct loginclass *newlc);
+void hrl_proc_ucred_changing(struct proc *p, struct ucred *newcred);
struct hrl_rule *hrl_rule_alloc(int flags);
struct hrl_rule *hrl_rule_duplicate(const struct hrl_rule *rule, int flags);
More information about the p4-projects
mailing list