PERFORCE change 187530 for review

Edward Tomasz Napierala trasz at FreeBSD.org
Thu Jan 6 10:44:07 UTC 2011


http://p4web.freebsd.org/@@187530?ac=10

Change 187530 by trasz at trasz_victim on 2011/01/06 10:43:42

	Get rid of recursive mutex.

Affected files ...

.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#48 edit

Differences ...

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

@@ -63,9 +63,11 @@
 #ifdef CONTAINERS
 
 static struct mtx container_lock;
-MTX_SYSINIT(container_lock, &container_lock, "container lock", MTX_RECURSE);
+MTX_SYSINIT(container_lock, &container_lock, "container lock", MTX_DEF);
 
 static void container_sub(struct container *dest, const struct container *src);
+static void rusage_sub_cred_locked(struct ucred *cred, int resource, uint64_t amount);
+static void rusage_add_cred_locked(struct ucred *cred, int resource, uint64_t amount);
 
 SDT_PROVIDER_DEFINE(container);
 SDT_PROBE_DEFINE3(container, kernel, rusage, add, add, "struct proc *", "int", "uint64_t");
@@ -292,20 +294,14 @@
 	}
 #endif
 	container_alloc_resource(&p->p_container, resource, amount);
+	rusage_add_cred_locked(p->p_ucred, resource, amount);
 	mtx_unlock(&container_lock);
-	rusage_add_cred(p->p_ucred, resource, amount);
 
 	return (0);
 }
 
-/*
- * Increase allocation of 'resource' by 'amount' for credential 'cred'.  Doesn't
- * check for limits and never fails.
- *
- * XXX: Shouldn't this ever return an error?
- */
-void
-rusage_add_cred(struct ucred *cred, int resource, uint64_t amount)
+static void
+rusage_add_cred_locked(struct ucred *cred, int resource, uint64_t amount)
 {
 	struct prison *pr;
 
@@ -314,11 +310,24 @@
 	KASSERT(amount >= 0, ("rusage_add_cred: invalid amount for resource %d: %ju",
 	    resource, amount));
 
-	mtx_lock(&container_lock);
 	container_alloc_resource(&cred->cr_ruidinfo->ui_container, resource, amount);
 	for (pr = cred->cr_prison; pr != NULL; pr = pr->pr_parent)
 		container_alloc_resource(&pr->pr_container, resource, amount);
 	container_alloc_resource(&cred->cr_loginclass->lc_container, resource, amount);
+}
+
+/*
+ * Increase allocation of 'resource' by 'amount' for credential 'cred'.  Doesn't
+ * check for limits and never fails.
+ *
+ * XXX: Shouldn't this ever return an error?
+ */
+void
+rusage_add_cred(struct ucred *cred, int resource, uint64_t amount)
+{
+
+	mtx_lock(&container_lock);
+	rusage_add_cred_locked(cred, resource, amount);
 	mtx_unlock(&container_lock);
 }
 
@@ -376,13 +385,10 @@
 	}
 #endif
 	container_alloc_resource(&p->p_container, resource, diff);
-	/*
-	 * XXX: Mutex recursion.
-	 */
 	if (diff > 0)
-		rusage_add_cred(p->p_ucred, resource, diff);
+		rusage_add_cred_locked(p->p_ucred, resource, diff);
 	else if (diff < 0)
-		rusage_sub_cred(p->p_ucred, resource, -diff);
+		rusage_sub_cred_locked(p->p_ucred, resource, -diff);
 
 	return (0);
 }
@@ -421,11 +427,11 @@
 	mtx_lock(&container_lock);
 	diff = amount - p->p_container.c_resources[resource];
 	container_alloc_resource(&p->p_container, resource, diff);
-	mtx_unlock(&container_lock);
 	if (diff > 0)
-		rusage_add_cred(p->p_ucred, resource, diff);
+		rusage_add_cred_locked(p->p_ucred, resource, diff);
 	else if (diff < 0)
-		rusage_sub_cred(p->p_ucred, resource, -diff);
+		rusage_sub_cred_locked(p->p_ucred, resource, -diff);
+	mtx_unlock(&container_lock);
 }
 
 /*
@@ -468,15 +474,12 @@
 	    p->p_container.c_resources[resource], p->p_comm, p->p_pid));
 
 	container_alloc_resource(&p->p_container, resource, -amount);
+	rusage_sub_cred_locked(p->p_ucred, resource, amount);
 	mtx_unlock(&container_lock);
-	rusage_sub_cred(p->p_ucred, resource, amount);
 }
 
-/*
- * Decrease allocation of 'resource' by 'amount' for credential 'cred'.
- */
-void
-rusage_sub_cred(struct ucred *cred, int resource, uint64_t amount)
+static void
+rusage_sub_cred_locked(struct ucred *cred, int resource, uint64_t amount)
 {
 	struct prison *pr;
 
@@ -489,11 +492,21 @@
 	    ("rusage_sub_cred: called for non-reclaimable resource %d", resource));
 #endif
 
-	mtx_lock(&container_lock);
 	container_alloc_resource(&cred->cr_ruidinfo->ui_container, resource, -amount);
 	for (pr = cred->cr_prison; pr != NULL; pr = pr->pr_parent)
 		container_alloc_resource(&pr->pr_container, resource, -amount);
 	container_alloc_resource(&cred->cr_loginclass->lc_container, resource, -amount);
+}
+
+/*
+ * Decrease allocation of 'resource' by 'amount' for credential 'cred'.
+ */
+void
+rusage_sub_cred(struct ucred *cred, int resource, uint64_t amount)
+{
+
+	mtx_lock(&container_lock);
+	rusage_sub_cred_locked(cred, resource, amount);
 	mtx_unlock(&container_lock);
 }
 


More information about the p4-projects mailing list