Module Name: src
Committed By: pooka
Date: Sun Apr 26 20:41:24 UTC 2009
Modified Files:
src/sys/rump/librump/rumpkern: emul.c intr.c rump_private.h
Log Message:
Fix getnano/microuptime to report actual uptime.
To generate a diff of this commit:
cvs rdiff -u -r1.86 -r1.87 src/sys/rump/librump/rumpkern/emul.c
cvs rdiff -u -r1.15 -r1.16 src/sys/rump/librump/rumpkern/intr.c
cvs rdiff -u -r1.26 -r1.27 src/sys/rump/librump/rumpkern/rump_private.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/rump/librump/rumpkern/emul.c
diff -u src/sys/rump/librump/rumpkern/emul.c:1.86 src/sys/rump/librump/rumpkern/emul.c:1.87
--- src/sys/rump/librump/rumpkern/emul.c:1.86 Sun Apr 26 14:37:03 2009
+++ src/sys/rump/librump/rumpkern/emul.c Sun Apr 26 20:41:24 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: emul.c,v 1.86 2009/04/26 14:37:03 pgoyette Exp $ */
+/* $NetBSD: emul.c,v 1.87 2009/04/26 20:41:24 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.86 2009/04/26 14:37:03 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.87 2009/04/26 20:41:24 pooka Exp $");
#include <sys/param.h>
#include <sys/malloc.h>
@@ -243,25 +243,17 @@
void
getnanouptime(struct timespec *ts)
{
- uint64_t sec, nsec;
- int error;
- /* XXX: this is wrong, does not report *uptime* */
- rumpuser_gettime(&sec, &nsec, &error);
- ts->tv_sec = sec;
- ts->tv_nsec = nsec;
+ rump_getuptime(ts);
}
void
getmicrouptime(struct timeval *tv)
{
- uint64_t sec, nsec;
- int error;
+ struct timespec ts;
- /* XXX: this is wrong, does not report *uptime* */
- rumpuser_gettime(&sec, &nsec, &error);
- tv->tv_sec = sec;
- tv->tv_usec = nsec / 1000;
+ getnanouptime(&ts);
+ TIMESPEC_TO_TIMEVAL(tv, &ts);
}
void
Index: src/sys/rump/librump/rumpkern/intr.c
diff -u src/sys/rump/librump/rumpkern/intr.c:1.15 src/sys/rump/librump/rumpkern/intr.c:1.16
--- src/sys/rump/librump/rumpkern/intr.c:1.15 Fri Feb 27 15:15:19 2009
+++ src/sys/rump/librump/rumpkern/intr.c Sun Apr 26 20:41:24 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.c,v 1.15 2009/02/27 15:15:19 pooka Exp $ */
+/* $NetBSD: intr.c,v 1.16 2009/04/26 20:41:24 pooka Exp $ */
/*
* Copyright (c) 2008 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.15 2009/02/27 15:15:19 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.16 2009/04/26 20:41:24 pooka Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
@@ -89,19 +89,31 @@
/* rumpuser structures since we call rumpuser interfaces directly */
static struct rumpuser_cv *clockcv;
static struct rumpuser_mtx *clockmtx;
-static struct timespec rump_clock;
+static struct timespec clockbase, clockup;
+static unsigned clkgen;
void
-rump_gettime(struct timespec *ts)
+rump_getuptime(struct timespec *ts)
{
- struct timespec attempt;
+ int startgen, i;
- /* XXX: this is completely bogus */
do {
- attempt = rump_clock;
- } while (memcmp(&attempt, &rump_clock, sizeof(struct timespec)) != 0);
+ startgen = clkgen;
+ if (__predict_false(i++ > 10)) {
+ yield();
+ i = 0;
+ }
+ *ts = clockup;
+ } while (startgen != clkgen || clkgen % 2 != 0);
+}
+
+void
+rump_gettime(struct timespec *ts)
+{
+ struct timespec ts_up;
- *ts = attempt;
+ rump_getuptime(&ts_up);
+ timespecadd(&clockbase, &ts_up, ts);
}
/*
@@ -110,15 +122,15 @@
static void
doclock(void *noarg)
{
- struct timespec tick;
+ struct timespec tick, curtime;
uint64_t sec, nsec;
- static int ticks = 0;
+ int ticks = 0, error;
extern int hz;
- int error;
rumpuser_gettime(&sec, &nsec, &error);
- rump_clock.tv_sec = sec;
- rump_clock.tv_nsec = nsec;
+ clockbase.tv_sec = sec;
+ clockbase.tv_nsec = nsec;
+ curtime = clockbase;
tick.tv_sec = 0;
tick.tv_nsec = 1000000000/hz;
@@ -133,11 +145,15 @@
ticks = 0;
}
- /* wait until the next tick */
+ /* wait until the next tick. XXX: what if the clock changes? */
while (rumpuser_cv_timedwait(clockcv, clockmtx,
- &rump_clock) != EWOULDBLOCK)
+ &curtime) != EWOULDBLOCK)
continue;
- timespecadd(&rump_clock, &tick, &rump_clock);
+
+ clkgen++;
+ timespecadd(&clockup, &tick, &clockup);
+ clkgen++;
+ timespecadd(&clockup, &clockbase, &curtime);
}
}
Index: src/sys/rump/librump/rumpkern/rump_private.h
diff -u src/sys/rump/librump/rumpkern/rump_private.h:1.26 src/sys/rump/librump/rumpkern/rump_private.h:1.27
--- src/sys/rump/librump/rumpkern/rump_private.h:1.26 Mon Apr 6 20:41:29 2009
+++ src/sys/rump/librump/rumpkern/rump_private.h Sun Apr 26 20:41:24 2009
@@ -1,4 +1,4 @@
-/* $NetBSD: rump_private.h,v 1.26 2009/04/06 20:41:29 pooka Exp $ */
+/* $NetBSD: rump_private.h,v 1.27 2009/04/26 20:41:24 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -62,6 +62,7 @@
void rumpvm_flushva(struct uvm_object *);
void rump_gettime(struct timespec *);
+void rump_getuptime(struct timespec *);
lwpid_t rump_nextlid(void);