* [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
@ 2023-03-06 16:03 Adhemerval Zanella
2023-03-07 11:11 ` Florian Weimer
0 siblings, 1 reply; 15+ messages in thread
From: Adhemerval Zanella @ 2023-03-06 16:03 UTC (permalink / raw)
To: libc-alpha, Bruno Haible, Florian Weimer
Different than gettimeofday and timespec_get, time uses
CLOCK_REALTIME_COARSE instead of CLOCK_REALTIME on Linux. The
coarse time is used mostly as optimization, but it may show
divergence progression due the clock resolution.
For x86_64 and powerpc64, it should add slight more latency since
it would call now clock_gettime internally.
Checked on x86_64-linux-gnu.
---
include/time.h | 5 ++-
manual/time.texi | 4 +--
sysdeps/generic/time-clockid.h | 20 ------------
sysdeps/mach/hurd/bits/errno.h | 1 -
sysdeps/unix/sysv/linux/dl-vdso-setup.c | 3 --
sysdeps/unix/sysv/linux/dl-vdso-setup.h | 3 --
sysdeps/unix/sysv/linux/i386/sysdep.h | 1 -
sysdeps/unix/sysv/linux/powerpc/sysdep.h | 1 -
sysdeps/unix/sysv/linux/powerpc/time.c | 22 -------------
sysdeps/unix/sysv/linux/time-clockid.h | 22 -------------
sysdeps/unix/sysv/linux/time.c | 41 +++---------------------
sysdeps/unix/sysv/linux/x86/time.c | 22 -------------
sysdeps/unix/sysv/linux/x86_64/sysdep.h | 1 -
time/time.c | 3 +-
14 files changed, 8 insertions(+), 141 deletions(-)
delete mode 100644 sysdeps/generic/time-clockid.h
delete mode 100644 sysdeps/unix/sysv/linux/powerpc/time.c
delete mode 100644 sysdeps/unix/sysv/linux/time-clockid.h
delete mode 100644 sysdeps/unix/sysv/linux/x86/time.c
diff --git a/include/time.h b/include/time.h
index f599eeed4e..2b27dc87cf 100644
--- a/include/time.h
+++ b/include/time.h
@@ -9,7 +9,6 @@
# include <stdbool.h>
# include <time/mktime-internal.h>
# include <sys/time.h>
-# include <time-clockid.h>
# include <sys/time.h>
# include <stdint.h>
@@ -524,7 +523,7 @@ static inline time_t
time_now (void)
{
struct timespec ts;
- __clock_gettime (TIME_CLOCK_GETTIME_CLOCKID, &ts);
+ __clock_gettime (CLOCK_REALTIME, &ts);
return ts.tv_sec;
}
@@ -532,7 +531,7 @@ static inline __time64_t
time64_now (void)
{
struct __timespec64 ts;
- __clock_gettime64 (TIME_CLOCK_GETTIME_CLOCKID, &ts);
+ __clock_gettime64 (CLOCK_REALTIME, &ts);
return ts.tv_sec;
}
diff --git a/manual/time.texi b/manual/time.texi
index 0c7a942b4c..e42198522b 100644
--- a/manual/time.texi
+++ b/manual/time.texi
@@ -442,9 +442,7 @@ calendar time, with different levels of resolution.
This is the simplest function for getting the current calendar time.
It returns the calendar time as a value of type @code{time_t}; on
POSIX systems, that means it has a resolution of one second. It
-uses the same clock as @w{@samp{clock_gettime (CLOCK_REALTIME_COARSE)}},
-when the clock is available or @w{@samp{clock_gettime (CLOCK_REALTIME)}}
-otherwise.
+uses the same clock as @w{@samp{clock_gettime (CLOCK_REALTIME)}}.
If the argument @var{result} is not a null pointer, the calendar time
value is also stored in @code{*@var{result}}.
diff --git a/sysdeps/generic/time-clockid.h b/sysdeps/generic/time-clockid.h
deleted file mode 100644
index 21f1235a31..0000000000
--- a/sysdeps/generic/time-clockid.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/* System specific time definitions. Generic Version.
- Copyright 2019-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-/* Timer used on clock_gettime for time implementation. */
-#define TIME_CLOCK_GETTIME_CLOCKID CLOCK_REALTIME
diff --git a/sysdeps/mach/hurd/bits/errno.h b/sysdeps/mach/hurd/bits/errno.h
index 90c8897739..0d935e724a 100644
--- a/sysdeps/mach/hurd/bits/errno.h
+++ b/sysdeps/mach/hurd/bits/errno.h
@@ -9,7 +9,6 @@
mach/boolean.h
mach/i386/boolean.h
mach/i386/vm_types.h
- mach/i386/stdint.h
mach/mig_errors.h
device/device_types.h
mach/std_types.h
diff --git a/sysdeps/unix/sysv/linux/dl-vdso-setup.c b/sysdeps/unix/sysv/linux/dl-vdso-setup.c
index 68fa8de641..895c24133e 100644
--- a/sysdeps/unix/sysv/linux/dl-vdso-setup.c
+++ b/sysdeps/unix/sysv/linux/dl-vdso-setup.c
@@ -52,9 +52,6 @@ PROCINFO_CLASS int (*_dl_vdso_clock_gettime64) (clockid_t,
# ifdef HAVE_GETTIMEOFDAY_VSYSCALL
PROCINFO_CLASS int (*_dl_vdso_gettimeofday) (struct timeval *, void *) RELRO;
#endif
-# ifdef HAVE_TIME_VSYSCALL
-PROCINFO_CLASS time_t (*_dl_vdso_time) (time_t *) RELRO;
-# endif
# ifdef HAVE_GETCPU_VSYSCALL
PROCINFO_CLASS int (*_dl_vdso_getcpu) (unsigned *, unsigned *, void *) RELRO;
# endif
diff --git a/sysdeps/unix/sysv/linux/dl-vdso-setup.h b/sysdeps/unix/sysv/linux/dl-vdso-setup.h
index 867072b897..1f29708e93 100644
--- a/sysdeps/unix/sysv/linux/dl-vdso-setup.h
+++ b/sysdeps/unix/sysv/linux/dl-vdso-setup.h
@@ -32,9 +32,6 @@ setup_vdso_pointers (void)
#ifdef HAVE_GETTIMEOFDAY_VSYSCALL
GLRO(dl_vdso_gettimeofday) = dl_vdso_vsym (HAVE_GETTIMEOFDAY_VSYSCALL);
#endif
-#ifdef HAVE_TIME_VSYSCALL
- GLRO(dl_vdso_time) = dl_vdso_vsym (HAVE_TIME_VSYSCALL);
-#endif
#ifdef HAVE_GETCPU_VSYSCALL
GLRO(dl_vdso_getcpu) = dl_vdso_vsym (HAVE_GETCPU_VSYSCALL);
#endif
diff --git a/sysdeps/unix/sysv/linux/i386/sysdep.h b/sysdeps/unix/sysv/linux/i386/sysdep.h
index 8538cd5342..77c37a33d3 100644
--- a/sysdeps/unix/sysv/linux/i386/sysdep.h
+++ b/sysdeps/unix/sysv/linux/i386/sysdep.h
@@ -256,7 +256,6 @@ struct libc_do_syscall_args
# define HAVE_CLOCK_GETTIME_VSYSCALL "__vdso_clock_gettime"
# define HAVE_CLOCK_GETTIME64_VSYSCALL "__vdso_clock_gettime64"
# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
-# define HAVE_TIME_VSYSCALL "__vdso_time"
# define HAVE_CLOCK_GETRES_VSYSCALL "__vdso_clock_getres"
# define HAVE_CLONE3_WRAPPER 1
diff --git a/sysdeps/unix/sysv/linux/powerpc/sysdep.h b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
index 96a0edc38f..59cda57639 100644
--- a/sysdeps/unix/sysv/linux/powerpc/sysdep.h
+++ b/sysdeps/unix/sysv/linux/powerpc/sysdep.h
@@ -220,7 +220,6 @@
#define HAVE_CLOCK_GETTIME_VSYSCALL "__kernel_clock_gettime"
#endif
#define HAVE_GETCPU_VSYSCALL "__kernel_getcpu"
-#define HAVE_TIME_VSYSCALL "__kernel_time"
#define HAVE_GETTIMEOFDAY_VSYSCALL "__kernel_gettimeofday"
#define HAVE_GET_TBFREQ "__kernel_get_tbfreq"
diff --git a/sysdeps/unix/sysv/linux/powerpc/time.c b/sysdeps/unix/sysv/linux/powerpc/time.c
deleted file mode 100644
index 0318a7a93d..0000000000
--- a/sysdeps/unix/sysv/linux/powerpc/time.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* time system call for Linux/PowerPC.
- Copyright (C) 2013-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifdef __powerpc64__
-# define USE_IFUNC_TIME
-#endif
-#include <sysdeps/unix/sysv/linux/time.c>
diff --git a/sysdeps/unix/sysv/linux/time-clockid.h b/sysdeps/unix/sysv/linux/time-clockid.h
deleted file mode 100644
index b9ff418ecb..0000000000
--- a/sysdeps/unix/sysv/linux/time-clockid.h
+++ /dev/null
@@ -1,22 +0,0 @@
-/* System specific time definitions. Generic Version.
- Copyright 2019-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-/* Timer used on clock_gettime for time implementation. For Linux
- it uses the coarse version which returns the time at the last tick
- and mimic what time as syscall should return. */
-#define TIME_CLOCK_GETTIME_CLOCKID CLOCK_REALTIME_COARSE
diff --git a/sysdeps/unix/sysv/linux/time.c b/sysdeps/unix/sysv/linux/time.c
index a0e7fd7ac2..0480b5a782 100644
--- a/sysdeps/unix/sysv/linux/time.c
+++ b/sysdeps/unix/sysv/linux/time.c
@@ -16,40 +16,8 @@
License along with the GNU C Library; if not, see
<https://www.gnu.org/licenses/>. */
-/* Optimize the function call by setting the PLT directly to vDSO symbol. */
-#ifdef USE_IFUNC_TIME
-# include <time.h>
-# include <sysdep.h>
-# include <sysdep-vdso.h>
-
-#ifdef SHARED
-# include <dl-vdso.h>
-# include <libc-vdso.h>
-
-static time_t
-time_syscall (time_t *t)
-{
- return INLINE_SYSCALL_CALL (time, t);
-}
-
-# undef INIT_ARCH
-# define INIT_ARCH() \
- void *vdso_time = dl_vdso_vsym (HAVE_TIME_VSYSCALL);
-libc_ifunc (time,
- vdso_time ? VDSO_IFUNC_RET (vdso_time)
- : (void *) time_syscall);
-
-# else
-time_t
-time (time_t *t)
-{
- return INLINE_VSYSCALL (time, 1, t);
-}
-# endif /* !SHARED */
-#else /* USE_IFUNC_TIME */
-# include <time.h>
-# include <time-clockid.h>
-# include <errno.h>
+#include <time.h>
+#include <errno.h>
/* Return the time now, and store it in *TIMER if not NULL. */
@@ -57,7 +25,7 @@ __time64_t
__time64 (__time64_t *timer)
{
struct __timespec64 ts;
- __clock_gettime64 (TIME_CLOCK_GETTIME_CLOCKID, &ts);
+ __clock_gettime64 (CLOCK_REALTIME, &ts);
if (timer != NULL)
*timer = ts.tv_sec;
@@ -82,6 +50,5 @@ __time (time_t *timer)
*timer = t;
return t;
}
-# endif
-weak_alias (__time, time)
#endif
+weak_alias (__time, time)
diff --git a/sysdeps/unix/sysv/linux/x86/time.c b/sysdeps/unix/sysv/linux/x86/time.c
deleted file mode 100644
index aac2fbc4d1..0000000000
--- a/sysdeps/unix/sysv/linux/x86/time.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/* time -- Get number of seconds since Epoch. Linux/x86 version.
- Copyright (C) 2015-2023 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <https://www.gnu.org/licenses/>. */
-
-#ifdef __x86_64__
-# define USE_IFUNC_TIME
-#endif
-#include <sysdeps/unix/sysv/linux/time.c>
diff --git a/sysdeps/unix/sysv/linux/x86_64/sysdep.h b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
index cfb51be8c5..6a8d610238 100644
--- a/sysdeps/unix/sysv/linux/x86_64/sysdep.h
+++ b/sysdeps/unix/sysv/linux/x86_64/sysdep.h
@@ -373,7 +373,6 @@
/* List of system calls which are supported as vsyscalls. */
# define HAVE_CLOCK_GETTIME64_VSYSCALL "__vdso_clock_gettime"
# define HAVE_GETTIMEOFDAY_VSYSCALL "__vdso_gettimeofday"
-# define HAVE_TIME_VSYSCALL "__vdso_time"
# define HAVE_GETCPU_VSYSCALL "__vdso_getcpu"
# define HAVE_CLOCK_GETRES64_VSYSCALL "__vdso_clock_getres"
diff --git a/time/time.c b/time/time.c
index 6713bbf452..a37fd2571b 100644
--- a/time/time.c
+++ b/time/time.c
@@ -16,14 +16,13 @@
<https://www.gnu.org/licenses/>. */
#include <time.h>
-#include <time-clockid.h>
/* Return the time now, and store it in *TIMER if not NULL. */
time_t
time (time_t *timer)
{
struct timespec ts;
- __clock_gettime (TIME_CLOCK_GETTIME_CLOCKID, &ts);
+ __clock_gettime (CLOCK_REALTIME, &ts);
if (timer)
*timer = ts.tv_sec;
--
2.34.1
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-06 16:03 [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200) Adhemerval Zanella
@ 2023-03-07 11:11 ` Florian Weimer
2023-03-07 11:45 ` Adhemerval Zanella Netto
0 siblings, 1 reply; 15+ messages in thread
From: Florian Weimer @ 2023-03-07 11:11 UTC (permalink / raw)
To: Adhemerval Zanella; +Cc: libc-alpha, Bruno Haible
* Adhemerval Zanella:
> Different than gettimeofday and timespec_get, time uses
> CLOCK_REALTIME_COARSE instead of CLOCK_REALTIME on Linux. The
> coarse time is used mostly as optimization, but it may show
> divergence progression due the clock resolution.
>
> For x86_64 and powerpc64, it should add slight more latency since
> it would call now clock_gettime internally.
It seems really significant on x86-64.
Before:
min: 14 ns
25%: 16 ns
50%: 17 ns
75%: 17 ns
95%: 18 ns
99%: 18 ns
max: 18722 ns
avg: 16.6606 ns
After:
min: 29 ns
25%: 31 ns
50%: 31 ns
75%: 32 ns
95%: 32 ns
99%: 33 ns
max: 12161 ns
avg: 31.2205 ns
And of those original 17 ns, quite a bit is overhead from the
benchmarking loop. I guess applications could work around it by having
a background timer thread that increments a global variable and use that
instead of the time function call, but that seems not a great approach.
Based on previous feedback, I expect we'd have to carry a downstream
revert of this patch indefinitely, so I'm rather strongly against
applying it upstrean.
Thanks,
Florian
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-07 11:11 ` Florian Weimer
@ 2023-03-07 11:45 ` Adhemerval Zanella Netto
2023-03-07 11:51 ` Florian Weimer
0 siblings, 1 reply; 15+ messages in thread
From: Adhemerval Zanella Netto @ 2023-03-07 11:45 UTC (permalink / raw)
To: Florian Weimer; +Cc: libc-alpha, Bruno Haible
On 07/03/23 08:11, Florian Weimer wrote:
> * Adhemerval Zanella:
>
>> Different than gettimeofday and timespec_get, time uses
>> CLOCK_REALTIME_COARSE instead of CLOCK_REALTIME on Linux. The
>> coarse time is used mostly as optimization, but it may show
>> divergence progression due the clock resolution.
>>
>> For x86_64 and powerpc64, it should add slight more latency since
>> it would call now clock_gettime internally.
>
> It seems really significant on x86-64.
>
> Before:
>
> min: 14 ns
> 25%: 16 ns
> 50%: 17 ns
> 75%: 17 ns
> 95%: 18 ns
> 99%: 18 ns
> max: 18722 ns
> avg: 16.6606 ns
>
> After:
>
> min: 29 ns
> 25%: 31 ns
> 50%: 31 ns
> 75%: 32 ns
> 95%: 32 ns
> 99%: 33 ns
> max: 12161 ns
> avg: 31.2205 ns
>
> And of those original 17 ns, quite a bit is overhead from the
> benchmarking loop. I guess applications could work around it by having
> a background timer thread that increments a global variable and use that
> instead of the time function call, but that seems not a great approach.
Yes, this is expected since time call will be route through clock_gettime.
Another fix would be to convince kernels developers to use CLOCK_REALTIME
on vDSO as well.
>
> Based on previous feedback, I expect we'd have to carry a downstream
> revert of this patch indefinitely, so I'm rather strongly against
> applying it upstrean.
To me it really seems like a over-optimization specially because 'time'
has only second resolution.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-07 11:45 ` Adhemerval Zanella Netto
@ 2023-03-07 11:51 ` Florian Weimer
2023-03-07 11:57 ` Adhemerval Zanella Netto
0 siblings, 1 reply; 15+ messages in thread
From: Florian Weimer @ 2023-03-07 11:51 UTC (permalink / raw)
To: Adhemerval Zanella Netto; +Cc: libc-alpha, Bruno Haible
* Adhemerval Zanella Netto:
>> And of those original 17 ns, quite a bit is overhead from the
>> benchmarking loop. I guess applications could work around it by having
>> a background timer thread that increments a global variable and use that
>> instead of the time function call, but that seems not a great approach.
>
> Yes, this is expected since time call will be route through clock_gettime.
> Another fix would be to convince kernels developers to use CLOCK_REALTIME
> on vDSO as well.
No, that won't help. I think the crucial aspect for good x86-64
performance is that by using the time entry point, we tell the kernel
that it does not have to obtain microsecond or millisecond precision.
>> Based on previous feedback, I expect we'd have to carry a downstream
>> revert of this patch indefinitely, so I'm rather strongly against
>> applying it upstrean.
>
> To me it really seems like a over-optimization specially because 'time'
> has only second resolution.
I'm afraid that this will impact logging performance significantly in
some scenarios.
Thanks,
Florian
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-07 11:51 ` Florian Weimer
@ 2023-03-07 11:57 ` Adhemerval Zanella Netto
2023-03-07 12:07 ` Florian Weimer
0 siblings, 1 reply; 15+ messages in thread
From: Adhemerval Zanella Netto @ 2023-03-07 11:57 UTC (permalink / raw)
To: Florian Weimer; +Cc: libc-alpha, Bruno Haible
On 07/03/23 08:51, Florian Weimer wrote:
> * Adhemerval Zanella Netto:
>
>>> And of those original 17 ns, quite a bit is overhead from the
>>> benchmarking loop. I guess applications could work around it by having
>>> a background timer thread that increments a global variable and use that
>>> instead of the time function call, but that seems not a great approach.
>>
>> Yes, this is expected since time call will be route through clock_gettime.
>> Another fix would be to convince kernels developers to use CLOCK_REALTIME
>> on vDSO as well.
>
> No, that won't help. I think the crucial aspect for good x86-64
> performance is that by using the time entry point, we tell the kernel
> that it does not have to obtain microsecond or millisecond precision.
>
>>> Based on previous feedback, I expect we'd have to carry a downstream
>>> revert of this patch indefinitely, so I'm rather strongly against
>>> applying it upstrean.
>>
>> To me it really seems like a over-optimization specially because 'time'
>> has only second resolution.
>
> I'm afraid that this will impact logging performance significantly in
> some scenarios.
Alright, so I think we should close BZ#30200 as wontfix and state it is
done for performance reasons.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-07 11:57 ` Adhemerval Zanella Netto
@ 2023-03-07 12:07 ` Florian Weimer
2023-03-08 5:51 ` Paul Eggert
0 siblings, 1 reply; 15+ messages in thread
From: Florian Weimer @ 2023-03-07 12:07 UTC (permalink / raw)
To: Adhemerval Zanella Netto; +Cc: libc-alpha, Bruno Haible
* Adhemerval Zanella Netto:
> Alright, so I think we should close BZ#30200 as wontfix and state it is
> done for performance reasons.
Probably RESOLVED/MOVED because we get whatever time the kernel
provides. It seems a deliberate kernel decision to me.
Thanks,
Florian
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-07 12:07 ` Florian Weimer
@ 2023-03-08 5:51 ` Paul Eggert
2023-03-08 8:59 ` Florian Weimer
2023-03-08 16:23 ` Bruno Haible
0 siblings, 2 replies; 15+ messages in thread
From: Paul Eggert @ 2023-03-08 5:51 UTC (permalink / raw)
To: Florian Weimer, Adhemerval Zanella Netto; +Cc: libc-alpha, Bruno Haible
On 2023-03-07 04:07, Florian Weimer via Libc-alpha wrote:
> Probably RESOLVED/MOVED because we get whatever time the kernel
> provides. It seems a deliberate kernel decision to me.
For my own information, is 'time' the only standard function that uses a
clock other than CLOCK_REALTIME and so can be out-of-sync with
timespec_get? What about gettimeofday, futimens with UTIME_NOW, or
timestamps set by modifying files?
My idea is to go through the apps I help maintain, and make sure that
they never call 'time' anywhere that it's important that a timestamp be
in sync with with the rest of the system, since Glibc 'time' is out of
sync in that way.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-08 5:51 ` Paul Eggert
@ 2023-03-08 8:59 ` Florian Weimer
2023-03-08 23:08 ` Paul Eggert
2023-03-08 16:23 ` Bruno Haible
1 sibling, 1 reply; 15+ messages in thread
From: Florian Weimer @ 2023-03-08 8:59 UTC (permalink / raw)
To: Paul Eggert; +Cc: Adhemerval Zanella Netto, libc-alpha, Bruno Haible
* Paul Eggert:
> On 2023-03-07 04:07, Florian Weimer via Libc-alpha wrote:
>> Probably RESOLVED/MOVED because we get whatever time the kernel
>> provides. It seems a deliberate kernel decision to me.
>
> For my own information, is 'time' the only standard function that uses
> a clock other than CLOCK_REALTIME and so can be out-of-sync with
> timespec_get? What about gettimeofday, futimens with UTIME_NOW, or
> timestamps set by modifying files?
Even if the same underlying clock is used, rounding may cause interface
which use different precision for the fractional seconds part to report
different integral seconds. The standard does not require rounding
towards minus infinity.
Thanks,
Florian
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-08 5:51 ` Paul Eggert
2023-03-08 8:59 ` Florian Weimer
@ 2023-03-08 16:23 ` Bruno Haible
2023-03-08 16:57 ` Adhemerval Zanella Netto
1 sibling, 1 reply; 15+ messages in thread
From: Bruno Haible @ 2023-03-08 16:23 UTC (permalink / raw)
To: Florian Weimer, Adhemerval Zanella Netto, Paul Eggert; +Cc: libc-alpha
Paul Eggert wrote:
> My idea is to go through the apps I help maintain, and make sure that
> they never call 'time' anywhere that it's important that a timestamp be
> in sync with with the rest of the system
Alternatively, these applications can continue to call 'time', if the
package uses the Gnulib module 'time' that provides a workaround against
https://sourceware.org/bugzilla/show_bug.cgi?id=30200 .
Bruno
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-08 16:23 ` Bruno Haible
@ 2023-03-08 16:57 ` Adhemerval Zanella Netto
2023-03-08 17:09 ` Florian Weimer
2023-03-08 17:44 ` Bruno Haible
0 siblings, 2 replies; 15+ messages in thread
From: Adhemerval Zanella Netto @ 2023-03-08 16:57 UTC (permalink / raw)
To: Bruno Haible, Florian Weimer, Paul Eggert; +Cc: libc-alpha
On 08/03/23 13:23, Bruno Haible wrote:
> Paul Eggert wrote:
>> My idea is to go through the apps I help maintain, and make sure that
>> they never call 'time' anywhere that it's important that a timestamp be
>> in sync with with the rest of the system
>
> Alternatively, these applications can continue to call 'time', if the
> package uses the Gnulib module 'time' that provides a workaround against
> https://sourceware.org/bugzilla/show_bug.cgi?id=30200 .
>
> Bruno
Florian, do you really think that and latency increase of roughly 15ns
is really worth all the trouble gnulib is pushing? It means that we will
end up with programs that use CLOCK_REALTIME, while other use
CLOCK_REALTIME_COURSE.
If users really to squeeze more performance, they can use clock_gettime
with CLOCK_REALTIME_COURSE. It should have similar performance to
time vDSO.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-08 16:57 ` Adhemerval Zanella Netto
@ 2023-03-08 17:09 ` Florian Weimer
2023-03-08 17:46 ` Adhemerval Zanella Netto
2023-03-08 17:44 ` Bruno Haible
1 sibling, 1 reply; 15+ messages in thread
From: Florian Weimer @ 2023-03-08 17:09 UTC (permalink / raw)
To: Adhemerval Zanella Netto; +Cc: Bruno Haible, Paul Eggert, libc-alpha
* Adhemerval Zanella Netto:
> On 08/03/23 13:23, Bruno Haible wrote:
>> Paul Eggert wrote:
>>> My idea is to go through the apps I help maintain, and make sure that
>>> they never call 'time' anywhere that it's important that a timestamp be
>>> in sync with with the rest of the system
>>
>> Alternatively, these applications can continue to call 'time', if the
>> package uses the Gnulib module 'time' that provides a workaround against
>> https://sourceware.org/bugzilla/show_bug.cgi?id=30200 .
>>
>> Bruno
>
> Florian, do you really think that and latency increase of roughly 15ns
> is really worth all the trouble gnulib is pushing? It means that we will
> end up with programs that use CLOCK_REALTIME, while other use
> CLOCK_REALTIME_COURSE.
>
> If users really to squeeze more performance, they can use clock_gettime
> with CLOCK_REALTIME_COURSE. It should have similar performance to
> time vDSO.
Eh, I think the difference derives from using the time vDSO entrypoint
(which your patch removed as well on x86-64). I don't see a performance
difference between CLOCK_REALTIME and CLOCK_REALTIME_COARSE, so that's
not it.
Thanks,
Florian
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-08 16:57 ` Adhemerval Zanella Netto
2023-03-08 17:09 ` Florian Weimer
@ 2023-03-08 17:44 ` Bruno Haible
2023-03-08 17:50 ` Adhemerval Zanella Netto
1 sibling, 1 reply; 15+ messages in thread
From: Bruno Haible @ 2023-03-08 17:44 UTC (permalink / raw)
To: Florian Weimer, Paul Eggert, Adhemerval Zanella Netto; +Cc: libc-alpha
[-- Attachment #1: Type: text/plain, Size: 1015 bytes --]
Adhemerval Zanella Netto wrote:
> ... all the trouble gnulib is pushing?
The trouble does not originate in gnulib; it originate through the
use of inconsistent time APIs.
On a typical system, there are
- hundreds of programs that call gettimeofday() or timespec_get(),
- hundreds of programs that call time().
Find attached the lists of programs in /usr/bin on my machine:
- 425 programs that call gettimeofday() or timespec_get(),
- 730 programs that call time().
Each time a program calls gettimeofday() or timespec_get(), and then,
within 1 to 3 milliseconds, a program (the same or a different one)
calls time(), there is the potential for trouble because the time
appears to go backwards. This trouble can occur with probability
between 0.1% and 0.3%, according to the data in
https://sourceware.org/bugzilla/show_bug.cgi?id=30200 .
Gnulib attempts to reduce the trouble for specific programs, by
moving them from the "call time()" camp to the "call gettimeofday() or
timespec_get()" camp.
Bruno
[-- Attachment #2: callers-of-time --]
[-- Type: text/plain, Size: 17628 bytes --]
/usr/bin/aarch64-linux-gnu-as
/usr/bin/aarch64-linux-gnu-cpp
/usr/bin/aarch64-linux-gnu-cpp-11
/usr/bin/aarch64-linux-gnu-g++
/usr/bin/aarch64-linux-gnu-g++-11
/usr/bin/aarch64-linux-gnu-gcc
/usr/bin/aarch64-linux-gnu-gcc-11
/usr/bin/aarch64-linux-gnu-gcov
/usr/bin/aarch64-linux-gnu-gcov-11
/usr/bin/aarch64-linux-gnu-gcov-dump
/usr/bin/aarch64-linux-gnu-gcov-dump-11
/usr/bin/aarch64-linux-gnu-gcov-tool
/usr/bin/aarch64-linux-gnu-gcov-tool-11
/usr/bin/aarch64-linux-gnu-lto-dump-11
/usr/bin/ab
/usr/bin/afl-fuzz
/usr/bin/airscan-discover
/usr/bin/akonadi_pop3_resource
/usr/bin/aleph
/usr/bin/alpha-linux-gnu-as
/usr/bin/alpha-linux-gnu-cpp
/usr/bin/alpha-linux-gnu-cpp-11
/usr/bin/alpha-linux-gnu-g++
/usr/bin/alpha-linux-gnu-g++-11
/usr/bin/alpha-linux-gnu-gcc
/usr/bin/alpha-linux-gnu-gcc-11
/usr/bin/alpha-linux-gnu-gcov
/usr/bin/alpha-linux-gnu-gcov-11
/usr/bin/alpha-linux-gnu-gcov-dump
/usr/bin/alpha-linux-gnu-gcov-dump-11
/usr/bin/alpha-linux-gnu-gcov-tool
/usr/bin/alpha-linux-gnu-gcov-tool-11
/usr/bin/alpha-linux-gnu-lto-dump-11
/usr/bin/aplay
/usr/bin/apt-ftparchive
/usr/bin/aptitude
/usr/bin/aptitude-curses
/usr/bin/arecord
/usr/bin/arj
/usr/bin/arm-linux-gnueabi-as
/usr/bin/arm-linux-gnueabi-cpp
/usr/bin/arm-linux-gnueabi-cpp-11
/usr/bin/arm-linux-gnueabi-g++
/usr/bin/arm-linux-gnueabi-g++-11
/usr/bin/arm-linux-gnueabi-gcc
/usr/bin/arm-linux-gnueabi-gcc-11
/usr/bin/arm-linux-gnueabi-gcov
/usr/bin/arm-linux-gnueabi-gcov-11
/usr/bin/arm-linux-gnueabi-gcov-dump
/usr/bin/arm-linux-gnueabi-gcov-dump-11
/usr/bin/arm-linux-gnueabi-gcov-tool
/usr/bin/arm-linux-gnueabi-gcov-tool-11
/usr/bin/arm-linux-gnueabihf-as
/usr/bin/arm-linux-gnueabihf-cpp
/usr/bin/arm-linux-gnueabihf-cpp-11
/usr/bin/arm-linux-gnueabihf-g++
/usr/bin/arm-linux-gnueabihf-g++-11
/usr/bin/arm-linux-gnueabihf-gcc
/usr/bin/arm-linux-gnueabihf-gcc-11
/usr/bin/arm-linux-gnueabihf-gcov
/usr/bin/arm-linux-gnueabihf-gcov-11
/usr/bin/arm-linux-gnueabihf-gcov-dump
/usr/bin/arm-linux-gnueabihf-gcov-dump-11
/usr/bin/arm-linux-gnueabihf-gcov-tool
/usr/bin/arm-linux-gnueabihf-gcov-tool-11
/usr/bin/arm-linux-gnueabihf-lto-dump-11
/usr/bin/arm-linux-gnueabi-lto-dump-11
/usr/bin/as
/usr/bin/awk
/usr/bin/bash
/usr/bin/bison
/usr/bin/bsdcpio
/usr/bin/bsdtar
/usr/bin/btrfs
/usr/bin/btrfsck
/usr/bin/btrfs-convert
/usr/bin/btrfs-find-root
/usr/bin/btrfs-image
/usr/bin/btrfs-map-logical
/usr/bin/btrfs-select-super
/usr/bin/btrfstune
/usr/bin/c++
/usr/bin/cabal
/usr/bin/cacaclock
/usr/bin/cal
/usr/bin/cc
/usr/bin/cdrdao
/usr/bin/chage
/usr/bin/class-11d.x
/usr/bin/class-4d.x
/usr/bin/class-5d.x
/usr/bin/class-6d.x
/usr/bin/class.x
/usr/bin/cli
/usr/bin/cli-ildasm
/usr/bin/cmake
/usr/bin/cpack
/usr/bin/cpio
/usr/bin/cpp
/usr/bin/cpp-11
/usr/bin/crontab
/usr/bin/cryfs
/usr/bin/cryfs-unmount
/usr/bin/ctest
/usr/bin/curl
/usr/bin/date
/usr/bin/db5.3_checkpoint
/usr/bin/db5.3_deadlock
/usr/bin/db5.3_hotbackup
/usr/bin/db5.3_recover
/usr/bin/db5.3_replicate
/usr/bin/db_checkpoint
/usr/bin/db_deadlock
/usr/bin/db_hotbackup
/usr/bin/db_recover
/usr/bin/db_replicate
/usr/bin/debian-distro-info
/usr/bin/dig
/usr/bin/dirmngr
/usr/bin/dirmngr-client
/usr/bin/distro-info
/usr/bin/dmesg
/usr/bin/dpkg
/usr/bin/dpkg-deb
/usr/bin/dpkg-divert
/usr/bin/dpkg-query
/usr/bin/dpkg-split
/usr/bin/dumpimage
/usr/bin/dvilualatex
/usr/bin/dvilualatex-dev
/usr/bin/dviluatex
/usr/bin/dvipdfm
/usr/bin/dvipdfmx
/usr/bin/dvipos
/usr/bin/dvips
/usr/bin/dvisvgm
/usr/bin/dvitomp
/usr/bin/ebb
/usr/bin/ecm
/usr/bin/editor
/usr/bin/encfs
/usr/bin/eptex
/usr/bin/etex
/usr/bin/euptex
/usr/bin/ex
/usr/bin/expiry
/usr/bin/extractbb
/usr/bin/f77
/usr/bin/f95
/usr/bin/faillog
/usr/bin/faked-sysv
/usr/bin/ffmpeg
/usr/bin/ffplay
/usr/bin/ffprobe
/usr/bin/find
/usr/bin/fiwalk
/usr/bin/fluid
/usr/bin/fonttosfnt
/usr/bin/foo2ddst
/usr/bin/foo2hiperc
/usr/bin/foo2lava
/usr/bin/foo2oak
/usr/bin/foo2qpdl
/usr/bin/foo2xqx
/usr/bin/foo2zjs
/usr/bin/foomatic-rip
/usr/bin/g++
/usr/bin/g++-11
/usr/bin/gawk
/usr/bin/gcal
/usr/bin/gcc
/usr/bin/gcc-11
/usr/bin/gdb
/usr/bin/gdb-multiarch
/usr/bin/gdc
/usr/bin/gdc-11
/usr/bin/gdomap
/usr/bin/genisoimage
/usr/bin/genrb
/usr/bin/gfan
/usr/bin/gfan_bases
/usr/bin/gfan_buchberger
/usr/bin/gfan_combinerays
/usr/bin/gfan_doesidealcontain
/usr/bin/gfan_fancommonrefinement
/usr/bin/gfan_fanhomology
/usr/bin/gfan_fanisbalanced
/usr/bin/gfan_fanlink
/usr/bin/gfan_fanproduct
/usr/bin/gfan_fansubfan
/usr/bin/gfan_genericlinearchange
/usr/bin/gfan_groebnercone
/usr/bin/gfan_groebnerfan
/usr/bin/gfan_homogeneityspace
/usr/bin/gfan_homogenize
/usr/bin/gfan_initialforms
/usr/bin/gfan_interactive
/usr/bin/gfan_ismarkedgroebnerbasis
/usr/bin/gfan_krulldimension
/usr/bin/gfan_latticeideal
/usr/bin/gfan_leadingterms
/usr/bin/gfan_list
/usr/bin/gfan_markpolynomialset
/usr/bin/gfan_minkowskisum
/usr/bin/gfan_minors
/usr/bin/gfan_mixedvolume
/usr/bin/gfan_overintegers
/usr/bin/gfan_padic
/usr/bin/gfan_polynomialsetunion
/usr/bin/gfan_render
/usr/bin/gfan_renderstaircase
/usr/bin/gfan_resultantfan
/usr/bin/gfan_saturation
/usr/bin/gfan_secondaryfan
/usr/bin/gfan_stats
/usr/bin/gfan_substitute
/usr/bin/gfan_symmetries
/usr/bin/gfan_tolatex
/usr/bin/gfan_topolyhedralfan
/usr/bin/gfan_tropicalbasis
/usr/bin/gfan_tropicalbruteforce
/usr/bin/gfan_tropicalcurve
/usr/bin/gfan_tropicalevaluation
/usr/bin/gfan_tropicalfunction
/usr/bin/gfan_tropicalhypersurface
/usr/bin/gfan_tropicalintersection
/usr/bin/gfan_tropicallifting
/usr/bin/gfan_tropicallinearspace
/usr/bin/gfan_tropicalmultiplicity
/usr/bin/gfan_tropicalrank
/usr/bin/gfan_tropicalstartingcone
/usr/bin/gfan_tropicaltraverse
/usr/bin/gfan_tropicalweildivisor
/usr/bin/gfan_version
/usr/bin/gfortran
/usr/bin/gfortran-11
/usr/bin/giac
/usr/bin/gimp
/usr/bin/gimp-2.10
/usr/bin/gimp-console
/usr/bin/gimp-console-2.10
/usr/bin/git
/usr/bin/git-receive-pack
/usr/bin/git-shell
/usr/bin/git-upload-archive
/usr/bin/git-upload-pack
/usr/bin/gmake
/usr/bin/gp
/usr/bin/gp-2.13
/usr/bin/gperf
/usr/bin/gpg
/usr/bin/gpg2
/usr/bin/gpg-agent
/usr/bin/gpgcompose
/usr/bin/gpgconf
/usr/bin/gpg-connect-agent
/usr/bin/gpgsm
/usr/bin/gpgsplit
/usr/bin/gpgtar
/usr/bin/gpgv
/usr/bin/gpg-wks-server
/usr/bin/gpu-manager
/usr/bin/grops
/usr/bin/grub-mkrescue
/usr/bin/gvgen
/usr/bin/hpls
/usr/bin/hppa-linux-gnu-as
/usr/bin/hppa-linux-gnu-cpp
/usr/bin/hppa-linux-gnu-cpp-11
/usr/bin/hppa-linux-gnu-g++
/usr/bin/hppa-linux-gnu-g++-11
/usr/bin/hppa-linux-gnu-gcc
/usr/bin/hppa-linux-gnu-gcc-11
/usr/bin/hppa-linux-gnu-gcov
/usr/bin/hppa-linux-gnu-gcov-11
/usr/bin/hppa-linux-gnu-gcov-dump
/usr/bin/hppa-linux-gnu-gcov-dump-11
/usr/bin/hppa-linux-gnu-gcov-tool
/usr/bin/hppa-linux-gnu-gcov-tool-11
/usr/bin/hppa-linux-gnu-lto-dump-11
/usr/bin/i686-linux-gnu-as
/usr/bin/i686-linux-gnu-cpp
/usr/bin/i686-linux-gnu-cpp-11
/usr/bin/i686-linux-gnu-g++
/usr/bin/i686-linux-gnu-g++-11
/usr/bin/i686-linux-gnu-gcc
/usr/bin/i686-linux-gnu-gcc-11
/usr/bin/i686-linux-gnu-gcov
/usr/bin/i686-linux-gnu-gcov-11
/usr/bin/i686-linux-gnu-gcov-dump
/usr/bin/i686-linux-gnu-gcov-dump-11
/usr/bin/i686-linux-gnu-gcov-tool
/usr/bin/i686-linux-gnu-gcov-tool-11
/usr/bin/i686-linux-gnu-ld
/usr/bin/i686-linux-gnu-ld.bfd
/usr/bin/i686-linux-gnu-lto-dump-11
/usr/bin/icas
/usr/bin/ico
/usr/bin/inimf
/usr/bin/initex
/usr/bin/innochecksum
/usr/bin/ip
/usr/bin/ipptool
/usr/bin/iptables-xml
/usr/bin/isdv4-serial-debugger
/usr/bin/kaidan
/usr/bin/kbxutil
/usr/bin/ksmserver
/usr/bin/kvm
/usr/bin/kwalletd5
/usr/bin/last
/usr/bin/lastb
/usr/bin/lastlog
/usr/bin/latex
/usr/bin/latex-dev
/usr/bin/ld
/usr/bin/ld.bfd
/usr/bin/less
/usr/bin/llvm-cvtres
/usr/bin/llvm-cvtres-13
/usr/bin/llvm-cvtres-14
/usr/bin/llvm-exegesis
/usr/bin/llvm-exegesis-13
/usr/bin/llvm-exegesis-14
/usr/bin/llvm-ml-13
/usr/bin/llvm-ml-14
/usr/bin/login
/usr/bin/lsar
/usr/bin/lsof
/usr/bin/lto-dump-11
/usr/bin/lua
/usr/bin/lua5.4
/usr/bin/luac
/usr/bin/luac5.4
/usr/bin/luahbtex
/usr/bin/luajithbtex
/usr/bin/luajittex
/usr/bin/lualatex
/usr/bin/lualatex-dev
/usr/bin/luatex
/usr/bin/lzop
/usr/bin/m68k-linux-gnu-as
/usr/bin/m68k-linux-gnu-cpp
/usr/bin/m68k-linux-gnu-cpp-11
/usr/bin/m68k-linux-gnu-g++
/usr/bin/m68k-linux-gnu-g++-11
/usr/bin/m68k-linux-gnu-gcc
/usr/bin/m68k-linux-gnu-gcc-11
/usr/bin/m68k-linux-gnu-gcov
/usr/bin/m68k-linux-gnu-gcov-11
/usr/bin/m68k-linux-gnu-gcov-dump
/usr/bin/m68k-linux-gnu-gcov-dump-11
/usr/bin/m68k-linux-gnu-gcov-tool
/usr/bin/m68k-linux-gnu-gcov-tool-11
/usr/bin/m68k-linux-gnu-lto-dump-11
/usr/bin/make
/usr/bin/mariadb
/usr/bin/mariadb-check
/usr/bin/mattrib
/usr/bin/mawk
/usr/bin/mbadblocks
/usr/bin/mcat
/usr/bin/mcd
/usr/bin/mclasserase
/usr/bin/mcopy
/usr/bin/mdel
/usr/bin/mdeltree
/usr/bin/mdir
/usr/bin/mdu
/usr/bin/mf
/usr/bin/mflua
/usr/bin/mfluajit
/usr/bin/mfluajit-nowin
/usr/bin/mflua-nowin
/usr/bin/mf-nowin
/usr/bin/mformat
/usr/bin/mfplain
/usr/bin/minfo
/usr/bin/mips64-linux-gnuabi64-as
/usr/bin/mips64-linux-gnuabi64-cpp
/usr/bin/mips64-linux-gnuabi64-cpp-10
/usr/bin/mips64-linux-gnuabi64-g++
/usr/bin/mips64-linux-gnuabi64-g++-10
/usr/bin/mips64-linux-gnuabi64-gcc
/usr/bin/mips64-linux-gnuabi64-gcc-10
/usr/bin/mips64-linux-gnuabi64-gcov
/usr/bin/mips64-linux-gnuabi64-gcov-10
/usr/bin/mips64-linux-gnuabi64-gcov-dump
/usr/bin/mips64-linux-gnuabi64-gcov-dump-10
/usr/bin/mips64-linux-gnuabi64-gcov-tool
/usr/bin/mips64-linux-gnuabi64-gcov-tool-10
/usr/bin/mips64-linux-gnuabi64-lto-dump-10
/usr/bin/mips-linux-gnu-as
/usr/bin/mips-linux-gnu-cpp
/usr/bin/mips-linux-gnu-cpp-10
/usr/bin/mips-linux-gnu-g++
/usr/bin/mips-linux-gnu-g++-10
/usr/bin/mips-linux-gnu-gcc
/usr/bin/mips-linux-gnu-gcc-10
/usr/bin/mips-linux-gnu-gcov
/usr/bin/mips-linux-gnu-gcov-10
/usr/bin/mips-linux-gnu-gcov-dump
/usr/bin/mips-linux-gnu-gcov-dump-10
/usr/bin/mips-linux-gnu-gcov-tool
/usr/bin/mips-linux-gnu-gcov-tool-10
/usr/bin/mips-linux-gnu-lto-dump-10
/usr/bin/mkimage
/usr/bin/mkisofs
/usr/bin/mksquashfs
/usr/bin/mlabel
/usr/bin/mmcli
/usr/bin/mmd
/usr/bin/mmount
/usr/bin/mmove
/usr/bin/mono
/usr/bin/monodis
/usr/bin/mono-sgen
/usr/bin/mpartition
/usr/bin/mpost
/usr/bin/mrd
/usr/bin/mren
/usr/bin/msginit
/usr/bin/mshortname
/usr/bin/mshowfat
/usr/bin/msxlint
/usr/bin/mtools
/usr/bin/mtoolstest
/usr/bin/mtr
/usr/bin/mtype
/usr/bin/mysql
/usr/bin/mzip
/usr/bin/nano
/usr/bin/nauty-cubhamg
/usr/bin/nawk
/usr/bin/ncal
/usr/bin/ncftp
/usr/bin/ncftp3
/usr/bin/ncftpbatch
/usr/bin/ncftpbookmarks
/usr/bin/ncftpget
/usr/bin/ncftpls
/usr/bin/ncftpput
/usr/bin/ncftpspooler
/usr/bin/nef-11d.x
/usr/bin/nef-4d.x
/usr/bin/nef-5d.x
/usr/bin/nef-6d.x
/usr/bin/nef.x
/usr/bin/net
/usr/bin/nmblookup
/usr/bin/nstat
/usr/bin/ntfssecaudit
/usr/bin/ntfswipe
/usr/bin/ocamldoc.opt
/usr/bin/oclock
/usr/bin/oggCat
/usr/bin/oggCut
/usr/bin/oggSilence
/usr/bin/oggSlideshow
/usr/bin/oggTranscode
/usr/bin/openssl
/usr/bin/pager
/usr/bin/pandoc
/usr/bin/pbmreduce
/usr/bin/pdfetex
/usr/bin/pdflatex
/usr/bin/pdflatex-dev
/usr/bin/pdftex
/usr/bin/pdvitomp
/usr/bin/pedump
/usr/bin/perl
/usr/bin/perl5.34.0
/usr/bin/pgmcrater
/usr/bin/pgmnoise
/usr/bin/pgmtopbm
/usr/bin/pgrep
/usr/bin/php
/usr/bin/php8.1
/usr/bin/pico
/usr/bin/pidwait
/usr/bin/pinentry
/usr/bin/pinentry-qt
/usr/bin/pinentry-x11
/usr/bin/pinky
/usr/bin/pkill
/usr/bin/pmpost
/usr/bin/pnmremap
/usr/bin/pnmtorle
/usr/bin/post-grohtml
/usr/bin/powerpc64le-linux-gnu-as
/usr/bin/powerpc64le-linux-gnu-cpp
/usr/bin/powerpc64le-linux-gnu-cpp-11
/usr/bin/powerpc64le-linux-gnu-g++
/usr/bin/powerpc64le-linux-gnu-g++-11
/usr/bin/powerpc64le-linux-gnu-gcc
/usr/bin/powerpc64le-linux-gnu-gcc-11
/usr/bin/powerpc64le-linux-gnu-gcov
/usr/bin/powerpc64le-linux-gnu-gcov-11
/usr/bin/powerpc64le-linux-gnu-gcov-dump
/usr/bin/powerpc64le-linux-gnu-gcov-dump-11
/usr/bin/powerpc64le-linux-gnu-gcov-tool
/usr/bin/powerpc64le-linux-gnu-gcov-tool-11
/usr/bin/powerpc64le-linux-gnu-lto-dump-11
/usr/bin/powerpc64-linux-gnu-as
/usr/bin/powerpc64-linux-gnu-cpp
/usr/bin/powerpc64-linux-gnu-cpp-11
/usr/bin/powerpc64-linux-gnu-g++
/usr/bin/powerpc64-linux-gnu-g++-11
/usr/bin/powerpc64-linux-gnu-gcc
/usr/bin/powerpc64-linux-gnu-gcc-11
/usr/bin/powerpc64-linux-gnu-gcov
/usr/bin/powerpc64-linux-gnu-gcov-11
/usr/bin/powerpc64-linux-gnu-gcov-dump
/usr/bin/powerpc64-linux-gnu-gcov-dump-11
/usr/bin/powerpc64-linux-gnu-gcov-tool
/usr/bin/powerpc64-linux-gnu-gcov-tool-11
/usr/bin/powerpc64-linux-gnu-lto-dump-11
/usr/bin/powerpc-linux-gnu-as
/usr/bin/powerpc-linux-gnu-cpp
/usr/bin/powerpc-linux-gnu-cpp-11
/usr/bin/powerpc-linux-gnu-g++
/usr/bin/powerpc-linux-gnu-g++-11
/usr/bin/powerpc-linux-gnu-gcc
/usr/bin/powerpc-linux-gnu-gcc-11
/usr/bin/powerpc-linux-gnu-gcov
/usr/bin/powerpc-linux-gnu-gcov-11
/usr/bin/powerpc-linux-gnu-gcov-dump
/usr/bin/powerpc-linux-gnu-gcov-dump-11
/usr/bin/powerpc-linux-gnu-gcov-tool
/usr/bin/powerpc-linux-gnu-gcov-tool-11
/usr/bin/powerpc-linux-gnu-lto-dump-11
/usr/bin/ppmforge
/usr/bin/ppmpat
/usr/bin/ppmquant
/usr/bin/ppmshift
/usr/bin/ppmspread
/usr/bin/ppmtompeg
/usr/bin/ps
/usr/bin/ptex
/usr/bin/python3
/usr/bin/python3.10
/usr/bin/qemu-img
/usr/bin/qemu-io
/usr/bin/qemu-nbd
/usr/bin/qemu-pr-helper
/usr/bin/qemu-storage-daemon
/usr/bin/qemu-system-i386
/usr/bin/qemu-system-x86_64
/usr/bin/qemu-system-x86_64-microvm
/usr/bin/rbash
/usr/bin/rdesktop-vrdp
/usr/bin/rdma
/usr/bin/rearj
/usr/bin/redcheck
/usr/bin/redcheck_gmp
/usr/bin/riscv64-linux-gnu-as
/usr/bin/riscv64-linux-gnu-cpp
/usr/bin/riscv64-linux-gnu-cpp-11
/usr/bin/riscv64-linux-gnu-g++
/usr/bin/riscv64-linux-gnu-g++-11
/usr/bin/riscv64-linux-gnu-gcc
/usr/bin/riscv64-linux-gnu-gcc-11
/usr/bin/riscv64-linux-gnu-gcov
/usr/bin/riscv64-linux-gnu-gcov-11
/usr/bin/riscv64-linux-gnu-gcov-dump
/usr/bin/riscv64-linux-gnu-gcov-dump-11
/usr/bin/riscv64-linux-gnu-gcov-tool
/usr/bin/riscv64-linux-gnu-gcov-tool-11
/usr/bin/riscv64-linux-gnu-lto-dump-11
/usr/bin/rlogin
/usr/bin/r-mpost
/usr/bin/rnano
/usr/bin/rpcclient
/usr/bin/r-pmpost
/usr/bin/rsh
/usr/bin/rsync
/usr/bin/r-upmpost
/usr/bin/rview
/usr/bin/rvim
/usr/bin/rzsh
/usr/bin/s390x-linux-gnu-as
/usr/bin/s390x-linux-gnu-cpp
/usr/bin/s390x-linux-gnu-cpp-11
/usr/bin/s390x-linux-gnu-g++
/usr/bin/s390x-linux-gnu-g++-11
/usr/bin/s390x-linux-gnu-gcc
/usr/bin/s390x-linux-gnu-gcc-11
/usr/bin/s390x-linux-gnu-gcov
/usr/bin/s390x-linux-gnu-gcov-11
/usr/bin/s390x-linux-gnu-gcov-dump
/usr/bin/s390x-linux-gnu-gcov-dump-11
/usr/bin/s390x-linux-gnu-gcov-tool
/usr/bin/s390x-linux-gnu-gcov-tool-11
/usr/bin/s390x-linux-gnu-lto-dump-11
/usr/bin/sbvarsign
/usr/bin/scanimage
/usr/bin/script
/usr/bin/session-migration
/usr/bin/sessreg
/usr/bin/sftp
/usr/bin/sh4-linux-gnu-as
/usr/bin/sh4-linux-gnu-cpp
/usr/bin/sh4-linux-gnu-cpp-11
/usr/bin/sh4-linux-gnu-g++
/usr/bin/sh4-linux-gnu-g++-11
/usr/bin/sh4-linux-gnu-gcc
/usr/bin/sh4-linux-gnu-gcc-11
/usr/bin/sh4-linux-gnu-gcov
/usr/bin/sh4-linux-gnu-gcov-11
/usr/bin/sh4-linux-gnu-gcov-dump
/usr/bin/sh4-linux-gnu-gcov-dump-11
/usr/bin/sh4-linux-gnu-gcov-tool
/usr/bin/sh4-linux-gnu-gcov-tool-11
/usr/bin/sh4-linux-gnu-lto-dump-11
/usr/bin/shred
/usr/bin/slogin
/usr/bin/snapfuse
/usr/bin/sparc64-linux-gnu-as
/usr/bin/sparc64-linux-gnu-cpp
/usr/bin/sparc64-linux-gnu-cpp-11
/usr/bin/sparc64-linux-gnu-g++
/usr/bin/sparc64-linux-gnu-g++-11
/usr/bin/sparc64-linux-gnu-gcc
/usr/bin/sparc64-linux-gnu-gcc-11
/usr/bin/sparc64-linux-gnu-gcov
/usr/bin/sparc64-linux-gnu-gcov-11
/usr/bin/sparc64-linux-gnu-gcov-dump
/usr/bin/sparc64-linux-gnu-gcov-dump-11
/usr/bin/sparc64-linux-gnu-gcov-tool
/usr/bin/sparc64-linux-gnu-gcov-tool-11
/usr/bin/sparc64-linux-gnu-lto-dump-11
/usr/bin/sqfstar
/usr/bin/sqlite3
/usr/bin/ss
/usr/bin/ssh
/usr/bin/ssh-agent
/usr/bin/sshfs
/usr/bin/ssh-keygen
/usr/bin/sudoreplay
/usr/bin/supermin
/usr/bin/surf-alggeo
/usr/bin/surf-alggeo-nox
/usr/bin/t1mac
/usr/bin/tasm
/usr/bin/tcal
/usr/bin/tcpdump
/usr/bin/tex
/usr/bin/tex2aspc
/usr/bin/texlua
/usr/bin/texluac
/usr/bin/texluajit
/usr/bin/texluajitc
/usr/bin/timedatectl
/usr/bin/top
/usr/bin/touch
/usr/bin/troff
/usr/bin/ttf2afm
/usr/bin/ubuntu-distro-info
/usr/bin/unar
/usr/bin/unpack200
/usr/bin/update-alternatives
/usr/bin/updvitomp
/usr/bin/upmpost
/usr/bin/upower
/usr/bin/uptex
/usr/bin/valgrind-di-server
/usr/bin/valgrind-listener
/usr/bin/vi
/usr/bin/view
/usr/bin/vim
/usr/bin/vim.basic
/usr/bin/vimdiff
/usr/bin/vim.tiny
/usr/bin/vmstat
/usr/bin/w
/usr/bin/w3m
/usr/bin/wall
/usr/bin/watch
/usr/bin/watchgnupg
/usr/bin/wget
/usr/bin/who
/usr/bin/whoopsie
/usr/bin/write
/usr/bin/write.ul
/usr/bin/www-browser
/usr/bin/wxrc
/usr/bin/x11perf
/usr/bin/x86_64-linux-gnu-as
/usr/bin/x86_64-linux-gnu-cpp
/usr/bin/x86_64-linux-gnu-cpp-11
/usr/bin/x86_64-linux-gnu-g++
/usr/bin/x86_64-linux-gnu-g++-11
/usr/bin/x86_64-linux-gnu-gcc
/usr/bin/x86_64-linux-gnu-gcc-11
/usr/bin/x86_64-linux-gnu-gdc
/usr/bin/x86_64-linux-gnu-gdc-11
/usr/bin/x86_64-linux-gnu-gfortran
/usr/bin/x86_64-linux-gnu-gfortran-11
/usr/bin/x86_64-linux-gnu-ld
/usr/bin/x86_64-linux-gnu-ld.bfd
/usr/bin/x86_64-linux-gnu-lto-dump-11
/usr/bin/x86_64-linux-gnux32-as
/usr/bin/x86_64-linux-gnux32-cpp
/usr/bin/x86_64-linux-gnux32-cpp-11
/usr/bin/x86_64-linux-gnux32-g++
/usr/bin/x86_64-linux-gnux32-g++-11
/usr/bin/x86_64-linux-gnux32-gcc
/usr/bin/x86_64-linux-gnux32-gcc-11
/usr/bin/x86_64-linux-gnux32-gcov
/usr/bin/x86_64-linux-gnux32-gcov-11
/usr/bin/x86_64-linux-gnux32-gcov-dump
/usr/bin/x86_64-linux-gnux32-gcov-dump-11
/usr/bin/x86_64-linux-gnux32-gcov-tool
/usr/bin/x86_64-linux-gnux32-gcov-tool-11
/usr/bin/x86_64-linux-gnux32-ld
/usr/bin/x86_64-linux-gnux32-ld.bfd
/usr/bin/x86_64-linux-gnux32-lto-dump-11
/usr/bin/xcas
/usr/bin/xclock
/usr/bin/xdvipdfmx
/usr/bin/xedit
/usr/bin/xetex
/usr/bin/xgettext
/usr/bin/xterm
/usr/bin/yasm
/usr/bin/ytasm
/usr/bin/zdump
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zsh
[-- Attachment #3: callers-of-gettimeofday --]
[-- Type: text/plain, Size: 9574 bytes --]
/usr/bin/aarch64-linux-gnu-cpp
/usr/bin/aarch64-linux-gnu-cpp-11
/usr/bin/aarch64-linux-gnu-g++
/usr/bin/aarch64-linux-gnu-g++-11
/usr/bin/aarch64-linux-gnu-gcc
/usr/bin/aarch64-linux-gnu-gcc-11
/usr/bin/aarch64-linux-gnu-lto-dump-11
/usr/bin/afl-c++
/usr/bin/afl-cc
/usr/bin/afl-clang-fast
/usr/bin/afl-clang-fast++
/usr/bin/afl-fuzz
/usr/bin/afl-g++
/usr/bin/afl-gcc
/usr/bin/afl-gotcpu
/usr/bin/afl-network-server
/usr/bin/airscan-discover
/usr/bin/alpha-linux-gnu-cpp
/usr/bin/alpha-linux-gnu-cpp-11
/usr/bin/alpha-linux-gnu-g++
/usr/bin/alpha-linux-gnu-g++-11
/usr/bin/alpha-linux-gnu-gcc
/usr/bin/alpha-linux-gnu-gcc-11
/usr/bin/alpha-linux-gnu-lto-dump-11
/usr/bin/alsaloop
/usr/bin/aplay
/usr/bin/aptitude
/usr/bin/aptitude-curses
/usr/bin/arecord
/usr/bin/arj
/usr/bin/arm-linux-gnueabi-cpp
/usr/bin/arm-linux-gnueabi-cpp-11
/usr/bin/arm-linux-gnueabi-g++
/usr/bin/arm-linux-gnueabi-g++-11
/usr/bin/arm-linux-gnueabi-gcc
/usr/bin/arm-linux-gnueabi-gcc-11
/usr/bin/arm-linux-gnueabihf-cpp
/usr/bin/arm-linux-gnueabihf-cpp-11
/usr/bin/arm-linux-gnueabihf-g++
/usr/bin/arm-linux-gnueabihf-g++-11
/usr/bin/arm-linux-gnueabihf-gcc
/usr/bin/arm-linux-gnueabihf-gcc-11
/usr/bin/arm-linux-gnueabihf-lto-dump-11
/usr/bin/arm-linux-gnueabi-lto-dump-11
/usr/bin/bash
/usr/bin/btmon
/usr/bin/btrfs
/usr/bin/btrfsck
/usr/bin/btrfs-convert
/usr/bin/btrfs-find-root
/usr/bin/btrfs-image
/usr/bin/btrfs-map-logical
/usr/bin/btrfs-select-super
/usr/bin/btrfstune
/usr/bin/c++
/usr/bin/cabal
/usr/bin/cc
/usr/bin/cli
/usr/bin/cli-ildasm
/usr/bin/cmake
/usr/bin/cp
/usr/bin/cpack
/usr/bin/cpio
/usr/bin/cpp
/usr/bin/cpp-11
/usr/bin/cryfs
/usr/bin/ctest
/usr/bin/ctstat
/usr/bin/curl
/usr/bin/cvs
/usr/bin/devdump
/usr/bin/dirmngr
/usr/bin/dmesg
/usr/bin/dreadnaut
/usr/bin/dvilualatex
/usr/bin/dvilualatex-dev
/usr/bin/dviluatex
/usr/bin/dvisvgm
/usr/bin/dvitomp
/usr/bin/emacs
/usr/bin/emacs-gtk
/usr/bin/encfs
/usr/bin/eptex
/usr/bin/es2gears_wayland
/usr/bin/es2gears_wayland.x86_64-linux-gnu
/usr/bin/es2gears_x11
/usr/bin/es2gears_x11.x86_64-linux-gnu
/usr/bin/etex
/usr/bin/euptex
/usr/bin/ex
/usr/bin/f77
/usr/bin/f95
/usr/bin/find
/usr/bin/fiwalk
/usr/bin/ftp
/usr/bin/g++
/usr/bin/g++-11
/usr/bin/gcc
/usr/bin/gcc-11
/usr/bin/gdb
/usr/bin/gdb-multiarch
/usr/bin/gdc
/usr/bin/gdc-11
/usr/bin/genisoimage
/usr/bin/gfortran
/usr/bin/gfortran-11
/usr/bin/giac
/usr/bin/git
/usr/bin/git-receive-pack
/usr/bin/git-shell
/usr/bin/git-upload-archive
/usr/bin/git-upload-pack
/usr/bin/glxgears
/usr/bin/glxgears.x86_64-linux-gnu
/usr/bin/gmake
/usr/bin/gp
/usr/bin/gp-2.13
/usr/bin/gpasswd
/usr/bin/grub-editenv
/usr/bin/grub-file
/usr/bin/grub-fstest
/usr/bin/grub-glue-efi
/usr/bin/grub-menulst2cfg
/usr/bin/grub-mkfont
/usr/bin/grub-mkimage
/usr/bin/grub-mklayout
/usr/bin/grub-mknetdir
/usr/bin/grub-mkpasswd-pbkdf2
/usr/bin/grub-mkrelpath
/usr/bin/grub-mkrescue
/usr/bin/grub-mkstandalone
/usr/bin/grub-mount
/usr/bin/grub-render-label
/usr/bin/grub-script-check
/usr/bin/grub-syslinux2cfg
/usr/bin/h5perf_serial
/usr/bin/hppa-linux-gnu-cpp
/usr/bin/hppa-linux-gnu-cpp-11
/usr/bin/hppa-linux-gnu-g++
/usr/bin/hppa-linux-gnu-g++-11
/usr/bin/hppa-linux-gnu-gcc
/usr/bin/hppa-linux-gnu-gcc-11
/usr/bin/hppa-linux-gnu-lto-dump-11
/usr/bin/i686-linux-gnu-cpp
/usr/bin/i686-linux-gnu-cpp-11
/usr/bin/i686-linux-gnu-g++
/usr/bin/i686-linux-gnu-g++-11
/usr/bin/i686-linux-gnu-gcc
/usr/bin/i686-linux-gnu-gcc-11
/usr/bin/i686-linux-gnu-lto-dump-11
/usr/bin/icas
/usr/bin/install
/usr/bin/ip
/usr/bin/ipcmk
/usr/bin/ippfind
/usr/bin/isodump
/usr/bin/isoinfo
/usr/bin/isovfy
/usr/bin/kmod
/usr/bin/kvm
/usr/bin/l2ping
/usr/bin/l2test
/usr/bin/lame
/usr/bin/last
/usr/bin/lastb
/usr/bin/latex
/usr/bin/latex-dev
/usr/bin/lefty
/usr/bin/ln
/usr/bin/lnstat
/usr/bin/logger
/usr/bin/login
/usr/bin/lsar
/usr/bin/lsipc
/usr/bin/lslogins
/usr/bin/lsmod
/usr/bin/lto-dump-11
/usr/bin/ltrace
/usr/bin/luahbtex
/usr/bin/luajithbtex
/usr/bin/luajittex
/usr/bin/lualatex
/usr/bin/lualatex-dev
/usr/bin/luatex
/usr/bin/m68k-linux-gnu-cpp
/usr/bin/m68k-linux-gnu-cpp-11
/usr/bin/m68k-linux-gnu-g++
/usr/bin/m68k-linux-gnu-g++-11
/usr/bin/m68k-linux-gnu-gcc
/usr/bin/m68k-linux-gnu-gcc-11
/usr/bin/m68k-linux-gnu-lto-dump-11
/usr/bin/make
/usr/bin/mcookie
/usr/bin/mfplain
/usr/bin/mips64-linux-gnuabi64-cpp
/usr/bin/mips64-linux-gnuabi64-cpp-10
/usr/bin/mips64-linux-gnuabi64-g++
/usr/bin/mips64-linux-gnuabi64-g++-10
/usr/bin/mips64-linux-gnuabi64-gcc
/usr/bin/mips64-linux-gnuabi64-gcc-10
/usr/bin/mips64-linux-gnuabi64-lto-dump-10
/usr/bin/mips-linux-gnu-cpp
/usr/bin/mips-linux-gnu-cpp-10
/usr/bin/mips-linux-gnu-g++
/usr/bin/mips-linux-gnu-g++-10
/usr/bin/mips-linux-gnu-gcc
/usr/bin/mips-linux-gnu-gcc-10
/usr/bin/mips-linux-gnu-lto-dump-10
/usr/bin/mkisofs
/usr/bin/mktemp
/usr/bin/mokutil
/usr/bin/mono
/usr/bin/monodis
/usr/bin/mono-sgen
/usr/bin/mpost
/usr/bin/mtr
/usr/bin/mtr-packet
/usr/bin/mv
/usr/bin/nauty-genrang
/usr/bin/nauty-hamheuristic
/usr/bin/nauty-ranlabg
/usr/bin/nauty-twohamg
/usr/bin/ncftp
/usr/bin/ncftp3
/usr/bin/ncftpbatch
/usr/bin/ncftpbookmarks
/usr/bin/ncftpget
/usr/bin/ncftpls
/usr/bin/ncftpput
/usr/bin/ncftpspooler
/usr/bin/nstat
/usr/bin/ntfs-3g
/usr/bin/ocamlc
/usr/bin/ocamlcmt
/usr/bin/ocamlc.opt
/usr/bin/ocamlcp
/usr/bin/ocamlcp.opt
/usr/bin/ocamldep
/usr/bin/ocamldep.opt
/usr/bin/ocamldoc.opt
/usr/bin/ocamllex
/usr/bin/ocamllex.opt
/usr/bin/ocamlmklib
/usr/bin/ocamlmklib.opt
/usr/bin/ocamlmktop
/usr/bin/ocamlmktop.opt
/usr/bin/ocamlobjinfo
/usr/bin/ocamlobjinfo.opt
/usr/bin/ocamlopt
/usr/bin/ocamlopt.opt
/usr/bin/ocamloptp
/usr/bin/ocamloptp.opt
/usr/bin/ocamlprof
/usr/bin/ocamlprof.opt
/usr/bin/ocamlrun
/usr/bin/ocamlrund
/usr/bin/ocamlruni
/usr/bin/pandoc
/usr/bin/patch
/usr/bin/pdfetex
/usr/bin/pdflatex
/usr/bin/pdflatex-dev
/usr/bin/pdftex
/usr/bin/pdvitomp
/usr/bin/pedump
/usr/bin/perl
/usr/bin/perl5.34.0
/usr/bin/php
/usr/bin/php8.1
/usr/bin/ping
/usr/bin/ping4
/usr/bin/ping6
/usr/bin/pmpost
/usr/bin/powerpc64le-linux-gnu-cpp
/usr/bin/powerpc64le-linux-gnu-cpp-11
/usr/bin/powerpc64le-linux-gnu-g++
/usr/bin/powerpc64le-linux-gnu-g++-11
/usr/bin/powerpc64le-linux-gnu-gcc
/usr/bin/powerpc64le-linux-gnu-gcc-11
/usr/bin/powerpc64le-linux-gnu-lto-dump-11
/usr/bin/powerpc64-linux-gnu-cpp
/usr/bin/powerpc64-linux-gnu-cpp-11
/usr/bin/powerpc64-linux-gnu-g++
/usr/bin/powerpc64-linux-gnu-g++-11
/usr/bin/powerpc64-linux-gnu-gcc
/usr/bin/powerpc64-linux-gnu-gcc-11
/usr/bin/powerpc64-linux-gnu-lto-dump-11
/usr/bin/powerpc-linux-gnu-cpp
/usr/bin/powerpc-linux-gnu-cpp-11
/usr/bin/powerpc-linux-gnu-g++
/usr/bin/powerpc-linux-gnu-g++-11
/usr/bin/powerpc-linux-gnu-gcc
/usr/bin/powerpc-linux-gnu-gcc-11
/usr/bin/powerpc-linux-gnu-lto-dump-11
/usr/bin/python3
/usr/bin/python3.10
/usr/bin/qemu-img
/usr/bin/qemu-io
/usr/bin/qemu-nbd
/usr/bin/qemu-pr-helper
/usr/bin/qemu-storage-daemon
/usr/bin/qemu-system-i386
/usr/bin/qemu-system-x86_64
/usr/bin/qemu-system-x86_64-microvm
/usr/bin/rbash
/usr/bin/rcp
/usr/bin/rctest
/usr/bin/rdesktop-vrdp
/usr/bin/rearj
/usr/bin/riscv64-linux-gnu-cpp
/usr/bin/riscv64-linux-gnu-cpp-11
/usr/bin/riscv64-linux-gnu-g++
/usr/bin/riscv64-linux-gnu-g++-11
/usr/bin/riscv64-linux-gnu-gcc
/usr/bin/riscv64-linux-gnu-gcc-11
/usr/bin/riscv64-linux-gnu-lto-dump-11
/usr/bin/rlogin
/usr/bin/r-mpost
/usr/bin/r-pmpost
/usr/bin/rsh
/usr/bin/rsync
/usr/bin/rtstat
/usr/bin/r-upmpost
/usr/bin/rview
/usr/bin/rvim
/usr/bin/rzsh
/usr/bin/s390x-linux-gnu-cpp
/usr/bin/s390x-linux-gnu-cpp-11
/usr/bin/s390x-linux-gnu-g++
/usr/bin/s390x-linux-gnu-g++-11
/usr/bin/s390x-linux-gnu-gcc
/usr/bin/s390x-linux-gnu-gcc-11
/usr/bin/s390x-linux-gnu-lto-dump-11
/usr/bin/sane-find-scanner
/usr/bin/scp
/usr/bin/scrub
/usr/bin/sftp
/usr/bin/sh4-linux-gnu-cpp
/usr/bin/sh4-linux-gnu-cpp-11
/usr/bin/sh4-linux-gnu-g++
/usr/bin/sh4-linux-gnu-g++-11
/usr/bin/sh4-linux-gnu-gcc
/usr/bin/sh4-linux-gnu-gcc-11
/usr/bin/sh4-linux-gnu-lto-dump-11
/usr/bin/shred
/usr/bin/shuf
/usr/bin/slogin
/usr/bin/socat
/usr/bin/sort
/usr/bin/sparc64-linux-gnu-cpp
/usr/bin/sparc64-linux-gnu-cpp-11
/usr/bin/sparc64-linux-gnu-g++
/usr/bin/sparc64-linux-gnu-g++-11
/usr/bin/sparc64-linux-gnu-gcc
/usr/bin/sparc64-linux-gnu-gcc-11
/usr/bin/sparc64-linux-gnu-lto-dump-11
/usr/bin/speaker-test
/usr/bin/sqlite3
/usr/bin/ssh
/usr/bin/ssh-agent
/usr/bin/sshfs
/usr/bin/ssh-keygen
/usr/bin/ssh-keyscan
/usr/bin/su
/usr/bin/sudo
/usr/bin/sudoedit
/usr/bin/supermin
/usr/bin/tar
/usr/bin/texlua
/usr/bin/texluac
/usr/bin/texluajit
/usr/bin/texluajitc
/usr/bin/time
/usr/bin/tnftp
/usr/bin/ubuntu-core-launcher
/usr/bin/umax_pp
/usr/bin/unar
/usr/bin/updatedb
/usr/bin/updvitomp
/usr/bin/upmpost
/usr/bin/upower
/usr/bin/uptime
/usr/bin/usbhid-dump
/usr/bin/vbox-img
/usr/bin/vgdb
/usr/bin/vi
/usr/bin/view
/usr/bin/vim
/usr/bin/vim.basic
/usr/bin/vimdiff
/usr/bin/vim.tiny
/usr/bin/watch
/usr/bin/x11perf
/usr/bin/x86_64-linux-gnu-cpp
/usr/bin/x86_64-linux-gnu-cpp-11
/usr/bin/x86_64-linux-gnu-g++
/usr/bin/x86_64-linux-gnu-g++-11
/usr/bin/x86_64-linux-gnu-gcc
/usr/bin/x86_64-linux-gnu-gcc-11
/usr/bin/x86_64-linux-gnu-gdc
/usr/bin/x86_64-linux-gnu-gdc-11
/usr/bin/x86_64-linux-gnu-gfortran
/usr/bin/x86_64-linux-gnu-gfortran-11
/usr/bin/x86_64-linux-gnu-lto-dump-11
/usr/bin/x86_64-linux-gnux32-cpp
/usr/bin/x86_64-linux-gnux32-cpp-11
/usr/bin/x86_64-linux-gnux32-g++
/usr/bin/x86_64-linux-gnux32-g++-11
/usr/bin/x86_64-linux-gnux32-gcc
/usr/bin/x86_64-linux-gnux32-gcc-11
/usr/bin/x86_64-linux-gnux32-lto-dump-11
/usr/bin/xcas
/usr/bin/xclock
/usr/bin/xdvi.bin
/usr/bin/xdvi-xaw
/usr/bin/xedit
/usr/bin/xetex
/usr/bin/xgc
/usr/bin/xmllint
/usr/bin/xterm
/usr/bin/zsh
[-- Attachment #4: callers-of-timespec_get --]
[-- Type: text/plain, Size: 63 bytes --]
/usr/bin/unzstd
/usr/bin/zstd
/usr/bin/zstdcat
/usr/bin/zstdmt
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-08 17:09 ` Florian Weimer
@ 2023-03-08 17:46 ` Adhemerval Zanella Netto
0 siblings, 0 replies; 15+ messages in thread
From: Adhemerval Zanella Netto @ 2023-03-08 17:46 UTC (permalink / raw)
To: Florian Weimer; +Cc: Bruno Haible, Paul Eggert, libc-alpha
On 08/03/23 14:09, Florian Weimer wrote:
> * Adhemerval Zanella Netto:
>
>> On 08/03/23 13:23, Bruno Haible wrote:
>>> Paul Eggert wrote:
>>>> My idea is to go through the apps I help maintain, and make sure that
>>>> they never call 'time' anywhere that it's important that a timestamp be
>>>> in sync with with the rest of the system
>>>
>>> Alternatively, these applications can continue to call 'time', if the
>>> package uses the Gnulib module 'time' that provides a workaround against
>>> https://sourceware.org/bugzilla/show_bug.cgi?id=30200 .
>>>
>>> Bruno
>>
>> Florian, do you really think that and latency increase of roughly 15ns
>> is really worth all the trouble gnulib is pushing? It means that we will
>> end up with programs that use CLOCK_REALTIME, while other use
>> CLOCK_REALTIME_COURSE.
>>
>> If users really to squeeze more performance, they can use clock_gettime
>> with CLOCK_REALTIME_COURSE. It should have similar performance to
>> time vDSO.
>
> Eh, I think the difference derives from using the time vDSO entrypoint
> (which your patch removed as well on x86-64). I don't see a performance
> difference between CLOCK_REALTIME and CLOCK_REALTIME_COARSE, so that's
> not it.
I just did some benchmarks using vdso test with time vdso support [1]
$ ./vdsotest clock-gettime-realtime bench
clock-gettime-realtime: syscall: 82 nsec/call
clock-gettime-realtime: libc: 18 nsec/call
clock-gettime-realtime: vdso: 18 nsec/call
$ ./vdsotest clock-gettime-realtime-coarse bench
clock-gettime-realtime-coarse: syscall: 65 nsec/call
clock-gettime-realtime-coarse: libc: 5 nsec/call
clock-gettime-realtime-coarse: vdso: 3 nsec/call
$ ./vdsotest time bench
time: syscall: 41 nsec/call
time: libc: 2 nsec/call
time: vdso: 1 nsec/call
So while time vdso still show small improvement, I hardly think it is a
dealbreaker.
[1] git@github.com:zatrazz/vdsotest.git
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-08 17:44 ` Bruno Haible
@ 2023-03-08 17:50 ` Adhemerval Zanella Netto
0 siblings, 0 replies; 15+ messages in thread
From: Adhemerval Zanella Netto @ 2023-03-08 17:50 UTC (permalink / raw)
To: Bruno Haible, Florian Weimer, Paul Eggert; +Cc: libc-alpha
On 08/03/23 14:44, Bruno Haible wrote:
> Adhemerval Zanella Netto wrote:
>> ... all the trouble gnulib is pushing?
>
> The trouble does not originate in gnulib; it originate through the
> use of inconsistent time APIs.
Yes I understand it and I agree with that this inconsistency is not
desirable, that exactly why I have sent this patch. The 'trouble'
I meant all this boilerplate wrapper code you are adding on gnulib
to 'fix' this glibc optimization.
>
> On a typical system, there are
> - hundreds of programs that call gettimeofday() or timespec_get(),
> - hundreds of programs that call time().
> Find attached the lists of programs in /usr/bin on my machine:
> - 425 programs that call gettimeofday() or timespec_get(),
> - 730 programs that call time().
>
> Each time a program calls gettimeofday() or timespec_get(), and then,
> within 1 to 3 milliseconds, a program (the same or a different one)
> calls time(), there is the potential for trouble because the time
> appears to go backwards. This trouble can occur with probability
> between 0.1% and 0.3%, according to the data in
> https://sourceware.org/bugzilla/show_bug.cgi?id=30200 .
>
> Gnulib attempts to reduce the trouble for specific programs, by
> moving them from the "call time()" camp to the "call gettimeofday() or
> timespec_get()" camp.
>
> Bruno
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200)
2023-03-08 8:59 ` Florian Weimer
@ 2023-03-08 23:08 ` Paul Eggert
0 siblings, 0 replies; 15+ messages in thread
From: Paul Eggert @ 2023-03-08 23:08 UTC (permalink / raw)
To: Florian Weimer; +Cc: Adhemerval Zanella Netto, libc-alpha, Bruno Haible
On 3/8/23 00:59, Florian Weimer wrote:
> Even if the same underlying clock is used, rounding may cause interface
> which use different precision for the fractional seconds part to report
> different integral seconds. The standard does not require rounding
> towards minus infinity.
Actually, POSIX does require rounding timestamps towards minus infinity
for file timestamps, in its spec for utimensat. This requirement was put
in because some implementations played fast and loose with these
timestamps, with some rounding up and some rounding down, and this
confusion caused more trouble than it was worth.
Perhaps it would help if POSIX had a similar requirement for the 'time'
function, as my impression from this discussion is that the confusion
with 'time' being out-of-sync with CLOCK_REALTIME is also more trouble
than it's worth.
Anyway, thanks for clarifying what Glibc does.
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2023-03-08 23:08 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-03-06 16:03 [PATCH] time: Use CLOCK_REALTIME for time (BZ #30200) Adhemerval Zanella
2023-03-07 11:11 ` Florian Weimer
2023-03-07 11:45 ` Adhemerval Zanella Netto
2023-03-07 11:51 ` Florian Weimer
2023-03-07 11:57 ` Adhemerval Zanella Netto
2023-03-07 12:07 ` Florian Weimer
2023-03-08 5:51 ` Paul Eggert
2023-03-08 8:59 ` Florian Weimer
2023-03-08 23:08 ` Paul Eggert
2023-03-08 16:23 ` Bruno Haible
2023-03-08 16:57 ` Adhemerval Zanella Netto
2023-03-08 17:09 ` Florian Weimer
2023-03-08 17:46 ` Adhemerval Zanella Netto
2023-03-08 17:44 ` Bruno Haible
2023-03-08 17:50 ` Adhemerval Zanella Netto
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).