diff options
author | trasz <trasz@FreeBSD.org> | 2012-11-15 14:11:34 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2012-11-15 14:11:34 +0000 |
commit | ec6f935202f8a780e6822d0c512d1e7dfeb57a19 (patch) | |
tree | ba0b0eb49ed4e46e7213e128a2624aba0ef5f170 | |
parent | f2dcd36473bcb3e2c3d450280319f4bdfd1c9943 (diff) | |
download | FreeBSD-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
-rw-r--r-- | sys/kern/kern_racct.c | 5 |
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; } |