Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys - Eliminate the global "boottime" variable, which was be...
details: https://anonhg.NetBSD.org/src/rev/eaed816d291f
branches: trunk
changeset: 466801:eaed816d291f
user: thorpej <thorpej%NetBSD.org@localhost>
date: Thu Jan 02 15:42:26 2020 +0000
description:
- 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.
diffstat:
sys/compat/common/kern_info_43.c | 6 ++--
sys/compat/common/kern_time_50.c | 6 ++--
sys/compat/netbsd32/netbsd32_sysctl.c | 8 ++++--
sys/external/bsd/drm2/include/linux/ktime.h | 12 +++++++--
sys/fs/nfs/common/nfs_lock.c | 10 ++++----
sys/kern/init_main.c | 15 +-----------
sys/kern/init_sysctl.c | 22 ++++++++++++++++--
sys/kern/kern_rndq.c | 12 ++++++----
sys/kern/kern_tc.c | 33 +++++++++++++++++++++++++++-
sys/kern/kern_time.c | 6 +---
sys/miscfs/fdesc/fdesc_vnops.c | 9 ++++---
sys/miscfs/kernfs/kernfs.h | 7 +++--
sys/miscfs/kernfs/kernfs_vnops.c | 20 ++++++++++++++---
sys/miscfs/procfs/procfs_linux.c | 9 +++++--
sys/nfs/nfs_serv.c | 22 ++++++++++++-------
sys/rump/librump/rumpkern/cons.c | 11 ++++++---
sys/rump/librump/rumpkern/emul.c | 7 ++---
sys/rump/librump/rumpkern/rump.c | 13 +++++------
sys/sys/kernel.h | 4 +--
sys/sys/timevar.h | 6 ++++-
20 files changed, 153 insertions(+), 85 deletions(-)
diffs (truncated from 740 to 300 lines):
diff -r 2b74e6d8ac79 -r eaed816d291f sys/compat/common/kern_info_43.c
--- a/sys/compat/common/kern_info_43.c Thu Jan 02 14:33:55 2020 +0000
+++ b/sys/compat/common/kern_info_43.c Thu Jan 02 15:42:26 2020 +0000
@@ -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 @@
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);
diff -r 2b74e6d8ac79 -r eaed816d291f sys/compat/common/kern_time_50.c
--- a/sys/compat/common/kern_time_50.c Thu Jan 02 14:33:55 2020 +0000
+++ b/sys/compat/common/kern_time_50.c Thu Jan 02 15:42:26 2020 +0000
@@ -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 @@
{
struct timeval tv;
- TIMESPEC_TO_TIMEVAL(&tv, &boottime);
+ getmicroboottime(&tv);
timeval_to_timeval50(&tv, &boottime50);
sysctl_createv(clog, 0, NULL, NULL,
diff -r 2b74e6d8ac79 -r eaed816d291f sys/compat/netbsd32/netbsd32_sysctl.c
--- a/sys/compat/netbsd32/netbsd32_sysctl.c Thu Jan 02 14:33:55 2020 +0000
+++ b/sys/compat/netbsd32/netbsd32_sysctl.c Thu Jan 02 15:42:26 2020 +0000
@@ -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 @@
{
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;
diff -r 2b74e6d8ac79 -r eaed816d291f sys/external/bsd/drm2/include/linux/ktime.h
--- a/sys/external/bsd/drm2/include/linux/ktime.h Thu Jan 02 14:33:55 2020 +0000
+++ b/sys/external/bsd/drm2/include/linux/ktime.h Thu Jan 02 15:42:26 2020 +0000
@@ -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 @@
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);
}
diff -r 2b74e6d8ac79 -r eaed816d291f sys/fs/nfs/common/nfs_lock.c
--- a/sys/fs/nfs/common/nfs_lock.c Thu Jan 02 14:33:55 2020 +0000
+++ b/sys/fs/nfs/common/nfs_lock.c Thu Jan 02 15:42:26 2020 +0000
@@ -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 @@
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 @@
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);
diff -r 2b74e6d8ac79 -r eaed816d291f sys/kern/init_main.c
--- a/sys/kern/init_main.c Thu Jan 02 14:33:55 2020 +0000
+++ b/sys/kern/init_main.c Thu Jan 02 15:42:26 2020 +0000
@@ -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 @@
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 @@
* 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) {
diff -r 2b74e6d8ac79 -r eaed816d291f sys/kern/init_sysctl.c
--- a/sys/kern/init_sysctl.c Thu Jan 02 14:33:55 2020 +0000
+++ b/sys/kern/init_sysctl.c Thu Jan 02 15:42:26 2020 +0000
@@ -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 @@
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 @@
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 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
diff -r 2b74e6d8ac79 -r eaed816d291f sys/kern/kern_rndq.c
--- a/sys/kern/kern_rndq.c Thu Jan 02 14:33:55 2020 +0000
+++ b/sys/kern/kern_rndq.c Thu Jan 02 15:42:26 2020 +0000
@@ -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 @@
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++;
}
diff -r 2b74e6d8ac79 -r eaed816d291f sys/kern/kern_tc.c
--- a/sys/kern/kern_tc.c Thu Jan 02 14:33:55 2020 +0000
+++ b/sys/kern/kern_tc.c Thu Jan 02 15:42:26 2020 +0000
@@ -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>
Home |
Main Index |
Thread Index |
Old Index