summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPoul-Henning Kamp <phk@FreeBSD.org>1999-11-29 11:29:04 +0000
committerPoul-Henning Kamp <phk@FreeBSD.org>1999-11-29 11:29:04 +0000
commit8f04f6c729c7859869de928d7c592d0a6fc72700 (patch)
treec02d9de311eee0fa512e7e3ee082476d5cd5ab67
parentab1c0de5edf8ed28315d8e8cd3d9a18c79647e0d (diff)
Notes
-rw-r--r--sys/kern/kern_resource.c10
-rw-r--r--sys/kern/kern_synch.c11
2 files changed, 17 insertions, 4 deletions
diff --git a/sys/kern/kern_resource.c b/sys/kern/kern_resource.c
index fde934e96169..495175ed935b 100644
--- a/sys/kern/kern_resource.c
+++ b/sys/kern/kern_resource.c
@@ -49,6 +49,7 @@
#include <sys/resourcevar.h>
#include <sys/malloc.h>
#include <sys/proc.h>
+#include <sys/time.h>
#include <vm/vm.h>
#include <vm/vm_param.h>
@@ -519,8 +520,13 @@ calcru(p, up, sp, ip)
* quantum, which is much greater than the sampling error.
*/
microuptime(&tv);
- tu += (tv.tv_usec - switchtime.tv_usec) +
- (tv.tv_sec - switchtime.tv_sec) * (int64_t)1000000;
+ if (timevalcmp(&tv, &switchtime, <))
+ printf("microuptime() went backwards (%ld.%06ld -> %ld,%06ld)\n",
+ switchtime.tv_sec, switchtime.tv_usec,
+ tv.tv_sec, tv.tv_usec);
+ else
+ tu += (tv.tv_usec - switchtime.tv_usec) +
+ (tv.tv_sec - switchtime.tv_sec) * (int64_t)1000000;
}
ptu = p->p_stats->p_uu + p->p_stats->p_su + p->p_stats->p_iu;
if (tu < ptu || (int64_t)tu < 0) {
diff --git a/sys/kern/kern_synch.c b/sys/kern/kern_synch.c
index 597f5e60ffcc..16699e06bd7e 100644
--- a/sys/kern/kern_synch.c
+++ b/sys/kern/kern_synch.c
@@ -791,8 +791,15 @@ mi_switch()
* process was running, and add that to its total so far.
*/
microuptime(&new_switchtime);
- p->p_runtime += (new_switchtime.tv_usec - switchtime.tv_usec) +
- (new_switchtime.tv_sec - switchtime.tv_sec) * (int64_t)1000000;
+ if (timevalcmp(&new_switchtime, &switchtime, <)) {
+ printf("microuptime() went backwards (%ld.%06ld -> %ld,%06ld)\n",
+ switchtime.tv_sec, switchtime.tv_usec,
+ new_switchtime.tv_sec, new_switchtime.tv_usec);
+ new_switchtime = switchtime;
+ } else {
+ p->p_runtime += (new_switchtime.tv_usec - switchtime.tv_usec) +
+ (new_switchtime.tv_sec - switchtime.tv_sec) * (int64_t)1000000;
+ }
/*
* Check if the process exceeds its cpu resource allocation.