aboutsummaryrefslogtreecommitdiff
path: root/sys/kern/kern_racct.c
diff options
context:
space:
mode:
authorEdward Tomasz Napierala <trasz@FreeBSD.org>2012-11-15 14:11:34 +0000
committerEdward Tomasz Napierala <trasz@FreeBSD.org>2012-11-15 14:11:34 +0000
commit84c9193ba0c8a2f3a6b8abd3d3f5159b86868909 (patch)
treeba0b0eb49ed4e46e7213e128a2624aba0ef5f170 /sys/kern/kern_racct.c
parent2fd4047f32d9bc3369e91bcd38c2a6eeb571f956 (diff)
downloadsrc-84c9193ba0c8a2f3a6b8abd3d3f5159b86868909.tar.gz
src-84c9193ba0c8a2f3a6b8abd3d3f5159b86868909.zip
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
Notes
Notes: svn path=/head/; revision=243070
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 4532f21731c6..49be29d85c15 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;
}