summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@felloff.net>2015-06-12 14:28:31 +0200
committercinap_lenrek <cinap_lenrek@felloff.net>2015-06-12 14:28:31 +0200
commit34ae4649cc91bf32cd602558a4e953bc3fb8777a (patch)
tree7a17fcf1756f48324b2a02426e1b03b3710aa848
parent2112ad6793fbf86600d1a4264197766f71808c45 (diff)
downloadplan9front-34ae4649cc91bf32cd602558a4e953bc3fb8777a.tar.xz
kernel: fix accounttime() for HZ >= 1000
"milli-CPU's" is too low resolution for the decaying load average calculation when HZ >= 1000.
-rw-r--r--sys/src/9/port/proc.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/sys/src/9/port/proc.c b/sys/src/9/port/proc.c
index 111fec5fa..766ab52b9 100644
--- a/sys/src/9/port/proc.c
+++ b/sys/src/9/port/proc.c
@@ -1602,14 +1602,14 @@ accounttime(void)
n = perfticks();
per = n - m->perf.last;
m->perf.last = n;
- per = (m->perf.period*(HZ-1) + per)/HZ;
+ per = ((uvlong)m->perf.period*(HZ-1) + per)/HZ;
if(per != 0)
m->perf.period = per;
- m->perf.avg_inidle = (m->perf.avg_inidle*(HZ-1)+m->perf.inidle)/HZ;
+ m->perf.avg_inidle = ((uvlong)m->perf.avg_inidle*(HZ-1)+m->perf.inidle)/HZ;
m->perf.inidle = 0;
- m->perf.avg_inintr = (m->perf.avg_inintr*(HZ-1)+m->perf.inintr)/HZ;
+ m->perf.avg_inintr = ((uvlong)m->perf.avg_inintr*(HZ-1)+m->perf.inintr)/HZ;
m->perf.inintr = 0;
/* only one processor gets to compute system load averages */
@@ -1627,8 +1627,9 @@ accounttime(void)
*/
n = nrun;
nrun = 0;
- n = (nrdy+n)*1000;
- m->load = (m->load*(HZ-1)+n)/HZ;
+ n = (nrdy+n)*1000*100;
+ load = ((uvlong)load*(HZ-1)+n)/HZ;
+ m->load = load/100;
}
int