Skip site navigation (1)Skip section navigation (2)
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>