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)); }