Module Name: src
Committed By: thorpej
Date: Thu Jan 2 15:42:27 UTC 2020
Modified Files:
src/sys/compat/common: kern_info_43.c kern_time_50.c
src/sys/compat/netbsd32: netbsd32_sysctl.c
src/sys/external/bsd/drm2/include/linux: ktime.h
src/sys/fs/nfs/common: nfs_lock.c
src/sys/kern: init_main.c init_sysctl.c kern_rndq.c kern_tc.c
kern_time.c
src/sys/miscfs/fdesc: fdesc_vnops.c
src/sys/miscfs/kernfs: kernfs.h kernfs_vnops.c
src/sys/miscfs/procfs: procfs_linux.c
src/sys/nfs: nfs_serv.c
src/sys/rump/librump/rumpkern: cons.c emul.c rump.c
src/sys/sys: kernel.h timevar.h
Log Message:
- Eliminate the global "boottime" variable, which was being accessed
without any synchronization against changes by e.g. clock_settime().
- Replace with new getbinboottime() / getnanoboottime() / getmicroboottime()
functions (naming mirrors that of other time access functions in kern_tc.c).
It returns the (maybe-converted) value of timebasebin, which also tracks
our estimate of when the system was booted (i.e. the legacy "boottime" was
redundant).
XXX There needs to be a lockless synchronization mechanism for reading
timebasebin, but this is a problem in kern_tc.c that pre-existed these
"boottime" changes. At least now the problem is centralized in one location.
To generate a diff of this commit:
cvs rdiff -u -r1.37 -r1.38 src/sys/compat/common/kern_info_43.c
cvs rdiff -u -r1.33 -r1.34 src/sys/compat/common/kern_time_50.c
cvs rdiff -u -r1.40 -r1.41 src/sys/compat/netbsd32/netbsd32_sysctl.c
cvs rdiff -u -r1.7 -r1.8 src/sys/external/bsd/drm2/include/linux/ktime.h
cvs rdiff -u -r1.2 -r1.3 src/sys/fs/nfs/common/nfs_lock.c
cvs rdiff -u -r1.516 -r1.517 src/sys/kern/init_main.c
cvs rdiff -u -r1.222 -r1.223 src/sys/kern/init_sysctl.c
cvs rdiff -u -r1.95 -r1.96 src/sys/kern/kern_rndq.c
cvs rdiff -u -r1.53 -r1.54 src/sys/kern/kern_tc.c
cvs rdiff -u -r1.202 -r1.203 src/sys/kern/kern_time.c
cvs rdiff -u -r1.130 -r1.131 src/sys/miscfs/fdesc/fdesc_vnops.c
cvs rdiff -u -r1.40 -r1.41 src/sys/miscfs/kernfs/kernfs.h
cvs rdiff -u -r1.161 -r1.162 src/sys/miscfs/kernfs/kernfs_vnops.c
cvs rdiff -u -r1.79 -r1.80 src/sys/miscfs/procfs/procfs_linux.c
cvs rdiff -u -r1.177 -r1.178 src/sys/nfs/nfs_serv.c
cvs rdiff -u -r1.8 -r1.9 src/sys/rump/librump/rumpkern/cons.c
cvs rdiff -u -r1.194 -r1.195 src/sys/rump/librump/rumpkern/emul.c
cvs rdiff -u -r1.338 -r1.339 src/sys/rump/librump/rumpkern/rump.c
cvs rdiff -u -r1.31 -r1.32 src/sys/sys/kernel.h
cvs rdiff -u -r1.39 -r1.40 src/sys/sys/timevar.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/compat/common/kern_info_43.c
diff -u src/sys/compat/common/kern_info_43.c:1.37 src/sys/compat/common/kern_info_43.c:1.38
--- src/sys/compat/common/kern_info_43.c:1.37 Sun Jan 27 02:08:39 2019
+++ src/sys/compat/common/kern_info_43.c Thu Jan 2 15:42:26 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_info_43.c,v 1.37 2019/01/27 02:08:39 pgoyette Exp $ */
+/* $NetBSD: kern_info_43.c,v 1.38 2020/01/02 15:42:26 thorpej Exp $ */
/*
* Copyright (c) 1982, 1986, 1991, 1993
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_info_43.c,v 1.37 2019/01/27 02:08:39 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_info_43.c,v 1.38 2020/01/02 15:42:26 thorpej Exp $");
#if defined(_KERNEL_OPT)
#include "opt_compat_netbsd.h"
@@ -283,7 +283,7 @@ compat_43_sys_getkerninfo(struct lwp *l,
ksi.open_max = OPEN_MAX;
ksi.child_max = CHILD_MAX;
- TIMESPEC_TO_TIMEVAL(&tv, &boottime);
+ getmicroboottime(&tv);
timeval_to_timeval50(&tv, &ksi.boottime);
COPY(hostname);
Index: src/sys/compat/common/kern_time_50.c
diff -u src/sys/compat/common/kern_time_50.c:1.33 src/sys/compat/common/kern_time_50.c:1.34
--- src/sys/compat/common/kern_time_50.c:1.33 Sun Jan 27 02:08:39 2019
+++ src/sys/compat/common/kern_time_50.c Thu Jan 2 15:42:26 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_time_50.c,v 1.33 2019/01/27 02:08:39 pgoyette Exp $ */
+/* $NetBSD: kern_time_50.c,v 1.34 2020/01/02 15:42:26 thorpej Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_time_50.c,v 1.33 2019/01/27 02:08:39 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_time_50.c,v 1.34 2020/01/02 15:42:26 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_compat_netbsd.h"
@@ -585,7 +585,7 @@ compat_sysctl_time(struct sysctllog **cl
{
struct timeval tv;
- TIMESPEC_TO_TIMEVAL(&tv, &boottime);
+ getmicroboottime(&tv);
timeval_to_timeval50(&tv, &boottime50);
sysctl_createv(clog, 0, NULL, NULL,
Index: src/sys/compat/netbsd32/netbsd32_sysctl.c
diff -u src/sys/compat/netbsd32/netbsd32_sysctl.c:1.40 src/sys/compat/netbsd32/netbsd32_sysctl.c:1.41
--- src/sys/compat/netbsd32/netbsd32_sysctl.c:1.40 Sat May 26 21:07:47 2018
+++ src/sys/compat/netbsd32/netbsd32_sysctl.c Thu Jan 2 15:42:26 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: netbsd32_sysctl.c,v 1.40 2018/05/26 21:07:47 kamil Exp $ */
+/* $NetBSD: netbsd32_sysctl.c,v 1.41 2020/01/02 15:42:26 thorpej Exp $ */
/*
* Copyright (c) 2003 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_sysctl.c,v 1.40 2018/05/26 21:07:47 kamil Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_sysctl.c,v 1.41 2020/01/02 15:42:26 thorpej Exp $");
#if defined(_KERNEL_OPT)
#include "opt_ddb.h"
@@ -80,8 +80,10 @@ netbsd32_sysctl_kern_boottime(SYSCTLFN_A
{
struct sysctlnode node;
struct netbsd32_timespec bt32;
+ struct timespec ts;
- netbsd32_from_timespec(&boottime, &bt32);
+ getnanoboottime(&ts);
+ netbsd32_from_timespec(&ts, &bt32);
node = *rnode;
node.sysctl_data = &bt32;
Index: src/sys/external/bsd/drm2/include/linux/ktime.h
diff -u src/sys/external/bsd/drm2/include/linux/ktime.h:1.7 src/sys/external/bsd/drm2/include/linux/ktime.h:1.8
--- src/sys/external/bsd/drm2/include/linux/ktime.h:1.7 Mon Aug 27 13:57:38 2018
+++ src/sys/external/bsd/drm2/include/linux/ktime.h Thu Jan 2 15:42:26 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: ktime.h,v 1.7 2018/08/27 13:57:38 riastradh Exp $ */
+/* $NetBSD: ktime.h,v 1.8 2020/01/02 15:42:26 thorpej Exp $ */
/*-
* Copyright (c) 2013 The NetBSD Foundation, Inc.
@@ -131,15 +131,21 @@ ktime_get_raw_ns(void)
static inline ktime_t
ktime_get_monotonic_offset(void)
{
- return timespec_to_ktime(boottime);
+ struct timespec ts;
+
+ getnanoboottime(&ts);
+
+ return timespec_to_ktime(ts);
}
static inline ktime_t
ktime_mono_to_real(ktime_t kt)
{
struct timespec ts = ktime_to_timespec(kt);
+ struct timespec bts;
- timespecadd(&ts, &boottime, &ts);
+ getnanoboottime(&bts);
+ timespecadd(&ts, &bts, &ts);
return timespec_to_ktime(ts);
}
Index: src/sys/fs/nfs/common/nfs_lock.c
diff -u src/sys/fs/nfs/common/nfs_lock.c:1.2 src/sys/fs/nfs/common/nfs_lock.c:1.3
--- src/sys/fs/nfs/common/nfs_lock.c:1.2 Tue Dec 13 22:41:46 2016
+++ src/sys/fs/nfs/common/nfs_lock.c Thu Jan 2 15:42:26 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: nfs_lock.c,v 1.2 2016/12/13 22:41:46 pgoyette Exp $ */
+/* $NetBSD: nfs_lock.c,v 1.3 2020/01/02 15:42:26 thorpej Exp $ */
/*-
* Copyright (c) 1997 Berkeley Software Design, Inc. All rights reserved.
*
@@ -31,7 +31,7 @@
#include <sys/cdefs.h>
/* __FBSDID("FreeBSD: head/sys/nfs/nfs_lock.c 303382 2016-07-27 11:08:59Z kib "); */
-__RCSID("$NetBSD: nfs_lock.c,v 1.2 2016/12/13 22:41:46 pgoyette Exp $");
+__RCSID("$NetBSD: nfs_lock.c,v 1.3 2020/01/02 15:42:26 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -243,7 +243,7 @@ nfs_dolock(struct vop_advlock_args *ap)
struct flock *fl;
struct proc *p;
struct nfsmount *nmp;
- struct timeval boottime;
+ struct timeval btv;
td = curthread;
p = td->td_proc;
@@ -287,8 +287,8 @@ nfs_dolock(struct vop_advlock_args *ap)
p->p_nlminfo = malloc(sizeof(struct nlminfo),
M_NLMINFO, M_WAITOK | M_ZERO);
p->p_nlminfo->pid_start = p->p_stats->p_start;
- getboottime(&boottime);
- timevaladd(&p->p_nlminfo->pid_start, &boottime);
+ getmicroboottime(&btv);
+ timevaladd(&p->p_nlminfo->pid_start, &btv);
}
msg.lm_msg_ident.pid_start = p->p_nlminfo->pid_start;
msg.lm_msg_ident.msg_seq = ++(p->p_nlminfo->msg_seq);
Index: src/sys/kern/init_main.c
diff -u src/sys/kern/init_main.c:1.516 src/sys/kern/init_main.c:1.517
--- src/sys/kern/init_main.c:1.516 Wed Jan 1 22:57:17 2020
+++ src/sys/kern/init_main.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: init_main.c,v 1.516 2020/01/01 22:57:17 thorpej Exp $ */
+/* $NetBSD: init_main.c,v 1.517 2020/01/02 15:42:27 thorpej Exp $ */
/*-
* Copyright (c) 2008, 2009, 2019 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.516 2020/01/01 22:57:17 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.517 2020/01/02 15:42:27 thorpej Exp $");
#include "opt_ddb.h"
#include "opt_inet.h"
@@ -242,7 +242,6 @@ struct vnode *rootvp, *swapdev_vp;
int boothowto;
int cold __read_mostly = 1; /* still working on startup */
int shutting_down __read_mostly; /* system is shutting down */
-struct timespec boottime; /* time at system startup - will only follow settime deltas */
int start_init_exec; /* semaphore for start_init() */
@@ -688,16 +687,6 @@ main(void)
* munched in mi_switch() after the time got set.
*/
getnanotime(&time);
- {
- struct timespec ut;
- /*
- * was:
- * boottime = time;
- * but we can do better
- */
- nanouptime(&ut);
- timespecsub(&time, &ut, &boottime);
- }
mutex_enter(proc_lock);
LIST_FOREACH(p, &allproc, p_list) {
Index: src/sys/kern/init_sysctl.c
diff -u src/sys/kern/init_sysctl.c:1.222 src/sys/kern/init_sysctl.c:1.223
--- src/sys/kern/init_sysctl.c:1.222 Tue Jan 15 07:11:23 2019
+++ src/sys/kern/init_sysctl.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: init_sysctl.c,v 1.222 2019/01/15 07:11:23 mrg Exp $ */
+/* $NetBSD: init_sysctl.c,v 1.223 2020/01/02 15:42:27 thorpej Exp $ */
/*-
* Copyright (c) 2003, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.222 2019/01/15 07:11:23 mrg Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_sysctl.c,v 1.223 2020/01/02 15:42:27 thorpej Exp $");
#include "opt_sysv.h"
#include "opt_compat_netbsd.h"
@@ -110,6 +110,7 @@ dcopyout(struct lwp *l, const void *kadd
static int sysctl_kern_maxvnodes(SYSCTLFN_PROTO);
static int sysctl_kern_messages(SYSCTLFN_PROTO);
+static int sysctl_kern_boottime(SYSCTLFN_PROTO);
static int sysctl_kern_rtc_offset(SYSCTLFN_PROTO);
static int sysctl_kern_maxproc(SYSCTLFN_PROTO);
static int sysctl_kern_hostid(SYSCTLFN_PROTO);
@@ -235,7 +236,7 @@ SYSCTL_SETUP(sysctl_kern_setup, "sysctl
CTLFLAG_PERMANENT,
CTLTYPE_STRUCT, "boottime",
SYSCTL_DESCR("System boot time"),
- NULL, 0, &boottime, sizeof(boottime),
+ sysctl_kern_boottime, 0, NULL, sizeof(struct timespec),
CTL_KERN, KERN_BOOTTIME, CTL_EOL);
sysctl_createv(clog, 0, NULL, NULL,
CTLFLAG_PERMANENT|CTLFLAG_IMMEDIATE,
@@ -803,6 +804,21 @@ sysctl_kern_messages(SYSCTLFN_ARGS)
}
/*
+ * sysctl helper routine for the kern.boottime node
+ */
+static int
+sysctl_kern_boottime(SYSCTLFN_ARGS)
+{
+ struct sysctlnode node;
+ struct timespec ts;
+
+ getnanoboottime(&ts);
+ node = *rnode;
+ node.sysctl_data = &ts;
+ return (sysctl_lookup(SYSCTLFN_CALL(&node)));
+}
+
+/*
* sysctl helper routine for rtc_offset - set time after changes
*/
static int
Index: src/sys/kern/kern_rndq.c
diff -u src/sys/kern/kern_rndq.c:1.95 src/sys/kern/kern_rndq.c:1.96
--- src/sys/kern/kern_rndq.c:1.95 Sun Sep 29 12:07:52 2019
+++ src/sys/kern/kern_rndq.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_rndq.c,v 1.95 2019/09/29 12:07:52 rhialto Exp $ */
+/* $NetBSD: kern_rndq.c,v 1.96 2020/01/02 15:42:27 thorpej Exp $ */
/*-
* Copyright (c) 1997-2013 The NetBSD Foundation, Inc.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.95 2019/09/29 12:07:52 rhialto Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_rndq.c,v 1.96 2020/01/02 15:42:27 thorpej Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -1241,9 +1241,11 @@ rnd_extract_data(void *p, uint32_t len,
mutex_spin_enter(&rnd_global.lock);
if (__predict_false(!timed_in)) {
- if (boottime.tv_sec) {
- rndpool_add_data(&rnd_global.pool, &boottime,
- sizeof(boottime), 0);
+ struct timespec tv;
+ getnanoboottime(&tv);
+ if (tv.tv_sec) {
+ rndpool_add_data(&rnd_global.pool, &tv,
+ sizeof(tv), 0);
}
timed_in++;
}
Index: src/sys/kern/kern_tc.c
diff -u src/sys/kern/kern_tc.c:1.53 src/sys/kern/kern_tc.c:1.54
--- src/sys/kern/kern_tc.c:1.53 Fri Dec 27 09:25:58 2019
+++ src/sys/kern/kern_tc.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_tc.c,v 1.53 2019/12/27 09:25:58 msaitoh Exp $ */
+/* $NetBSD: kern_tc.c,v 1.54 2020/01/02 15:42:27 thorpej Exp $ */
/*-
* Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
/* __FBSDID("$FreeBSD: src/sys/kern/kern_tc.c,v 1.166 2005/09/19 22:16:31 andre Exp $"); */
-__KERNEL_RCSID(0, "$NetBSD: kern_tc.c,v 1.53 2019/12/27 09:25:58 msaitoh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_tc.c,v 1.54 2020/01/02 15:42:27 thorpej Exp $");
#ifdef _KERNEL_OPT
#include "opt_ntp.h"
@@ -519,6 +519,35 @@ getmicrotime(struct timeval *tvp)
} while (gen == 0 || gen != th->th_generation);
}
+void
+getnanoboottime(struct timespec *tsp)
+{
+ struct bintime bt;
+
+ getbinboottime(&bt);
+ bintime2timespec(&bt, tsp);
+}
+
+void
+getmicroboottime(struct timeval *tvp)
+{
+ struct bintime bt;
+
+ getbinboottime(&bt);
+ bintime2timeval(&bt, tvp);
+}
+
+void
+getbinboottime(struct bintime *bt)
+{
+
+ /*
+ * XXX Need lockless read synchronization around timebasebin
+ * (and not just here).
+ */
+ *bt = timebasebin;
+}
+
/*
* Initialize a new timecounter and possibly use it.
*/
Index: src/sys/kern/kern_time.c
diff -u src/sys/kern/kern_time.c:1.202 src/sys/kern/kern_time.c:1.203
--- src/sys/kern/kern_time.c:1.202 Wed Jan 1 17:28:17 2020
+++ src/sys/kern/kern_time.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kern_time.c,v 1.202 2020/01/01 17:28:17 thorpej Exp $ */
+/* $NetBSD: kern_time.c,v 1.203 2020/01/02 15:42:27 thorpej Exp $ */
/*-
* Copyright (c) 2000, 2004, 2005, 2007, 2008, 2009 The NetBSD Foundation, Inc.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.202 2020/01/01 17:28:17 thorpej Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_time.c,v 1.203 2020/01/02 15:42:27 thorpej Exp $");
#include <sys/param.h>
#include <sys/resourcevar.h>
@@ -155,8 +155,6 @@ settime1(struct proc *p, const struct ti
tc_setclock(ts);
- timespecadd(&boottime, &delta, &boottime);
-
resettodr();
return (0);
Index: src/sys/miscfs/fdesc/fdesc_vnops.c
diff -u src/sys/miscfs/fdesc/fdesc_vnops.c:1.130 src/sys/miscfs/fdesc/fdesc_vnops.c:1.131
--- src/sys/miscfs/fdesc/fdesc_vnops.c:1.130 Mon Sep 3 16:29:35 2018
+++ src/sys/miscfs/fdesc/fdesc_vnops.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: fdesc_vnops.c,v 1.130 2018/09/03 16:29:35 riastradh Exp $ */
+/* $NetBSD: fdesc_vnops.c,v 1.131 2020/01/02 15:42:27 thorpej Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -41,13 +41,12 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fdesc_vnops.c,v 1.130 2018/09/03 16:29:35 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fdesc_vnops.c,v 1.131 2020/01/02 15:42:27 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/time.h>
#include <sys/proc.h>
-#include <sys/kernel.h> /* boottime */
#include <sys/resourcevar.h>
#include <sys/socketvar.h>
#include <sys/filedesc.h>
@@ -412,6 +411,7 @@ fdesc_getattr(void *v)
struct vattr *vap = ap->a_vap;
unsigned fd;
int error = 0;
+ struct timeval tv;
switch (VTOFDESC(vp)->fd_type) {
case Froot:
@@ -454,7 +454,8 @@ fdesc_getattr(void *v)
vap->va_gid = 0;
vap->va_fsid = vp->v_mount->mnt_stat.f_fsidx.__fsid_val[0];
vap->va_blocksize = DEV_BSIZE;
- vap->va_atime.tv_sec = boottime.tv_sec;
+ getmicroboottime(&tv);
+ vap->va_atime.tv_sec = tv.tv_sec;
vap->va_atime.tv_nsec = 0;
vap->va_mtime = vap->va_atime;
vap->va_ctime = vap->va_mtime;
Index: src/sys/miscfs/kernfs/kernfs.h
diff -u src/sys/miscfs/kernfs/kernfs.h:1.40 src/sys/miscfs/kernfs/kernfs.h:1.41
--- src/sys/miscfs/kernfs/kernfs.h:1.40 Sun Jul 20 13:58:04 2014
+++ src/sys/miscfs/kernfs/kernfs.h Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kernfs.h,v 1.40 2014/07/20 13:58:04 hannken Exp $ */
+/* $NetBSD: kernfs.h,v 1.41 2020/01/02 15:42:27 thorpej Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -48,10 +48,11 @@ typedef enum {
KFSkern, /* the filesystem itself (.) */
KFSroot, /* the filesystem root (..) */
KFSnull, /* none aplicable */
- KFStime, /* boottime */
+ KFStime, /* time */
+ KFSboottime, /* boottime */
KFSint, /* integer */
KFSstring, /* string */
- KFShostname, /* hostname */
+ KFShostname, /* hostname */
KFSavenrun, /* loadavg */
KFSdevice, /* device file (rootdev/rrootdev) */
KFSmsgbuf, /* msgbuf */
Index: src/sys/miscfs/kernfs/kernfs_vnops.c
diff -u src/sys/miscfs/kernfs/kernfs_vnops.c:1.161 src/sys/miscfs/kernfs/kernfs_vnops.c:1.162
--- src/sys/miscfs/kernfs/kernfs_vnops.c:1.161 Thu Aug 29 06:43:13 2019
+++ src/sys/miscfs/kernfs/kernfs_vnops.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kernfs_vnops.c,v 1.161 2019/08/29 06:43:13 hannken Exp $ */
+/* $NetBSD: kernfs_vnops.c,v 1.162 2020/01/02 15:42:27 thorpej Exp $ */
/*
* Copyright (c) 1992, 1993
@@ -39,7 +39,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.161 2019/08/29 06:43:13 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kernfs_vnops.c,v 1.162 2020/01/02 15:42:27 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -78,7 +78,7 @@ const struct kern_target kern_targets[]
/* name data tag type ro/rw */
{ DT_DIR, N("."), 0, KFSkern, VDIR, DIR_MODE },
{ DT_DIR, N(".."), 0, KFSroot, VDIR, DIR_MODE },
- { DT_REG, N("boottime"), &boottime.tv_sec, KFSint, VREG, READ_MODE },
+ { DT_REG, N("boottime"), 0, KFSboottime, VREG, READ_MODE },
/* XXXUNCONST */
{ DT_REG, N("copyright"), __UNCONST(copyright),
KFSstring, VREG, READ_MODE },
@@ -362,6 +362,17 @@ kernfs_xread(struct kernfs_node *kfs, in
break;
}
+ case KFSboottime: {
+ struct timeval tv;
+
+ /*
+ * Historically, /kern/boottime only contained seconds.
+ */
+ getmicroboottime(&tv);
+ snprintf(*bufp, len, "%lld\n", (long long)tv.tv_sec);
+ break;
+ }
+
case KFSint: {
int *ip = kt->kt_data;
@@ -639,7 +650,7 @@ kernfs_getattr(void *v)
/* Make all times be current TOD, except for the "boottime" node. */
if (kfs->kfs_kt->kt_namlen == 8 &&
!memcmp(kfs->kfs_kt->kt_name, "boottime", 8)) {
- vap->va_ctime = boottime;
+ getnanoboottime(&vap->va_ctime);
} else {
getnanotime(&vap->va_ctime);
}
@@ -673,6 +684,7 @@ kernfs_getattr(void *v)
case KFSnull:
case KFStime:
+ case KFSboottime:
case KFSint:
case KFSstring:
case KFShostname:
Index: src/sys/miscfs/procfs/procfs_linux.c
diff -u src/sys/miscfs/procfs/procfs_linux.c:1.79 src/sys/miscfs/procfs/procfs_linux.c:1.80
--- src/sys/miscfs/procfs/procfs_linux.c:1.79 Tue Dec 31 13:07:13 2019
+++ src/sys/miscfs/procfs/procfs_linux.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: procfs_linux.c,v 1.79 2019/12/31 13:07:13 ad Exp $ */
+/* $NetBSD: procfs_linux.c,v 1.80 2020/01/02 15:42:27 thorpej Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.79 2019/12/31 13:07:13 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: procfs_linux.c,v 1.80 2020/01/02 15:42:27 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -297,6 +297,9 @@ procfs_docpustat(struct lwp *curl, struc
cpu_count_sync_all();
+ struct timeval btv;
+ getmicroboottime(&btv);
+
len += snprintf(&bf[len], LBFSZ - len,
"disk 0 0 0 0\n"
"page %u %u\n"
@@ -308,7 +311,7 @@ procfs_docpustat(struct lwp *curl, struc
uvmexp.pgswapin, uvmexp.pgswapout,
cpu_count_get(CPU_COUNT_NINTR),
cpu_count_get(CPU_COUNT_NSWTCH),
- boottime.tv_sec);
+ btv.tv_sec);
if (len >= LBFSZ)
goto out;
Index: src/sys/nfs/nfs_serv.c
diff -u src/sys/nfs/nfs_serv.c:1.177 src/sys/nfs/nfs_serv.c:1.178
--- src/sys/nfs/nfs_serv.c:1.177 Wed Feb 20 10:05:20 2019
+++ src/sys/nfs/nfs_serv.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: nfs_serv.c,v 1.177 2019/02/20 10:05:20 hannken Exp $ */
+/* $NetBSD: nfs_serv.c,v 1.178 2020/01/02 15:42:27 thorpej Exp $ */
/*
* Copyright (c) 1989, 1993
@@ -55,7 +55,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.177 2019/02/20 10:05:20 hannken Exp $");
+__KERNEL_RCSID(0, "$NetBSD: nfs_serv.c,v 1.178 2020/01/02 15:42:27 thorpej Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -1003,8 +1003,10 @@ nfsrv_write(struct nfsrv_descript *nfsd,
* but it may make the values more human readable,
* for debugging purposes.
*/
- *tl++ = txdr_unsigned(boottime.tv_sec);
- *tl = txdr_unsigned(boottime.tv_nsec / 1000);
+ struct timeval btv;
+ getmicroboottime(&btv);
+ *tl++ = txdr_unsigned(btv.tv_sec);
+ *tl = txdr_unsigned(btv.tv_usec);
} else {
nfsm_build(fp, struct nfs_fattr *, NFSX_V2FATTR);
nfsm_srvfillattr(&va, fp);
@@ -1304,8 +1306,10 @@ loop1:
* but it may make the values more human readable,
* for debugging purposes.
*/
- *tl++ = txdr_unsigned(boottime.tv_sec);
- *tl = txdr_unsigned(boottime.tv_nsec / 1000);
+ struct timeval btv;
+ getmicroboottime(&btv);
+ *tl++ = txdr_unsigned(btv.tv_sec);
+ *tl = txdr_unsigned(btv.tv_usec);
} else {
nfsm_build(fp, struct nfs_fattr *, NFSX_V2FATTR);
nfsm_srvfillattr(&va, fp);
@@ -3319,8 +3323,10 @@ nfsrv_commit(struct nfsrv_descript *nfsd
nfsm_srvwcc_data(for_ret, &bfor, aft_ret, &aft);
if (!error) {
nfsm_build(tl, u_int32_t *, NFSX_V3WRITEVERF);
- *tl++ = txdr_unsigned(boottime.tv_sec);
- *tl = txdr_unsigned(boottime.tv_nsec / 1000);
+ struct timeval btv;
+ getmicroboottime(&btv);
+ *tl++ = txdr_unsigned(btv.tv_sec);
+ *tl = txdr_unsigned(btv.tv_usec);
} else {
return (0);
}
Index: src/sys/rump/librump/rumpkern/cons.c
diff -u src/sys/rump/librump/rumpkern/cons.c:1.8 src/sys/rump/librump/rumpkern/cons.c:1.9
--- src/sys/rump/librump/rumpkern/cons.c:1.8 Mon Sep 3 16:29:37 2018
+++ src/sys/rump/librump/rumpkern/cons.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: cons.c,v 1.8 2018/09/03 16:29:37 riastradh Exp $ */
+/* $NetBSD: cons.c,v 1.9 2020/01/02 15:42:27 thorpej Exp $ */
/*
* Copyright (c) 2013 Antti Kantee. All Rights Reserved.
@@ -36,7 +36,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cons.c,v 1.8 2018/09/03 16:29:37 riastradh Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cons.c,v 1.9 2020/01/02 15:42:27 thorpej Exp $");
#include <sys/param.h>
#include <sys/file.h>
@@ -137,11 +137,14 @@ rumpcons_ioctl(struct file *fp, u_long c
static int
rumpcons_stat(struct file *fp, struct stat *sb)
{
+ struct timespec ts;
+
+ getnanoboottime(&ts);
memset(sb, 0, sizeof(*sb));
sb->st_mode = 0600 | _S_IFCHR;
- sb->st_atimespec = sb->st_mtimespec = sb->st_ctimespec = boottime;
- sb->st_birthtimespec = boottime;
+ sb->st_atimespec = sb->st_mtimespec = sb->st_ctimespec = ts;
+ sb->st_birthtimespec = ts;
return 0;
}
Index: src/sys/rump/librump/rumpkern/emul.c
diff -u src/sys/rump/librump/rumpkern/emul.c:1.194 src/sys/rump/librump/rumpkern/emul.c:1.195
--- src/sys/rump/librump/rumpkern/emul.c:1.194 Thu Jan 2 08:49:10 2020
+++ src/sys/rump/librump/rumpkern/emul.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: emul.c,v 1.194 2020/01/02 08:49:10 martin Exp $ */
+/* $NetBSD: emul.c,v 1.195 2020/01/02 15:42:27 thorpej Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.194 2020/01/02 08:49:10 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.195 2020/01/02 15:42:27 thorpej Exp $");
#include <sys/param.h>
#include <sys/cprng.h>
@@ -64,9 +64,8 @@ struct vnode *rootvp;
dev_t rootdev = NODEV;
const int schedppq = 1;
-int shutting_down __read_mostly; /* system is shutting down */
-struct timespec boottime;
int cold = 1;
+int shutting_down;
int boothowto = AB_SILENT;
struct tty *constty;
Index: src/sys/rump/librump/rumpkern/rump.c
diff -u src/sys/rump/librump/rumpkern/rump.c:1.338 src/sys/rump/librump/rumpkern/rump.c:1.339
--- src/sys/rump/librump/rumpkern/rump.c:1.338 Sun Dec 15 14:21:34 2019
+++ src/sys/rump/librump/rumpkern/rump.c Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: rump.c,v 1.338 2019/12/15 14:21:34 pgoyette Exp $ */
+/* $NetBSD: rump.c,v 1.339 2020/01/02 15:42:27 thorpej Exp $ */
/*
* Copyright (c) 2007-2011 Antti Kantee. All Rights Reserved.
@@ -26,7 +26,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.338 2019/12/15 14:21:34 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rump.c,v 1.339 2020/01/02 15:42:27 thorpej Exp $");
#include <sys/systm.h>
#define ELFSIZE ARCH_ELFSIZE
@@ -229,7 +229,7 @@ int
rump_init(void)
{
char buf[256];
- struct timespec ts;
+ struct timespec bts;
int64_t sec;
long nsec;
struct lwp *l, *initlwp;
@@ -276,8 +276,8 @@ rump_init(void)
rump_cpus_bootstrap(&numcpu);
rumpuser_clock_gettime(RUMPUSER_CLOCK_RELWALL, &sec, &nsec);
- boottime.tv_sec = sec;
- boottime.tv_nsec = nsec;
+ bts.tv_sec = sec;
+ bts.tv_nsec = nsec;
initmsgbuf(rump_msgbuf, sizeof(rump_msgbuf));
aprint_verbose("%s%s", copyright, version);
@@ -369,8 +369,7 @@ rump_init(void)
ktrinit();
#endif
- ts = boottime;
- tc_setclock(&ts);
+ tc_setclock(&bts);
extern krwlock_t exec_lock;
rw_init(&exec_lock);
Index: src/sys/sys/kernel.h
diff -u src/sys/sys/kernel.h:1.31 src/sys/sys/kernel.h:1.32
--- src/sys/sys/kernel.h:1.31 Wed Jan 1 22:57:17 2020
+++ src/sys/sys/kernel.h Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: kernel.h,v 1.31 2020/01/01 22:57:17 thorpej Exp $ */
+/* $NetBSD: kernel.h,v 1.32 2020/01/02 15:42:27 thorpej Exp $ */
/*-
* Copyright (c) 1990, 1993
@@ -50,8 +50,6 @@ extern int hostnamelen;
extern char domainname[MAXHOSTNAMELEN];
extern int domainnamelen;
-extern struct timespec boottime;
-
extern int rtc_offset; /* offset of rtc from UTC in minutes */
extern int cold; /* still working on startup */
Index: src/sys/sys/timevar.h
diff -u src/sys/sys/timevar.h:1.39 src/sys/sys/timevar.h:1.40
--- src/sys/sys/timevar.h:1.39 Tue Aug 6 15:47:55 2019
+++ src/sys/sys/timevar.h Thu Jan 2 15:42:27 2020
@@ -1,4 +1,4 @@
-/* $NetBSD: timevar.h,v 1.39 2019/08/06 15:47:55 riastradh Exp $ */
+/* $NetBSD: timevar.h,v 1.40 2020/01/02 15:42:27 thorpej Exp $ */
/*
* Copyright (c) 2005, 2008 The NetBSD Foundation.
@@ -146,6 +146,10 @@ void getbintime(struct bintime *);
void getnanotime(struct timespec *);
void getmicrotime(struct timeval *);
+void getbinboottime(struct bintime *);
+void getnanoboottime(struct timespec *);
+void getmicroboottime(struct timeval *);
+
/* Other functions */
int ts2timo(clockid_t, int, struct timespec *, int *, struct timespec *);
void adjtime1(const struct timeval *, struct timeval *, struct proc *);