From owner-p4-projects@FreeBSD.ORG  Sun Jul 11 13:00:11 2010
Return-Path: <owner-p4-projects@FreeBSD.ORG>
Delivered-To: p4-projects@freebsd.org
Received: by hub.freebsd.org (Postfix, from userid 32767)
	id 3FD881065672; Sun, 11 Jul 2010 13:00:11 +0000 (UTC)
Delivered-To: perforce@freebsd.org
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id E01C3106566C
	for <perforce@freebsd.org>; Sun, 11 Jul 2010 13:00:10 +0000 (UTC)
	(envelope-from trasz@freebsd.org)
Received: from repoman.freebsd.org (repoman.freebsd.org
	[IPv6:2001:4f8:fff6::29])
	by mx1.freebsd.org (Postfix) with ESMTP id B26A98FC1B
	for <perforce@freebsd.org>; Sun, 11 Jul 2010 13:00:10 +0000 (UTC)
Received: from repoman.freebsd.org (localhost [127.0.0.1])
	by repoman.freebsd.org (8.14.3/8.14.3) with ESMTP id o6BD0A0S042508
	for <perforce@freebsd.org>; Sun, 11 Jul 2010 13:00:10 GMT
	(envelope-from trasz@freebsd.org)
Received: (from perforce@localhost)
	by repoman.freebsd.org (8.14.3/8.14.3/Submit) id o6BD0ASd042506
	for perforce@freebsd.org; Sun, 11 Jul 2010 13:00:10 GMT
	(envelope-from trasz@freebsd.org)
Date: Sun, 11 Jul 2010 13:00:10 GMT
Message-Id: <201007111300.o6BD0ASd042506@repoman.freebsd.org>
X-Authentication-Warning: repoman.freebsd.org: perforce set sender to
	trasz@freebsd.org using -f
From: Edward Tomasz Napierala <trasz@FreeBSD.org>
To: Perforce Change Reviews <perforce@freebsd.org>
Precedence: bulk
Cc: 
Subject: PERFORCE change 180757 for review
X-BeenThere: p4-projects@freebsd.org
X-Mailman-Version: 2.1.5
List-Id: p4 projects tree changes <p4-projects.freebsd.org>
List-Unsubscribe: <http://lists.freebsd.org/mailman/listinfo/p4-projects>,
	<mailto:p4-projects-request@freebsd.org?subject=unsubscribe>
List-Archive: <http://lists.freebsd.org/pipermail/p4-projects>
List-Post: <mailto:p4-projects@freebsd.org>
List-Help: <mailto:p4-projects-request@freebsd.org?subject=help>
List-Subscribe: <http://lists.freebsd.org/mailman/listinfo/p4-projects>,
	<mailto:p4-projects-request@freebsd.org?subject=subscribe>
X-List-Received-Date: Sun, 11 Jul 2010 13:00:11 -0000

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

Change 180757 by trasz@trasz_victim on 2010/07/11 13:00:03

	Properly handle joining and leaving containers that have parents.

Affected files ...

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

Differences ...

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

@@ -62,40 +62,57 @@
 static struct mtx container_lock;
 MTX_SYSINIT(container_lock, &container_lock, "container lock", MTX_DEF);
 
+static void container_sub(struct container *dest, const struct container *src);
+
 static int
 container_add(struct container *dest, const struct container *src)
 {
-	int i;
+	int i, error;
 
 	mtx_assert(&container_lock, MA_OWNED);
 
+	/*
+	 * Update resource usage in dest's parents.
+	 */
+	for (i = 0; i <= CONTAINER_PARENTS_MAX; i++) {
+		if (dest->c_parents[i] == NULL)
+			continue;
+		error = container_add(dest->c_parents[i], src);
+		if (error) {
+			for (i--; i >= 0; i--)
+				container_sub(dest->c_parents[i], src);
+			return (error);
+		}
+	}
+
+	/*
+	 * Update resource usage in dest.
+	 */
 	for (i = 0; i <= RUSAGE_MAX; i++) {
 		KASSERT(dest->c_resources[i] >= 0,
 		    ("resource usage propagation meltdown: dest < 0"));
 		KASSERT(src->c_resources[i] >= 0,
 		    ("resource usage propagation meltdown: src < 0"));
 		/*
-		 * XXX: Container hierarchy!
-		 */
-		/*
 		 * XXX: Enforce limit here; if exceeded, undo everything
 		 *      and return error.
 		 */
 		dest->c_resources[i] += src->c_resources[i];
-		KASSERT(dest->c_resources[i] >= 0,
-		    ("resource usage propagation meltdown: dest < 0 after addition"));
 	}
 
 	return (0);
 }
 
 static void
-container_subtract(struct container *dest, const struct container *src)
+container_sub(struct container *dest, const struct container *src)
 {
 	int i;
 
 	mtx_assert(&container_lock, MA_OWNED);
 
+	/*
+	 * Update resource usage in dest.
+	 */
 	for (i = 0; i <= RUSAGE_MAX; i++) {
 		KASSERT(dest->c_resources[i] >= 0,
 		    ("resource usage propagation meltdown: dest < 0"));
@@ -104,11 +121,15 @@
 		KASSERT(src->c_resources[i] <= dest->c_resources[i],
 		    ("resource usage propagation meltdown: src > dest"));
 		dest->c_resources[i] -= src->c_resources[i];
-		/*
-		 * XXX: Container hierarchy!
-		 */
-		KASSERT(dest->c_resources[i] >= 0,
-		    ("resource usage propagation meltdown: dest < 0 after subtraction"));
+	}
+
+	/*
+	 * Update resource usage in dest's parents.
+	 */
+	for (i = 0; i <= CONTAINER_PARENTS_MAX; i++) {
+		if (dest->c_parents[i] == NULL)
+			continue;
+		container_sub(dest->c_parents[i], src);
 	}
 }
 
@@ -159,7 +180,7 @@
 
 	for (i = 0; i <= CONTAINER_PARENTS_MAX; i++) {
 		if (child->c_parents[i] == parent) {
-			container_subtract(parent, child);
+			container_sub(parent, child);
 			child->c_parents[i] = NULL;
 			return;
 		}
@@ -187,7 +208,7 @@
 	for (i = 0; i <= CONTAINER_PARENTS_MAX; i++) {
 		if (child->c_parents[i] == NULL)
 			continue;
-		container_subtract(child->c_parents[i], child);
+		container_sub(child->c_parents[i], child);
 		child->c_parents[i] = NULL;
 	}
 }