PERFORCE change 187637 for review
Edward Tomasz Napierala
trasz at FreeBSD.org
Sun Jan 9 12:42:04 UTC 2011
http://p4web.freebsd.org/@@187637?ac=10
Change 187637 by trasz at trasz_victim on 2011/01/09 12:41:43
Implement dampening. This breaks %CPU horribly, this will
be fixed soon.
Affected files ...
.. //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#49 edit
Differences ...
==== //depot/projects/soc2009/trasz_limits/sys/kern/kern_container.c#49 (text+ko) ====
@@ -159,6 +159,17 @@
}
}
+static int
+container_resource_dampened(int resource)
+{
+ switch (resource) {
+ case RUSAGE_PCTCPU:
+ return (1);
+ default:
+ return (0);
+ }
+}
+
static void
container_add(struct container *dest, const struct container *src)
{
@@ -189,7 +200,8 @@
* Update resource usage in dest.
*/
for (i = 0; i <= RUSAGE_MAX; i++) {
- if (!container_resource_sloppy(i)) {
+ if (!container_resource_sloppy(i) &&
+ !container_resource_dampened(i)) {
KASSERT(dest->c_resources[i] >= 0,
("resource usage propagation meltdown: dest < 0"));
KASSERT(src->c_resources[i] >= 0,
@@ -199,7 +211,7 @@
}
if (container_resource_reclaimable(i)) {
dest->c_resources[i] -= src->c_resources[i];
- if (container_resource_sloppy(i) && dest->c_resources[i] < 0)
+ if (dest->c_resources[i] < 0)
dest->c_resources[i] = 0;
}
}
@@ -230,8 +242,11 @@
for (i = 0; i <= RUSAGE_MAX; i++) {
if (container_resource_sloppy(i))
continue;
- KASSERT(container->c_resources[i] == 0 ||
- !container_resource_reclaimable(i),
+ if (!container_resource_reclaimable(i))
+ continue;
+ if (container_resource_dampened(i))
+ continue;
+ KASSERT(container->c_resources[i] == 0,
("destroying non-empty container: "
"%ju allocated for resource %d\n",
container->c_resources[i], i));
@@ -261,8 +276,12 @@
KASSERT(container != NULL, ("NULL container"));
container->c_resources[resource] += amount;
- if (container_resource_sloppy(resource) && container->c_resources[resource] < 0)
+ if (container->c_resources[resource] < 0) {
+ KASSERT(container_resource_sloppy(resource) ||
+ container_resource_dampened(resource),
+ ("container_alloc_resource: usage < 0"));
container->c_resources[resource] = 0;
+ }
}
/*
@@ -587,7 +606,6 @@
/*
* XXX: Free this some other way.
*/
- rusage_set(p, RUSAGE_PCTCPU, 0);
rusage_set(p, RUSAGE_FSIZE, 0);
rusage_set(p, RUSAGE_NPTS, 0);
rusage_set(p, RUSAGE_NTHR, 0);
@@ -673,6 +691,31 @@
}
}
+static int
+container_dampen_callback(struct container *container, void *arg2, void *arg3)
+{
+ int orig, diff, hz;
+
+ hz = *(int *)arg2;
+
+ mtx_lock(&container_lock);
+ orig = container->c_resources[RUSAGE_PCTCPU];
+ KASSERT(orig >= 0, ("container_dampen_callback: orig < 0"));
+ if (orig == 0) {
+ mtx_unlock(&container_lock);
+ return (0);
+ }
+ diff = orig / 10;
+ if (diff == 0)
+ diff = 1;
+ container->c_resources[RUSAGE_PCTCPU] -= diff;
+ KASSERT(container->c_resources[RUSAGE_PCTCPU] >= 0,
+ ("container_dampen_callback: result < 0"));
+ mtx_unlock(&container_lock);
+
+ return (0);
+}
+
static void
containerd(void)
{
@@ -683,6 +726,11 @@
uint64_t pctcpu_limit;
for (;;) {
+ loginclass_container_foreach(container_dampen_callback, &hz,
+ NULL);
+ ui_container_foreach(container_dampen_callback, &hz, NULL);
+ prison_container_foreach(container_dampen_callback, &hz, NULL);
+
sx_slock(&allproc_lock);
FOREACH_PROC_IN_SYSTEM(p) {
pctcpu_limit = rusage_get_limit(p, RUSAGE_PCTCPU);
More information about the p4-projects
mailing list