diff options
author | trasz <trasz@FreeBSD.org> | 2012-11-13 11:29:08 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2012-11-13 11:29:08 +0000 |
commit | 974b82f77de16221515a7323e98f7e2514ff4e13 (patch) | |
tree | e8f8c455c5ebb300ae9b90e2b60d0ebbcce7ee18 /sys/kern/kern_racct.c | |
parent | c9968192edf76254b6af4a2c3b6710138cce4952 (diff) | |
download | FreeBSD-src-974b82f77de16221515a7323e98f7e2514ff4e13.zip FreeBSD-src-974b82f77de16221515a7323e98f7e2514ff4e13.tar.gz |
Don't divide by zero.
Tested by: swills
Diffstat (limited to 'sys/kern/kern_racct.c')
-rw-r--r-- | sys/kern/kern_racct.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/sys/kern/kern_racct.c b/sys/kern/kern_racct.c index df1c457..4532f217 100644 --- a/sys/kern/kern_racct.c +++ b/sys/kern/kern_racct.c @@ -921,9 +921,12 @@ racct_proc_exit(struct proc *p) #endif microuptime(&wallclock); timevalsub(&wallclock, &p->p_stats->p_start); - pct_estimate = (1000000 * runtime * 100) / - ((uint64_t)wallclock.tv_sec * 1000000 + - wallclock.tv_usec); + if (wallclock.tv_sec > 0 || wallclock.tv_usec > 0) { + pct_estimate = (1000000 * runtime * 100) / + ((uint64_t)wallclock.tv_sec * 1000000 + + wallclock.tv_usec); + } else + pct_estimate = 0; pct = racct_getpcpu(p, pct_estimate); mtx_lock(&racct_lock); @@ -1136,9 +1139,12 @@ racctd(void) runtime = p->p_prev_runtime; #endif p->p_prev_runtime = runtime; - pct_estimate = (1000000 * runtime * 100) / - ((uint64_t)wallclock.tv_sec * 1000000 + - wallclock.tv_usec); + if (wallclock.tv_sec > 0 || wallclock.tv_usec > 0) { + pct_estimate = (1000000 * runtime * 100) / + ((uint64_t)wallclock.tv_sec * 1000000 + + wallclock.tv_usec); + } else + pct_estimate = 0; pct = racct_getpcpu(p, pct_estimate); mtx_lock(&racct_lock); racct_set_force_locked(p, RACCT_PCTCPU, pct); |