Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/xen Changes from Christian Limpach to improve timek...
details: https://anonhg.NetBSD.org/src/rev/04c95e12a01e
branches: trunk
changeset: 570089:04c95e12a01e
user: tls <tls%NetBSD.org@localhost>
date: Thu Sep 23 02:24:22 2004 +0000
description:
Changes from Christian Limpach to improve timekeeping on NetBSD/xen by
actually adjusting the time correctly (calling hardclock as needed, not
just blindly every time Xen schedules us) based on Xen's idea of the
time in the shared page.
Xen source repo change info:
ChangeSet
2004/09/22 13:47:22+01:00 cl349%freefall.cl.cam.ac.uk@localhost
Fix time.
netbsd-2.0-xen-sparse/sys/arch/xen/xen/clock.c
2004/09/22 13:47:21+01:00 cl349%freefall.cl.cam.ac.uk@localhost +28 -3
Don't call hardclock on spurious timer interrupt and call hardclock
for missed interrupts.
netbsd-2.0-xen-sparse/sys/arch/xen/conf/XEN
2004/09/22 13:47:21+01:00 cl349%freefall.cl.cam.ac.uk@localhost +0 -1
Don't need custom HZ value any longer.
: ----------------------------------------------------------------------
diffstat:
sys/arch/xen/conf/GENERIC | 7 +++----
sys/arch/xen/conf/XEN | 5 ++---
sys/arch/xen/i386/locore.S | 3 ++-
sys/arch/xen/xen/clock.c | 38 ++++++++++++++++++++++++++++++++------
4 files changed, 39 insertions(+), 14 deletions(-)
diffs (174 lines):
diff -r 4e14164875b0 -r 04c95e12a01e sys/arch/xen/conf/GENERIC
--- a/sys/arch/xen/conf/GENERIC Thu Sep 23 01:16:34 2004 +0000
+++ b/sys/arch/xen/conf/GENERIC Thu Sep 23 02:24:22 2004 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: GENERIC,v 1.15 2004/09/04 23:29:57 manu Exp $
+# $NetBSD: GENERIC,v 1.16 2004/09/23 02:24:22 tls Exp $
# NetBSD: GENERIC,v 1.596 2004/04/07 13:13:59 augustss Exp
#
# GENERIC machine description file
@@ -23,14 +23,13 @@
options INCLUDE_CONFIG_FILE # embed config file in kernel binary
-#ident "GENERIC-$Revision: 1.15 $"
+#ident "GENERIC-$Revision: 1.16 $"
maxusers 32 # estimated number of users
#
options XEN
options DOM0OPS
-options HZ=50
# CPU support. At least one is REQUIRED.
options I686_CPU
@@ -55,7 +54,7 @@
options INSECURE # disable kernel security levels - X needs this
options RTC_OFFSET=0 # hardware clock is this many mins. west of GMT
-#options NTP # NTP phase/frequency locked loop
+options NTP # NTP phase/frequency locked loop
#options NO_TSC_TIME # Don't use TSC microtime, even if available.
# Improves time behavior under VMware.
diff -r 4e14164875b0 -r 04c95e12a01e sys/arch/xen/conf/XEN
--- a/sys/arch/xen/conf/XEN Thu Sep 23 01:16:34 2004 +0000
+++ b/sys/arch/xen/conf/XEN Thu Sep 23 02:24:22 2004 +0000
@@ -1,4 +1,4 @@
-# $NetBSD: XEN,v 1.12 2004/09/04 23:29:57 manu Exp $
+# $NetBSD: XEN,v 1.13 2004/09/23 02:24:22 tls Exp $
include "arch/xen/conf/std.xen"
@@ -13,7 +13,6 @@
#
options XEN
options DOM0OPS
-options HZ=50
#options I586_CPU
options I686_CPU
@@ -29,7 +28,7 @@
options INSECURE # disable kernel security levels - X needs this
options RTC_OFFSET=0 # hardware clock is this many mins. west of GMT
-#options NTP # NTP phase/frequency locked loop
+options NTP # NTP phase/frequency locked loop
options KTRACE # system call tracing via ktrace(1)
#options SYSTRACE # system call vetting via systrace(1)
diff -r 4e14164875b0 -r 04c95e12a01e sys/arch/xen/i386/locore.S
--- a/sys/arch/xen/i386/locore.S Thu Sep 23 01:16:34 2004 +0000
+++ b/sys/arch/xen/i386/locore.S Thu Sep 23 02:24:22 2004 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.S,v 1.5 2004/04/26 22:05:04 cl Exp $ */
+/* $NetBSD: locore.S,v 1.6 2004/09/23 02:24:22 tls Exp $ */
/* NetBSD: locore.S,v 1.26 2004/04/12 13:17:46 yamt Exp */
/*-
@@ -1588,6 +1588,7 @@
pushl $IPL_NONE
call _C_LABEL(Xspllower)
addl $4,%esp
+ jmp idle_start
4:
call _C_LABEL(uvm_pageidlezero)
CLI(%eax)
diff -r 4e14164875b0 -r 04c95e12a01e sys/arch/xen/xen/clock.c
--- a/sys/arch/xen/xen/clock.c Thu Sep 23 01:16:34 2004 +0000
+++ b/sys/arch/xen/xen/clock.c Thu Sep 23 02:24:22 2004 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: clock.c,v 1.6 2004/07/16 22:36:33 tls Exp $ */
+/* $NetBSD: clock.c,v 1.7 2004/09/23 02:24:22 tls Exp $ */
/*
*
@@ -34,7 +34,7 @@
#include "opt_xen.h"
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.6 2004/07/16 22:36:33 tls Exp $");
+__KERNEL_RCSID(0, "$NetBSD: clock.c,v 1.7 2004/09/23 02:24:22 tls Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -54,13 +54,17 @@
static int xen_timer_handler(void *, struct trapframe *);
/* These are peridically updated in shared_info, and then copied here. */
-static unsigned long shadow_tsc_stamp;
-static u_int64_t shadow_system_time;
+static uint64_t shadow_tsc_stamp;
+static uint64_t shadow_system_time;
static unsigned long shadow_time_version;
static struct timeval shadow_tv;
static int timeset;
+static uint64_t processed_system_time;
+
+#define NS_PER_TICK (1000000000ULL/hz)
+
/*
* Reads a consistent set of time-base values from Xen, into a shadow data
* area. Must be called at splclock.
@@ -73,12 +77,23 @@
__insn_barrier();
shadow_tv.tv_sec = HYPERVISOR_shared_info->wc_sec;
shadow_tv.tv_usec = HYPERVISOR_shared_info->wc_usec;
- shadow_tsc_stamp = HYPERVISOR_shared_info->tsc_timestamp;
+ shadow_tsc_stamp = HYPERVISOR_shared_info->tsc_timestamp <<
+ HYPERVISOR_shared_info->rdtsc_bitshift;
shadow_system_time = HYPERVISOR_shared_info->system_time;
__insn_barrier();
} while (shadow_time_version != HYPERVISOR_shared_info->time_version1);
}
+static uint64_t
+get_tsc_offset_ns(void)
+{
+ uint32_t tsc_delta;
+ struct cpu_info *ci = curcpu();
+
+ tsc_delta = cpu_counter32() - shadow_tsc_stamp;
+ return tsc_delta * 1000000000 / cpu_frequency(ci);
+}
+
void
inittodr(time_t base)
{
@@ -189,6 +204,9 @@
xen_initclocks()
{
+ get_time_values_from_xen();
+ processed_system_time = shadow_system_time;
+
event_set_handler(_EVENT_TIMER, (int (*)(void *))xen_timer_handler,
NULL, IPL_CLOCK);
hypervisor_enable_event(_EVENT_TIMER);
@@ -197,6 +215,8 @@
static int
xen_timer_handler(void *arg, struct trapframe *regs)
{
+ int64_t delta;
+
#if defined(I586_CPU) || defined(I686_CPU)
static int microset_iter; /* call cc_microset once/sec */
struct cpu_info *ci = curcpu();
@@ -222,7 +242,13 @@
get_time_values_from_xen();
- hardclock((struct clockframe *)regs);
+ delta = (int64_t)(shadow_system_time + get_tsc_offset_ns() -
+ processed_system_time);
+ while (delta >= NS_PER_TICK) {
+ hardclock((struct clockframe *)regs);
+ delta -= NS_PER_TICK;
+ processed_system_time += NS_PER_TICK;
+ }
return 0;
}
Home |
Main Index |
Thread Index |
Old Index