Module Name: src
Committed By: pooka
Date: Wed Apr 14 10:27:53 UTC 2010
Modified Files:
src/sys/rump/librump/rumpkern: Makefile.rumpkern emul.c intr.c rump.c
Log Message:
Include kern_tc and use a timecounter driver instead of homerolled
kern_tc implementation.
To generate a diff of this commit:
cvs rdiff -u -r1.75 -r1.76 src/sys/rump/librump/rumpkern/Makefile.rumpkern
cvs rdiff -u -r1.124 -r1.125 src/sys/rump/librump/rumpkern/emul.c
cvs rdiff -u -r1.23 -r1.24 src/sys/rump/librump/rumpkern/intr.c
cvs rdiff -u -r1.159 -r1.160 src/sys/rump/librump/rumpkern/rump.c
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/Makefile.rumpkern
diff -u src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.75 src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.76
--- src/sys/rump/librump/rumpkern/Makefile.rumpkern:1.75 Mon Apr 12 22:17:23 2010
+++ src/sys/rump/librump/rumpkern/Makefile.rumpkern Wed Apr 14 10:27:53 2010
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.rumpkern,v 1.75 2010/04/12 22:17:23 pooka Exp $
+# $NetBSD: Makefile.rumpkern,v 1.76 2010/04/14 10:27:53 pooka Exp $
#
.include "${RUMPTOP}/Makefile.rump"
@@ -39,8 +39,8 @@
# sys/kern
SRCS+= init_sysctl_base.c kern_auth.c kern_descrip.c kern_event.c \
kern_hook.c kern_ksyms.c kern_malloc_stdtype.c kern_module.c \
- kern_mutex_obj.c kern_rate.c kern_stub.c kern_sysctl.c \
- kern_timeout.c kern_uidinfo.c param.c \
+ kern_mutex_obj.c kern_ntptime.c kern_rate.c kern_stub.c \
+ kern_sysctl.c kern_tc.c kern_timeout.c kern_uidinfo.c param.c \
sys_descrip.c sys_generic.c sys_pipe.c sys_select.c syscalls.c
# sys/kern subr (misc)
Index: src/sys/rump/librump/rumpkern/emul.c
diff -u src/sys/rump/librump/rumpkern/emul.c:1.124 src/sys/rump/librump/rumpkern/emul.c:1.125
--- src/sys/rump/librump/rumpkern/emul.c:1.124 Wed Mar 31 14:08:33 2010
+++ src/sys/rump/librump/rumpkern/emul.c Wed Apr 14 10:27:53 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: emul.c,v 1.124 2010/03/31 14:08:33 pooka Exp $ */
+/* $NetBSD: emul.c,v 1.125 2010/04/14 10:27:53 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.124 2010/03/31 14:08:33 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.125 2010/04/14 10:27:53 pooka Exp $");
#include <sys/param.h>
#include <sys/null.h>
@@ -62,8 +62,6 @@
#include "rump_private.h"
-time_t time_second = 1;
-
kmutex_t *proc_lock;
struct lwp lwp0;
struct vnode *rootvp;
@@ -112,6 +110,8 @@
kmutex_t tty_lock;
krwlock_t exec_lock;
+struct lwplist alllwp = LIST_HEAD_INITIALIZER(alllwp);
+
/* sparc doesn't sport constant page size */
#ifdef __sparc__
int nbpg = 4096;
@@ -124,73 +124,6 @@
FSCALE,
};
-void
-getnanouptime(struct timespec *ts)
-{
-
- rump_getuptime(ts);
-}
-
-void
-getmicrouptime(struct timeval *tv)
-{
- struct timespec ts;
-
- getnanouptime(&ts);
- TIMESPEC_TO_TIMEVAL(tv, &ts);
-}
-
-static void
-gettime(struct timespec *ts)
-{
- uint64_t sec, nsec;
- int error;
-
- rumpuser_gettime(&sec, &nsec, &error);
- ts->tv_sec = sec;
- ts->tv_nsec = nsec;
-}
-
-void
-nanotime(struct timespec *ts)
-{
-
- if (rump_threads) {
- rump_gettime(ts);
- } else {
- gettime(ts);
- }
-}
-
-/* hooray for mick, so what if I do */
-void
-getnanotime(struct timespec *ts)
-{
-
- nanotime(ts);
-}
-
-void
-microtime(struct timeval *tv)
-{
- struct timespec ts;
-
- if (rump_threads) {
- rump_gettime(&ts);
- TIMESPEC_TO_TIMEVAL(tv, &ts);
- } else {
- gettime(&ts);
- TIMESPEC_TO_TIMEVAL(tv, &ts);
- }
-}
-
-void
-getmicrotime(struct timeval *tv)
-{
-
- microtime(tv);
-}
-
struct proc *
p_find(pid_t pid, uint flags)
{
@@ -317,13 +250,6 @@
/* always sleepable, although we should improve this */
}
-void
-tc_setclock(const struct timespec *ts)
-{
-
- panic("%s: not implemented", __func__);
-}
-
int
proc_uidmatch(kauth_cred_t cred, kauth_cred_t target)
{
Index: src/sys/rump/librump/rumpkern/intr.c
diff -u src/sys/rump/librump/rumpkern/intr.c:1.23 src/sys/rump/librump/rumpkern/intr.c:1.24
--- src/sys/rump/librump/rumpkern/intr.c:1.23 Sat Dec 5 22:44:08 2009
+++ src/sys/rump/librump/rumpkern/intr.c Wed Apr 14 10:27:53 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: intr.c,v 1.23 2009/12/05 22:44:08 pooka Exp $ */
+/* $NetBSD: intr.c,v 1.24 2010/04/14 10:27:53 pooka Exp $ */
/*
* Copyright (c) 2008 Antti Kantee. All Rights Reserved.
@@ -26,13 +26,15 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.23 2009/12/05 22:44:08 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.24 2010/04/14 10:27:53 pooka Exp $");
#include <sys/param.h>
#include <sys/cpu.h>
+#include <sys/kernel.h>
#include <sys/kmem.h>
#include <sys/kthread.h>
#include <sys/intr.h>
+#include <sys/timetc.h>
#include <rump/rumpuser.h>
@@ -42,8 +44,6 @@
* Interrupt simulator. It executes hardclock() and softintrs.
*/
-time_t time_uptime = 0;
-
#define SI_MPSAFE 0x01
#define SI_ONLIST 0x02
#define SI_KILLME 0x04
@@ -67,51 +67,45 @@
static struct rumpuser_cv *clockcv;
static struct rumpuser_mtx *clockmtx;
static struct timespec clockbase, clockup;
-static unsigned clkgen;
kcondvar_t lbolt; /* Oh Kath Ra */
-void
-rump_getuptime(struct timespec *ts)
-{
- int startgen, i = 0;
-
- do {
- startgen = clkgen;
- if (__predict_false(i++ > 10)) {
- yield();
- i = 0;
- }
- *ts = clockup;
- } while (startgen != clkgen || clkgen % 2 != 0);
-}
+static u_int ticks;
-void
-rump_gettime(struct timespec *ts)
+static u_int
+rumptc_get(struct timecounter *tc)
{
- struct timespec ts_up;
- rump_getuptime(&ts_up);
- timespecadd(&clockbase, &ts_up, ts);
+ KASSERT(rump_threads);
+ return ticks;
}
+static struct timecounter rumptc = {
+ .tc_get_timecount = rumptc_get,
+ .tc_poll_pps = NULL,
+ .tc_counter_mask = ~0,
+ .tc_frequency = 0,
+ .tc_name = "rumpclk",
+ .tc_quality = 0,
+};
+
/*
* clock "interrupt"
*/
static void
doclock(void *noarg)
{
- struct timespec tick, curtime;
+ struct timespec thetick, curtime;
uint64_t sec, nsec;
- int ticks = 0, error;
+ int error;
extern int hz;
rumpuser_gettime(&sec, &nsec, &error);
clockbase.tv_sec = sec;
clockbase.tv_nsec = nsec;
curtime = clockbase;
- tick.tv_sec = 0;
- tick.tv_nsec = 1000000000/hz;
+ thetick.tv_sec = 0;
+ thetick.tv_nsec = 1000000000/hz;
rumpuser_mutex_enter(clockmtx);
rumpuser_cv_signal(clockcv);
@@ -126,15 +120,12 @@
/* if !maincpu: continue */
- if (++ticks == hz) {
- time_uptime++;
- ticks = 0;
+ if ((++ticks % hz) == 0) {
cv_broadcast(&lbolt);
}
+ tc_ticktock();
- clkgen++;
- timespecadd(&clockup, &tick, &clockup);
- clkgen++;
+ timespecadd(&clockup, &thetick, &clockup);
timespecadd(&clockup, &clockbase, &curtime);
}
}
@@ -246,6 +237,9 @@
panic("clock thread creation failed: %d", rv);
}
+ rumptc.tc_frequency = hz;
+ tc_init(&rumptc);
+
/*
* Make sure we have a clocktime before returning.
* XXX: mp
Index: src/sys/rump/librump/rumpkern/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.159 src/sys/rump/librump/rumpkern/rump.c:1.160
--- src/sys/rump/librump/rumpkern/rump.c:1.159 Mon Apr 12 22:17:23 2010
+++ src/sys/rump/librump/rumpkern/rump.c Wed Apr 14 10:27:53 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: rump.c,v 1.159 2010/04/12 22:17:23 pooka Exp $ */
+/* $NetBSD: rump.c,v 1.160 2010/04/14 10:27:53 pooka Exp $ */
/*
* Copyright (c) 2007 Antti Kantee. All Rights Reserved.
@@ -28,7 +28,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.159 2010/04/12 22:17:23 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.160 2010/04/14 10:27:53 pooka Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -58,6 +58,7 @@
#include <sys/select.h>
#include <sys/sysctl.h>
#include <sys/syscall.h>
+#include <sys/timetc.h>
#include <sys/tty.h>
#include <sys/uidinfo.h>
#include <sys/vmem.h>
@@ -186,6 +187,7 @@
rump__init(int rump_version)
{
char buf[256];
+ struct timespec ts;
uint64_t sec, nsec;
struct proc *p;
struct lwp *l;
@@ -290,6 +292,13 @@
rump_schedule();
percpu_init();
+ inittimecounter();
+ ntp_init();
+
+ rumpuser_gettime(&sec, &nsec, &error);
+ ts.tv_sec = sec;
+ ts.tv_nsec = nsec;
+ tc_setclock(&ts);
/* we are mostly go. do per-cpu subsystem init */
for (i = 0; i < ncpu; i++) {
@@ -490,6 +499,7 @@
l->l_fd = p->p_fd;
l->l_cpu = NULL;
lwp_initspecific(l);
+ LIST_INSERT_HEAD(&alllwp, l, l_list);
return l;
}
@@ -537,6 +547,7 @@
if (l->l_name)
kmem_free(l->l_name, MAXCOMLEN);
lwp_finispecific(l);
+ LIST_REMOVE(l, l_list);
kmem_free(l, sizeof(*l));
}