diff options
author | tegge <tegge@FreeBSD.org> | 2001-02-22 19:50:37 +0000 |
---|---|---|
committer | tegge <tegge@FreeBSD.org> | 2001-02-22 19:50:37 +0000 |
commit | b3140862f54f556a07bb57298f0327c9b95770fa (patch) | |
tree | f1ca938763e2df7f60784b681f858c0ee2a4f244 /sys/kern/kern_resource.c | |
parent | ed410f8195c01d68645b4a52e9bafa354044106f (diff) | |
download | FreeBSD-src-b3140862f54f556a07bb57298f0327c9b95770fa.zip FreeBSD-src-b3140862f54f556a07bb57298f0327c9b95770fa.tar.gz |
Protect update of the per processor switchtime variable against
interrupts.
Protect usage of the per processor switchtime variable against
interrupts in calcru().
This seem to eliminate the "microuptime() went backwards" warnings.
Diffstat (limited to 'sys/kern/kern_resource.c')
-rw-r--r-- | sys/kern/kern_resource.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c index 73ffb03..b872acd 100644 --- a/sys/kern/kern_resource.c +++ b/sys/kern/kern_resource.c @@ -567,19 +567,27 @@ calcru(p, up, sp, ip) tu = p->p_runtime; if (p == curproc) { + struct timeval old_switchtime; /* * Adjust for the current time slice. This is actually fairly * important since the error here is on the order of a time * quantum, which is much greater than the sampling error. */ - microuptime(&tv); - if (timevalcmp(&tv, PCPU_PTR(switchtime), <)) + do { + old_switchtime = PCPU_GET(switchtime); + microuptime(&tv); + } while (old_switchtime.tv_sec != + PCPU_GET(switchtime.tv_sec) || + old_switchtime.tv_usec != + PCPU_GET(switchtime.tv_usec)); + if (timevalcmp(&tv, &old_switchtime, <)) printf("microuptime() went backwards (%ld.%06ld -> %ld.%06ld)\n", - PCPU_GET(switchtime.tv_sec), PCPU_GET(switchtime.tv_usec), - tv.tv_sec, tv.tv_usec); + old_switchtime.tv_sec, + old_switchtime.tv_usec, + tv.tv_sec, tv.tv_usec); else - tu += (tv.tv_usec - PCPU_GET(switchtime.tv_usec)) + - (tv.tv_sec - PCPU_GET(switchtime.tv_sec)) * + tu += (tv.tv_usec - old_switchtime.tv_usec) + + (tv.tv_sec - old_switchtime.tv_sec) * (int64_t)1000000; } ptu = p->p_uu + p->p_su + p->p_iu; |