PERFORCE change 180757 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Sun Jul 11 13:00:11 UTC 2010
http://p4web.freebsd.org/@@180757?ac=10
Change 180757 by trasz at 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;
}
}
More information about the p4-projects
mailing list