PERFORCE change 164512 for review

Edward Tomasz Napierala trasz at FreeBSD.org
Tue Jun 16 16:11:57 UTC 2009


http://perforce.freebsd.org/chv.cgi?CH=164512

Change 164512 by trasz at trasz_victim on 2009/06/16 16:11:45

	Support hierarchical jails (untested).  Add debugging printfs.

Affected files ...

.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_exit.c#4 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#11 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_jail.c#4 edit
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#8 edit

Differences ...

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_exit.c#4 (text+ko) ====

@@ -129,7 +129,7 @@
 	struct ucred *tracecred;
 #endif
 	struct plimit *plim;
-	int locked;
+	int locked, i;
 
 	mtx_assert(&Giant, MA_NOTOWNED);
 
@@ -404,6 +404,12 @@
 	PROC_UNLOCK(p);
 	lim_free(plim);
 
+	for (i = 0; i < HRL_RESOURCE_MAX; i++) {
+		if (p->p_accounting.ha_resources[i] != 0)
+			printf("exit1: exiting process: resource %d = %lld\n",
+			    i, p->p_accounting.ha_resources[i]);
+	}
+
 	/*
 	 * Remove proc from allproc queue and pidhash chain.
 	 * Place onto zombproc.  Unlink from parent's child list.

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_hrl.c#11 (text+ko) ====

@@ -106,6 +106,7 @@
 {
 	int i;
 	struct ucred *cred;
+	struct prison *pr;
 
 	KASSERT(amount > 0, ("invalid amount"));
 
@@ -115,7 +116,8 @@
 	p->p_accounting.ha_resources[resource] += amount;
 	cred = p->p_ucred;
 	cred->cr_ruidinfo->ui_accounting.ha_resources[resource] += amount;
-	cred->cr_prison->pr_accounting.ha_resources[resource] += amount;
+	for (pr = cred->cr_prison; pr != NULL; pr = pr->pr_parent)
+		pr->pr_accounting.ha_resources[resource] += amount;
 	for (i = 0; i < cred->cr_ngroups; i++)
 		cred->cr_gidinfos[i]->gi_accounting.ha_resources[resource] += amount;
 
@@ -132,12 +134,14 @@
 	int i;
 	int64_t diff;
 	struct ucred *cred;
+	struct prison *pr;
 
 	diff = amount - p->p_accounting.ha_resources[resource];
 	p->p_accounting.ha_resources[resource] += diff;
 	cred = p->p_ucred;
 	cred->cr_ruidinfo->ui_accounting.ha_resources[resource] += diff;
-	cred->cr_prison->pr_accounting.ha_resources[resource] += diff;
+	for (pr = cred->cr_prison; pr != NULL; pr = pr->pr_parent)
+		pr->pr_accounting.ha_resources[resource] += diff;
 	for (i = 0; i < cred->cr_ngroups; i++)
 		cred->cr_gidinfos[i]->gi_accounting.ha_resources[resource] += diff;
 
@@ -154,13 +158,15 @@
 {
 	int i;
 	struct ucred *cred;
+	struct prison *pr;
 
 	KASSERT(amount > 0, ("invalid amount"));
 
 	p->p_accounting.ha_resources[resource] -= amount;
 	cred = p->p_ucred;
 	cred->cr_ruidinfo->ui_accounting.ha_resources[resource] -= amount;
-	cred->cr_prison->pr_accounting.ha_resources[resource] -= amount;
+	for (pr = cred->cr_prison; pr != NULL; pr = pr->pr_parent)
+		pr->pr_accounting.ha_resources[resource] -= amount;
 	for (i = 0; i < cred->cr_ngroups; i++)
 		cred->cr_gidinfos[i]->gi_accounting.ha_resources[resource] -= amount;
 }

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_jail.c#4 (text+ko) ====

@@ -2341,7 +2341,7 @@
 prison_deref(struct prison *pr, int flags)
 {
 	struct prison *ppr, *tpr;
-	int vfslocked;
+	int vfslocked, i;
 
 	if (!(flags & PD_LOCKED))
 		mtx_lock(&pr->pr_mtx);
@@ -2414,6 +2414,11 @@
 		if (pr->pr_cpuset != NULL)
 			cpuset_rel(pr->pr_cpuset);
 		osd_jail_exit(pr);
+		for (i = 0; i < HRL_RESOURCE_MAX; i++) {
+			if (pr->pr_accounting.ha_resources[i] != 0)
+				printf("prison_deref: resource %d = %lld\n",
+				    i, pr->pr_accounting.ha_resources[i]);
+		}
 		free(pr, M_PRISON);
 
 		/* Removing a prison frees a reference on its parent. */

==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_resource.c#8 (text+ko) ====

@@ -1352,7 +1352,7 @@
 uifree(uip)
 	struct uidinfo *uip;
 {
-	int old;
+	int old, i;
 
 	/* Prepare for optimal case. */
 	old = uip->ui_ref;
@@ -1370,6 +1370,12 @@
 		if (uip->ui_proccnt != 0)
 			printf("freeing uidinfo: uid = %d, proccnt = %ld\n",
 			    uip->ui_uid, uip->ui_proccnt);
+		for (i = 0; i < HRL_RESOURCE_MAX; i++) {
+			if (uip->ui_accounting.ha_resources[i] != 0)
+				printf("uifree: freeing uidinfo: uid = %d, "
+				    "resource %d = %lld \n", uip->ui_uid, i,
+				    uip->ui_accounting.ha_resources[i]);
+		}
 		free(uip, M_UIDINFO);
 		return;
 	}
@@ -1497,7 +1503,7 @@
 gifree(gip)
 	struct gidinfo *gip;
 {
-	int old;
+	int old, i;
 
 	/* Prepare for optimal case. */
 	old = gip->gi_ref;
@@ -1509,6 +1515,12 @@
 	if (refcount_release(&gip->gi_ref)) {
 		LIST_REMOVE(gip, gi_hash);
 		rw_wunlock(&gihashtbl_lock);
+		for (i = 0; i < HRL_RESOURCE_MAX; i++) {
+			if (gip->gi_accounting.ha_resources[i] != 0)
+				printf("gifree: freeing gidinfo: gid = %d, "
+				    "resource %d = %lld \n", gip->gi_gid, i,
+				    gip->gi_accounting.ha_resources[i]);
+		}
 		free(gip, M_GIDINFO);
 		return;
 	}


More information about the p4-projects mailing list