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; } }