NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: kern/60315: monotonic clock with or without time suspended
The following reply was made to PR kern/60315; it has been noted by GNATS.
From: Taylor R Campbell <riastradh%NetBSD.org@localhost>
To: gnats-bugs%NetBSD.org@localhost, netbsd-bugs%NetBSD.org@localhost
Cc:
Subject: Re: kern/60315: monotonic clock with or without time suspended
Date: Mon, 8 Jun 2026 13:28:03 +0000
This is a multi-part message in MIME format.
--=_arl01tETGp76ibT8eUyNNP7VF0pOsarz
--=_arl01tETGp76ibT8eUyNNP7VF0pOsarz
Content-Type: message/rfc822
Content-Disposition: inline
Date: Mon, 8 Jun 2026 13:17:11 +0000
From: Taylor R Campbell <riastradh%NetBSD.org@localhost>
To: x85729201kza <x85729201kza%outlook.com@localhost>
CC: tech-kern%NetBSD.org@localhost
Subject: Re: Clarification of CLOCK_MONOTONIC
Message-Id: <20260608131712.D059684CD8%mail.netbsd.org@localhost>
In-reply-to:
<TYZPR02MB6044D23AFFD62C5AB5DAA05ED61C2%TYZPR02MB6044.apcprd02.prod.outlook.com@localhost> (x85729201kza%outlook.com@localhost)
MIME-Version: 1.0
Content-Type: text/plain; charset=us-ascii
Content-Transfer-Encoding: quoted-printable
> Date: Mon, 8 Jun 2026 16:59:36 +1000
> From: x85729201kza <x85729201kza%outlook.com@localhost>
>=20
> Of course it doesn't, but this is not the issue. However, unlike
> NetBSD, Linux does document its bizarre behaviour, though, and
> offers what should be CLOCK_MONOTONIC as CLOCK_BOOTTIME (FreeBSD
> also offers this as a synonym of CLOCK_MONOTONIC).
>=20
> So, while I can (and will) experiment with CLOCK_MONOTONIC on
> NetBSD, it would be nice for it to be clarified and documented in
> the correct places.
I filed PR kern/60315: monotonic clock with or without time suspended
<https://gnats.NetBSD.org/60315> to track this.
I reviewed the landscape and found that it is inconsistent:
- FreeBSD, OpenBSD, and macOS include time suspended in
CLOCK_MONOTONIC, but Linux does not.
- FreeBSD>=3D15, OpenBSD, and Linux provide CLOCK_BOOTTIME for time
since boot, incl. suspend, but macOS does not. (FreeBSD 14 defined
CLOCK_BOOTTIME as time running, excl. suspend, by mistake.)
- FreeBSD and OpenBSD provide CLOCK_UPTIME for time running, excl.
suspend, but on Linux that's called CLOCK_MONOTONIC and on macOS
that's called CLOCK_MONOTONIC_RAW.
Full listing and references below.
I suggest we match the current definitions in FreeBSD and OpenBSD for
CLOCK_BOOTTIME and CLOCK_UPTIME:
- CLOCK_BOOTTIME counts time since boot, incl. suspend
- CLOCK_UPTIME counts time running since boot, excl. supsend
I think it is arguable whether CLOCK_MONOTONIC _should_ include or
exclude time suspended. I'm not sure NetBSD is currently consistent
across ports about this.
Either way, I'm tempted to suggest that for CLOCK_MONOTONIC we add a
uniform random nanosecond-resolution offset in [0, 2^62 sec) some time
at boot, maybe before userland starts or after /etc/rc.d/entropy runs.
It'll still meet the POSIX.1-2024 requirements this way, and it will
really emphasize the unspecified nature of the reference point, and
help shake out bugs with 32-bit time_t truncation. The interval of
possible offsets is limited to guarantee that it won't overflow a
signed 64-bit number of seconds for hosts with an uptime shorter than
146 billion years, which I think is a safe assumption.
* POSIX.1-2024
- CLOCK_MONOTONIC counts time since unspecified epoch, without a clear
reference to time suspended. Only requirements are [POSIXTIMEH]
[POSIXCLOCKGETRES]:
. cannot be set via clock_settime()
. cannot have backward clock jumps
. maximum possible clock jump shall be implementation-defined and
must be documented
. measured in seconds and nanoseconds
. reference point does not change after system start-up time
Not changing the reference point after system start-up time could be
construed to require including time suspended. But it's arguable;
the language is certainly not explicit about the point.
History:
1. CLOCK_MONOTONIC was added as optional in Issue 6 (POSIX.1-2001),
based on IEEE Std 1003.1j-2000.
2. CLOCK_MONOTONIC was made mandatory in Issue 8 (POSIX.1-2024).
* FreeBSD [FREEBSD15]
- CLOCK_BOOTTIME counts time since unspecified epoch, incl. suspend
- CLOCK_MONOTONIC counts time since unspecified epoch, incl. suspend
- CLOCK_UPTIME counts time running since unspecified epoch, excl.
suspend
History:
1. CLOCK_UPTIME was introduced in FreeBSD 7 [FREEBSD7], released 2008
2. CLOCK_BOOTTIME was introduced in FreeBSD 14 as an alias for
CLOCK_UPTIME [FREEBSD14], released 2023
3. CLOCK_BOOTTIME was changed in FreeBSD 15 to be an alias for
CLOCK_MONOTONIC [FREEBSD15] [FREEBSDFIXBOOTTIME], released 2025,
prompted in part by [MOZILLATIME]
* OpenBSD [OPENBSD78]
- CLOCK_BOOTTIME counts time since boot, incl. suspend
- CLOCK_MONOTONIC counts time since unspecified epoch, incl. suspend
- CLOCK_UPTIME counts time running since boot, excl. suspend
(Confusingly, the descriptions say: `CLOCK_BOOTTIME The uptime clock.
[...] CLOCK_UPTIME The runtime clock.' But I'm reading out what the
rest of the text, which matches the source code for
clock_gettime(CLOCK_*) defining CLOCK_UPTIME to return nanoruntime and
CLOCK_BOOTTIME and CLOCK_MONOTONIC to return nanouptime
[OPENBSDKERNTIME], while the source code for nanoruntime/binruntime
returns time since boot and the source code for nanouptime/binuptime
returns time since boot minus time suspended [OPENBSDKERNTC].)
History:=20
1. CLOCK_UPTIME was introduced in OpenBSD 5.5, released 2014
2. CLOCK_BOOTTIME was introduced in OpenBSD 6.3, released 2018
* Linux [LINUXCLOCKGETTIME]
- CLOCK_MONOTONIC counts time running since boot, excl. suspend
- CLOCK_BOOTTIME counts time since boot, incl. suspend
History:
1. CLOCK_BOOTTIME was added around 2011 [LINUXBOOTTIME].
* macOS
By hearsay [MOZILLATIME], since I am having trouble finding macOS man
pages on the web, it sounds like:
- CLOCK_MONOTONIC counts time since boot, incl. suspend
- CLOCK_MONOTONIC_RAW counts time running since boot, excl. suspend
History: no idea but macOS probably exposed this distinction to
applications long before anyone else
* Solaris/illumos
Neither SmartOS [SMARTOS] nor Oracle Solaris [SOLARIS11] man pages say
anything about suspend.
* References
[FREEBSD7] https://man.freebsd.org/cgi/man.cgi?query=3Dclock_gettime&apropo=
s=3D0&sektion=3D0&manpath=3DFreeBSD+7.0-RELEASE&format=3Dhtml (https://web.=
archive.org/web/20260608121016/https://man.freebsd.org/cgi/man.cgi?query=3D=
clock_gettime&apropos=3D0&sektion=3D0&manpath=3DFreeBSD+7.0-RELEASE&format=
=3Dhtml)
[FREEBSD14] https://man.freebsd.org/cgi/man.cgi?query=3Dclock_gettime&aprop=
os=3D0&sektion=3D0&manpath=3DFreeBSD+14.0-RELEASE&format=3Dhtml (https://we=
b.archive.org/web/20260608121003/https://man.freebsd.org/cgi/man.cgi?query=
=3Dclock_gettime&apropos=3D0&sektion=3D0&manpath=3DFreeBSD+14.0-RELEASE&for=
mat=3Dhtml)
[FREEBSD15] https://man.freebsd.org/cgi/man.cgi?query=3Dclock_gettime&aprop=
os=3D0&sektion=3D0&manpath=3DFreeBSD+15.0-RELEASE&format=3Dhtml (https://we=
b.archive.org/web/20260608122632/https://man.freebsd.org/cgi/man.cgi?query=
=3Dclock_gettime&apropos=3D0&sektion=3D0&manpath=3DFreeBSD+15.0-RELEASE&for=
mat=3Dhtml)
[FREEBSDFIXBOOTTIME] https://reviews.freebsd.org/D39270 (https://web.archiv=
e.org/web/20251114203158/https://reviews.freebsd.org/D39270)
[LINUXBOOTTIME] https://lwn.net/Articles/429925/ (https://web.archive.org/w=
eb/20260216121206/https://lwn.net/Articles/429925/)
[LINUXCLOCKGETTIME] https://man7.org/linux/man-pages/man3/clock_gettime.3.h=
tml (https://web.archive.org/web/20260604162559/https://man7.org/linux/man-=
pages/man3/clock_gettime.3.html)
[MOZILLATIME] https://bugzilla.mozilla.org/show_bug.cgi?id=3D1824084 (https=
://web.archive.org/web/20240803020239/https://bugzilla.mozilla.org/show_bug=
.cgi?id=3D1824084)
[OPENBSD55] https://man.openbsd.org/OpenBSD-5.5/clock_gettime#DESCRIPTION (=
https://web.archive.org/web/20260608122317/https://man.openbsd.org/OpenBSD-=
5.5/clock_gettime#DESCRIPTION)
[OPENBSD63] https://man.openbsd.org/OpenBSD-6.3/clock_gettime#DESCRIPTION (=
https://web.archive.org/web/20260608122450/https://man.openbsd.org/OpenBSD-=
6.3/clock_gettime#DESCRIPTION)
[OPENBSD78] https://man.openbsd.org/OpenBSD-7.8/clock_gettime#DESCRIPTION (=
https://web.archive.org/web/20260608122547/https://man.openbsd.org/OpenBSD-=
7.8/clock_gettime#DESCRIPTION)
[OPENBSDKERNTC] https://cvsweb.openbsd.org/checkout/src/sys/kern/kern_tc.c,=
v?rev=3D1.84 (https://web.archive.org/web/20260608122930/https://cvsweb.ope=
nbsd.org/checkout/src/sys/kern/kern_tc.c%2Cv?rev=3D1.84)
[OPENBSDKERNTIME] https://cvsweb.openbsd.org/checkout/src/sys/kern/kern_tim=
e.c?rev=3D1.171 (https://web.archive.org/web/20260608122814/https://cvsweb.=
openbsd.org/checkout/src/sys/kern/kern_time.c?rev=3D1.171)
[POSIXCLOCKGETRES] https://pubs.opengroup.org/onlinepubs/9799919799.2024edi=
tion/functions/clock_getres.html (https://web.archive.org/web/2024091803411=
6/https://pubs.opengroup.org/onlinepubs/9799919799.2024edition/functions/cl=
ock_getres.html)
[POSIXTIMEH] https://pubs.opengroup.org/onlinepubs/9799919799.2024edition/b=
asedefs/time.h.html (https://web.archive.org/web/20260305210410/https://pub=
s.opengroup.org/onlinepubs/9799919799.2024edition/basedefs/time.h.html)
[SMARTOS] https://smartos.org/man/3C/clock_gettime (https://web.archive.org=
/web/20260608120951/https://smartos.org/man/3C/clock_gettime)
[SOLARIS11] https://docs.oracle.com/cd/E23824_01/html/821-1465/clock-gettim=
e-3c.html (https://web.archive.org/web/20260316162548/https://docs.oracle.c=
om/cd/E23824_01/html/821-1465/clock-gettime-3c.html)
--=_arl01tETGp76ibT8eUyNNP7VF0pOsarz--
Home |
Main Index |
Thread Index |
Old Index