summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_racct.c
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2012-11-15 14:11:34 +0000
committertrasz <trasz@FreeBSD.org>2012-11-15 14:11:34 +0000
commitec6f935202f8a780e6822d0c512d1e7dfeb57a19 (patch)
treeba0b0eb49ed4e46e7213e128a2624aba0ef5f170 /sys/kern/kern_racct.c
parentf2dcd36473bcb3e2c3d450280319f4bdfd1c9943 (diff)
downloadFreeBSD-src-ec6f935202f8a780e6822d0c512d1e7dfeb57a19.zip
FreeBSD-src-ec6f935202f8a780e6822d0c512d1e7dfeb57a19.tar.gz
Fix kassert that's not really valid for %CPU accounting. The problem
here is race between decaying the resource usage in containers, and updating per-process usage; basically, the former may cause per-container usage to get smaller than per-process usage. Submitted by: Rudo Tomori
Diffstat (limited to 'sys/kern/kern_racct.c')
-rw-r--r--sys/kern/kern_racct.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/sys/kern/kern_racct.c b/sys/kern/kern_racct.c
index 4532f217..49be29d 100644
--- a/sys/kern/kern_racct.c
+++ b/sys/kern/kern_racct.c
@@ -403,7 +403,7 @@ racct_sub_racct(struct racct *dest, const struct racct *src)
* Update resource usage in dest.
*/
for (i = 0; i <= RACCT_MAX; i++) {
- if (!RACCT_IS_SLOPPY(i)) {
+ if (!RACCT_IS_SLOPPY(i) && !RACCT_IS_DECAYING(i)) {
KASSERT(dest->r_resources[i] >= 0,
("racct propagation meltdown: dest < 0"));
KASSERT(src->r_resources[i] >= 0,
@@ -414,7 +414,8 @@ racct_sub_racct(struct racct *dest, const struct racct *src)
if (RACCT_CAN_DROP(i)) {
dest->r_resources[i] -= src->r_resources[i];
if (dest->r_resources[i] < 0) {
- KASSERT(RACCT_IS_SLOPPY(i),
+ KASSERT(RACCT_IS_SLOPPY(i) ||
+ RACCT_IS_DECAYING(i),
("racct_sub_racct: usage < 0"));
dest->r_resources[i] = 0;
}
OpenPOWER on IntegriCloud