mirror of https://lore.kernel.org/lkml/
 help / color / mirror / Atom feed
* [PATCH] selftests: timers: Fix integer overflows in 32-bit mode
@ 2026-06-03  7:55 Wake Liu
  2026-06-03 17:41 ` John Stultz
  0 siblings, 1 reply; 9+ messages in thread
From: Wake Liu @ 2026-06-03  7:55 UTC (permalink / raw)
  To: John Stultz, Thomas Gleixner, Anna-Maria Behnsen,
	Frederic Weisbecker, Shuah Khan
  Cc: Stephen Boyd, linux-kernel, linux-kselftest, cmllamas

Several timer tests use NSEC_PER_SEC for arithmetic. Since NSEC_PER_SEC
is defined as 1000000000L in vdso/time64.h, it is 32-bit on 32-bit
architectures. Multiplications like NSEC_PER_SEC * 10 or 5 * NSEC_PER_SEC
overflow 32-bit signed long.

Fix this by using LL suffixes or casting NSEC_PER_SEC to long long to
force 64-bit multiplication.

Signed-off-by: Wake Liu <wakel@google.com>
---
 tools/testing/selftests/timers/alarmtimer-suspend.c | 4 ++--
 tools/testing/selftests/timers/nanosleep.c          | 2 +-
 tools/testing/selftests/timers/nsleep-lat.c         | 6 +++---
 tools/testing/selftests/timers/valid-adjtimex.c     | 8 ++++----
 4 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/tools/testing/selftests/timers/alarmtimer-suspend.c b/tools/testing/selftests/timers/alarmtimer-suspend.c
index aa66c805f6a4..a000688d5e23 100644
--- a/tools/testing/selftests/timers/alarmtimer-suspend.c
+++ b/tools/testing/selftests/timers/alarmtimer-suspend.c
@@ -32,7 +32,7 @@
 #include <errno.h>
 #include "kselftest.h"
 
-#define UNREASONABLE_LAT (NSEC_PER_SEC * 5) /* hopefully we resume in 5 secs */
+#define UNREASONABLE_LAT (NSEC_PER_SEC * 5LL) /* hopefully we resume in 5 secs */
 
 #define SUSPEND_SECS 15
 int alarmcount;
@@ -89,7 +89,7 @@ void sigalarm(int signo)
 	alarmcount++;
 
 	delta_ns = timespec_sub(start_time, ts);
-	delta_ns -= NSEC_PER_SEC * SUSPEND_SECS * alarmcount;
+	delta_ns -= (long long)NSEC_PER_SEC * SUSPEND_SECS * alarmcount;
 
 	printf("ALARM(%i): %ld:%ld latency: %lld ns ", alarmcount, ts.tv_sec,
 							ts.tv_nsec, delta_ns);
diff --git a/tools/testing/selftests/timers/nanosleep.c b/tools/testing/selftests/timers/nanosleep.c
index a054680b3372..fcdc649ec7b4 100644
--- a/tools/testing/selftests/timers/nanosleep.c
+++ b/tools/testing/selftests/timers/nanosleep.c
@@ -188,7 +188,7 @@ int main(int argc, char **argv)
 		fflush(stdout);
 
 		length = 10;
-		while (length <= (NSEC_PER_SEC * 10)) {
+		while (length <= (NSEC_PER_SEC * 10LL)) {
 			ret = nanosleep_test(clockid, length);
 			if (ret == UNSUPPORTED) {
 				ksft_test_result_skip("%-31s\n", clockstring(clockid));
diff --git a/tools/testing/selftests/timers/nsleep-lat.c b/tools/testing/selftests/timers/nsleep-lat.c
index a7ba1eb1e21b..c49133afe270 100644
--- a/tools/testing/selftests/timers/nsleep-lat.c
+++ b/tools/testing/selftests/timers/nsleep-lat.c
@@ -76,9 +76,9 @@ struct timespec timespec_add(struct timespec ts, unsigned long long ns)
 
 long long timespec_sub(struct timespec a, struct timespec b)
 {
-	long long ret = NSEC_PER_SEC * b.tv_sec + b.tv_nsec;
+	long long ret = (long long)NSEC_PER_SEC * b.tv_sec + b.tv_nsec;
 
-	ret -= NSEC_PER_SEC * a.tv_sec + a.tv_nsec;
+	ret -= (long long)NSEC_PER_SEC * a.tv_sec + a.tv_nsec;
 	return ret;
 }
 
@@ -146,7 +146,7 @@ int main(int argc, char **argv)
 			continue;
 
 		length = 10;
-		while (length <= (NSEC_PER_SEC * 10)) {
+		while (length <= (NSEC_PER_SEC * 10LL)) {
 			ret = nanosleep_lat_test(clockid, length);
 			if (ret)
 				break;
diff --git a/tools/testing/selftests/timers/valid-adjtimex.c b/tools/testing/selftests/timers/valid-adjtimex.c
index e1e56d3097d6..8f10d64f0c96 100644
--- a/tools/testing/selftests/timers/valid-adjtimex.c
+++ b/tools/testing/selftests/timers/valid-adjtimex.c
@@ -260,16 +260,16 @@ int validate_set_offset(void)
 	if (set_offset(-NSEC_PER_SEC - 1, 1))
 		return -1;
 
-	if (set_offset(5 * NSEC_PER_SEC, 1))
+	if (set_offset(5LL * NSEC_PER_SEC, 1))
 		return -1;
 
-	if (set_offset(-5 * NSEC_PER_SEC, 1))
+	if (set_offset(-5LL * NSEC_PER_SEC, 1))
 		return -1;
 
-	if (set_offset(5 * NSEC_PER_SEC + NSEC_PER_SEC / 2, 1))
+	if (set_offset(5LL * NSEC_PER_SEC + NSEC_PER_SEC / 2, 1))
 		return -1;
 
-	if (set_offset(-5 * NSEC_PER_SEC - NSEC_PER_SEC / 2, 1))
+	if (set_offset(-5LL * NSEC_PER_SEC - NSEC_PER_SEC / 2, 1))
 		return -1;
 
 	if (set_offset(USEC_PER_SEC - 1, 0))
-- 
2.54.0.1013.g208068f2d8-goog


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] selftests: timers: Fix integer overflows in 32-bit mode
  2026-06-03  7:55 [PATCH] selftests: timers: Fix integer overflows in 32-bit mode Wake Liu
@ 2026-06-03 17:41 ` John Stultz
  2026-06-09  7:56   ` [PATCH] Revert "selftests: timers: Remove local NSEC_PER_SEC and USEC_PER_SEC defines" Wake Liu
  0 siblings, 1 reply; 9+ messages in thread
From: John Stultz @ 2026-06-03 17:41 UTC (permalink / raw)
  To: Wake Liu
  Cc: Thomas Gleixner, Anna-Maria Behnsen, Frederic Weisbecker,
	Shuah Khan, Stephen Boyd, linux-kernel, linux-kselftest,
	cmllamas

On Wed, Jun 3, 2026 at 12:55 AM Wake Liu <wakel@google.com> wrote:
>
> Several timer tests use NSEC_PER_SEC for arithmetic. Since NSEC_PER_SEC
> is defined as 1000000000L in vdso/time64.h, it is 32-bit on 32-bit
> architectures. Multiplications like NSEC_PER_SEC * 10 or 5 * NSEC_PER_SEC
> overflow 32-bit signed long.
>
> Fix this by using LL suffixes or casting NSEC_PER_SEC to long long to
> force 64-bit multiplication.
>
> Signed-off-by: Wake Liu <wakel@google.com>

I feel like this has come up a few ways since commit 80fa614e2fbc
("selftests: timers: Remove local NSEC_PER_SEC and USEC_PER_SEC
defines"), and I definitely missed in that patch that the
include/vdso/time64.h NSEC_PER_SEC is defined as a long instead of a
long long.

Setting include/vdso/time64.h NSEC_PER_SEC to a long long probably
isn't a great idea as its a value that gets divided & used as a
divisor, so we want to keep it cheaper on 32bit systems, but anywhere
its multiplied you are really close to an overflow without explicit
casts (which has been a pretty good foot gun over the years).

So I'm wondering if it would be simpler to just revert 80fa614e2fbc
for the selftests as we don't have to worry about the performance cost
of doing the 64bit math everywhere there?

thanks
-john

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH] Revert "selftests: timers: Remove local NSEC_PER_SEC and USEC_PER_SEC defines"
  2026-06-03 17:41 ` John Stultz
@ 2026-06-09  7:56   ` Wake Liu
  2026-06-10  1:28     ` John Stultz
  0 siblings, 1 reply; 9+ messages in thread
From: Wake Liu @ 2026-06-09  7:56 UTC (permalink / raw)
  To: anna-maria, frederic, tglx, jstultz, shuah
  Cc: sboyd, cmllamas, linux-kernel, linux-kselftest, Wake Liu

This reverts commit 80fa614e2fbcf11069f0995e1601fb2e5702e2f4.

The reverted commit replaced local definitions of NSEC_PER_SEC and
USEC_PER_SEC with inclusion of <include/vdso/time64.h>. However,
NSEC_PER_SEC in vdso/time64.h is defined as 1000000000L, which is
32-bit on 32-bit architectures. This causes integer overflow warnings
in several timer tests when doing arithmetic like NSEC_PER_SEC * 10.

Reverting this change restores the local definitions which use
unsigned long long (ULL) or long long (LL) suffixes, ensuring 64-bit
multiplication and avoiding overflows on 32-bit systems.
This also decouples the userspace selftests from internal kernel
headers.

Signed-off-by: Wake Liu <wakel@google.com>
---
 tools/testing/selftests/timers/Makefile           |  2 +-
 tools/testing/selftests/timers/adjtick.c          |  4 +++-
 .../testing/selftests/timers/alarmtimer-suspend.c |  2 +-
 .../selftests/timers/inconsistency-check.c        |  2 +-
 tools/testing/selftests/timers/leap-a-day.c       |  2 +-
 tools/testing/selftests/timers/mqueue-lat.c       |  2 +-
 tools/testing/selftests/timers/nanosleep.c        |  3 +--
 tools/testing/selftests/timers/nsleep-lat.c       |  3 ++-
 tools/testing/selftests/timers/posix_timers.c     | 15 ++++++++-------
 tools/testing/selftests/timers/raw_skew.c         |  3 ++-
 tools/testing/selftests/timers/set-2038.c         |  3 ++-
 tools/testing/selftests/timers/set-timer-lat.c    |  3 ++-
 tools/testing/selftests/timers/valid-adjtimex.c   |  4 +++-
 13 files changed, 28 insertions(+), 20 deletions(-)

diff --git a/tools/testing/selftests/timers/Makefile b/tools/testing/selftests/timers/Makefile
index 32203593c62e..0e73a16874c4 100644
--- a/tools/testing/selftests/timers/Makefile
+++ b/tools/testing/selftests/timers/Makefile
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
-CFLAGS += -O3 -Wl,-no-as-needed -Wall -I $(top_srcdir)
+CFLAGS += -O3 -Wl,-no-as-needed -Wall
 LDLIBS += -lrt -lpthread -lm
 
 # these are all "safe" tests that don't modify
diff --git a/tools/testing/selftests/timers/adjtick.c b/tools/testing/selftests/timers/adjtick.c
index 5b3ef708d6e9..0053c6c5bfc0 100644
--- a/tools/testing/selftests/timers/adjtick.c
+++ b/tools/testing/selftests/timers/adjtick.c
@@ -22,10 +22,12 @@
 #include <sys/time.h>
 #include <sys/timex.h>
 #include <time.h>
-#include <include/vdso/time64.h>
 
 #include "kselftest.h"
 
+#define NSEC_PER_SEC		1000000000LL
+#define USEC_PER_SEC		1000000
+
 #define MILLION			1000000
 
 long systick;
diff --git a/tools/testing/selftests/timers/alarmtimer-suspend.c b/tools/testing/selftests/timers/alarmtimer-suspend.c
index aa66c805f6a4..ba277a708aba 100644
--- a/tools/testing/selftests/timers/alarmtimer-suspend.c
+++ b/tools/testing/selftests/timers/alarmtimer-suspend.c
@@ -28,10 +28,10 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
-#include <include/vdso/time64.h>
 #include <errno.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000ULL
 #define UNREASONABLE_LAT (NSEC_PER_SEC * 5) /* hopefully we resume in 5 secs */
 
 #define SUSPEND_SECS 15
diff --git a/tools/testing/selftests/timers/inconsistency-check.c b/tools/testing/selftests/timers/inconsistency-check.c
index e53e63e18683..bf08c06ab2cd 100644
--- a/tools/testing/selftests/timers/inconsistency-check.c
+++ b/tools/testing/selftests/timers/inconsistency-check.c
@@ -28,13 +28,13 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
 #define CALLS_PER_LOOP 64
+#define NSEC_PER_SEC 1000000000ULL
 
 char *clockstring(int clockid)
 {
diff --git a/tools/testing/selftests/timers/leap-a-day.c b/tools/testing/selftests/timers/leap-a-day.c
index 3568cfb3e815..e8be2405a72c 100644
--- a/tools/testing/selftests/timers/leap-a-day.c
+++ b/tools/testing/selftests/timers/leap-a-day.c
@@ -48,9 +48,9 @@
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000ULL
 #define CLOCK_TAI 11
 
 time_t next_leap;
diff --git a/tools/testing/selftests/timers/mqueue-lat.c b/tools/testing/selftests/timers/mqueue-lat.c
index c0d9368e4fca..80e1638c3b56 100644
--- a/tools/testing/selftests/timers/mqueue-lat.c
+++ b/tools/testing/selftests/timers/mqueue-lat.c
@@ -29,9 +29,9 @@
 #include <signal.h>
 #include <errno.h>
 #include <mqueue.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000ULL
 
 #define TARGET_TIMEOUT		100000000	/* 100ms in nanoseconds */
 #define UNRESONABLE_LATENCY	40000000	/* 40ms in nanosecs */
diff --git a/tools/testing/selftests/timers/nanosleep.c b/tools/testing/selftests/timers/nanosleep.c
index a054680b3372..218191fd845f 100644
--- a/tools/testing/selftests/timers/nanosleep.c
+++ b/tools/testing/selftests/timers/nanosleep.c
@@ -27,10 +27,9 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
-/* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
+#define NSEC_PER_SEC 1000000000ULL
 #define CLOCK_HWSPECIFIC		10
 
 #define UNSUPPORTED 0xf00f
diff --git a/tools/testing/selftests/timers/nsleep-lat.c b/tools/testing/selftests/timers/nsleep-lat.c
index a7ba1eb1e21b..88449460affe 100644
--- a/tools/testing/selftests/timers/nsleep-lat.c
+++ b/tools/testing/selftests/timers/nsleep-lat.c
@@ -24,9 +24,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000ULL
+
 #define UNRESONABLE_LATENCY 40000000 /* 40ms in nanosecs */
 
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
diff --git a/tools/testing/selftests/timers/posix_timers.c b/tools/testing/selftests/timers/posix_timers.c
index 38512623622a..6f78b6068589 100644
--- a/tools/testing/selftests/timers/posix_timers.c
+++ b/tools/testing/selftests/timers/posix_timers.c
@@ -16,13 +16,14 @@
 #include <string.h>
 #include <unistd.h>
 #include <time.h>
-#include <include/vdso/time64.h>
 #include <pthread.h>
 #include <stdbool.h>
 
 #include "kselftest.h"
 
 #define DELAY 2
+#define USECS_PER_SEC 1000000
+#define NSECS_PER_SEC 1000000000
 
 static void __fatal_error(const char *test, const char *name, const char *what)
 {
@@ -87,9 +88,9 @@ static int check_diff(struct timeval start, struct timeval end)
 	long long diff;
 
 	diff = end.tv_usec - start.tv_usec;
-	diff += (end.tv_sec - start.tv_sec) * USEC_PER_SEC;
+	diff += (end.tv_sec - start.tv_sec) * USECS_PER_SEC;
 
-	if (llabs(diff - DELAY * USEC_PER_SEC) > USEC_PER_SEC / 2) {
+	if (llabs(diff - DELAY * USECS_PER_SEC) > USECS_PER_SEC / 2) {
 		printf("Diff too high: %lld..", diff);
 		return -1;
 	}
@@ -449,7 +450,7 @@ static inline int64_t calcdiff_ns(struct timespec t1, struct timespec t2)
 {
 	int64_t diff;
 
-	diff = NSEC_PER_SEC * (int64_t)((int) t1.tv_sec - (int) t2.tv_sec);
+	diff = NSECS_PER_SEC * (int64_t)((int) t1.tv_sec - (int) t2.tv_sec);
 	diff += ((int) t1.tv_nsec - (int) t2.tv_nsec);
 	return diff;
 }
@@ -480,7 +481,7 @@ static void check_sigev_none(int which, const char *name)
 	do {
 		if (clock_gettime(which, &now))
 			fatal_error(name, "clock_gettime()");
-	} while (calcdiff_ns(now, start) < NSEC_PER_SEC);
+	} while (calcdiff_ns(now, start) < NSECS_PER_SEC);
 
 	if (timer_gettime(timerid, &its))
 		fatal_error(name, "timer_gettime()");
@@ -537,7 +538,7 @@ static void check_gettime(int which, const char *name)
 			wraps++;
 		prev = its;
 
-	} while (calcdiff_ns(now, start) < NSEC_PER_SEC);
+	} while (calcdiff_ns(now, start) < NSECS_PER_SEC);
 
 	if (timer_delete(timerid))
 		fatal_error(name, "timer_delete()");
@@ -588,7 +589,7 @@ static void check_overrun(int which, const char *name)
 	do {
 		if (clock_gettime(which, &now))
 			fatal_error(name, "clock_gettime()");
-	} while (calcdiff_ns(now, start) < NSEC_PER_SEC);
+	} while (calcdiff_ns(now, start) < NSECS_PER_SEC);
 
 	/* Unblock it, which should deliver a signal */
 	if (sigprocmask(SIG_UNBLOCK, &set, NULL))
diff --git a/tools/testing/selftests/timers/raw_skew.c b/tools/testing/selftests/timers/raw_skew.c
index a7bae7d80916..2dd16cb4cdd0 100644
--- a/tools/testing/selftests/timers/raw_skew.c
+++ b/tools/testing/selftests/timers/raw_skew.c
@@ -25,9 +25,10 @@
 #include <sys/time.h>
 #include <sys/timex.h>
 #include <time.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define shift_right(x, s) ({		\
 	__typeof__(x) __x = (x);	\
 	__typeof__(s) __s = (s);	\
diff --git a/tools/testing/selftests/timers/set-2038.c b/tools/testing/selftests/timers/set-2038.c
index ecc171de4728..c1235638406d 100644
--- a/tools/testing/selftests/timers/set-2038.c
+++ b/tools/testing/selftests/timers/set-2038.c
@@ -27,9 +27,10 @@
 #include <unistd.h>
 #include <time.h>
 #include <sys/time.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define KTIME_MAX	((long long)~((unsigned long long)1 << 63))
 #define KTIME_SEC_MAX	(KTIME_MAX / NSEC_PER_SEC)
 
diff --git a/tools/testing/selftests/timers/set-timer-lat.c b/tools/testing/selftests/timers/set-timer-lat.c
index 44d2e3614fa5..1b60d6f3be40 100644
--- a/tools/testing/selftests/timers/set-timer-lat.c
+++ b/tools/testing/selftests/timers/set-timer-lat.c
@@ -28,12 +28,13 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
+
+#define NSEC_PER_SEC 1000000000ULL
 #define UNRESONABLE_LATENCY 40000000 /* 40ms in nanosecs */
 
 #define TIMER_SECS 1
diff --git a/tools/testing/selftests/timers/valid-adjtimex.c b/tools/testing/selftests/timers/valid-adjtimex.c
index e1e56d3097d6..dc2559eb11a5 100644
--- a/tools/testing/selftests/timers/valid-adjtimex.c
+++ b/tools/testing/selftests/timers/valid-adjtimex.c
@@ -29,9 +29,11 @@
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+#define USEC_PER_SEC 1000000LL
+
 #define ADJ_SETOFFSET 0x0100
 
 #include <sys/syscall.h>
-- 
2.54.0.1064.gd145956f57-goog


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH] Revert "selftests: timers: Remove local NSEC_PER_SEC and USEC_PER_SEC defines"
  2026-06-09  7:56   ` [PATCH] Revert "selftests: timers: Remove local NSEC_PER_SEC and USEC_PER_SEC defines" Wake Liu
@ 2026-06-10  1:28     ` John Stultz
  2026-06-10  1:47       ` [PATCH v2] selftests: timers: Partially revert "Remove " Wake Liu
  0 siblings, 1 reply; 9+ messages in thread
From: John Stultz @ 2026-06-10  1:28 UTC (permalink / raw)
  To: Wake Liu
  Cc: anna-maria, frederic, tglx, shuah, sboyd, cmllamas, linux-kernel,
	linux-kselftest

On Tue, Jun 9, 2026 at 12:56 AM Wake Liu <wakel@google.com> wrote:
>
> This reverts commit 80fa614e2fbcf11069f0995e1601fb2e5702e2f4.
>
> The reverted commit replaced local definitions of NSEC_PER_SEC and
> USEC_PER_SEC with inclusion of <include/vdso/time64.h>. However,
> NSEC_PER_SEC in vdso/time64.h is defined as 1000000000L, which is
> 32-bit on 32-bit architectures. This causes integer overflow warnings
> in several timer tests when doing arithmetic like NSEC_PER_SEC * 10.
>
> Reverting this change restores the local definitions which use
> unsigned long long (ULL) or long long (LL) suffixes, ensuring 64-bit
> multiplication and avoiding overflows on 32-bit systems.
> This also decouples the userspace selftests from internal kernel
> headers.

Hey Wake,
  Thanks for sending this out. While I agree reverting back to local
definitions to ensure we're using 64bit values is better then adding
lots of casting, I think a straight revert isn't maybe the best, since
the original patch did have value in cleaning up the inconsistencies
between tests.

Maybe a "partial" revert would be best, re-adding the local
definitions but avoiding the quirks and inconsistencies between the
tests.


> diff --git a/tools/testing/selftests/timers/adjtick.c b/tools/testing/selftests/timers/adjtick.c
> index 5b3ef708d6e9..0053c6c5bfc0 100644
> --- a/tools/testing/selftests/timers/adjtick.c
> +++ b/tools/testing/selftests/timers/adjtick.c
> @@ -22,10 +22,12 @@
>  #include <sys/time.h>
>  #include <sys/timex.h>
>  #include <time.h>
> -#include <include/vdso/time64.h>
>
>  #include "kselftest.h"
>
> +#define NSEC_PER_SEC           1000000000LL
> +#define USEC_PER_SEC           1000000
> +
>  #define MILLION                        1000000
>
>  long systick;
> diff --git a/tools/testing/selftests/timers/alarmtimer-suspend.c b/tools/testing/selftests/timers/alarmtimer-suspend.c
> index aa66c805f6a4..ba277a708aba 100644
> --- a/tools/testing/selftests/timers/alarmtimer-suspend.c
> +++ b/tools/testing/selftests/timers/alarmtimer-suspend.c
> @@ -28,10 +28,10 @@
>  #include <signal.h>
>  #include <stdlib.h>
>  #include <pthread.h>
> -#include <include/vdso/time64.h>
>  #include <errno.h>
>  #include "kselftest.h"
>
> +#define NSEC_PER_SEC 1000000000ULL


It seems like picking LL across the board would probably be a good idea.


> diff --git a/tools/testing/selftests/timers/posix_timers.c b/tools/testing/selftests/timers/posix_timers.c
> index 38512623622a..6f78b6068589 100644
> --- a/tools/testing/selftests/timers/posix_timers.c
> +++ b/tools/testing/selftests/timers/posix_timers.c
> @@ -16,13 +16,14 @@
>  #include <string.h>
>  #include <unistd.h>
>  #include <time.h>
> -#include <include/vdso/time64.h>
>  #include <pthread.h>
>  #include <stdbool.h>
>
>  #include "kselftest.h"
>
>  #define DELAY 2
> +#define USECS_PER_SEC 1000000
> +#define NSECS_PER_SEC 1000000000
>
>  static void __fatal_error(const char *test, const char *name, const char *what)
>  {
> @@ -87,9 +88,9 @@ static int check_diff(struct timeval start, struct timeval end)
>         long long diff;
>
>         diff = end.tv_usec - start.tv_usec;
> -       diff += (end.tv_sec - start.tv_sec) * USEC_PER_SEC;
> +       diff += (end.tv_sec - start.tv_sec) * USECS_PER_SEC;
>
> -       if (llabs(diff - DELAY * USEC_PER_SEC) > USEC_PER_SEC / 2) {
> +       if (llabs(diff - DELAY * USECS_PER_SEC) > USECS_PER_SEC / 2) {
>                 printf("Diff too high: %lld..", diff);
>                 return -1;
>         }

Similarly I don't think re-introducing the plural definitions to the
code here is useful. Lets keep the cleanups, but just re-add the local
definition.

thanks
-john

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [PATCH v2] selftests: timers: Partially revert "Remove local NSEC_PER_SEC and USEC_PER_SEC defines"
  2026-06-10  1:28     ` John Stultz
@ 2026-06-10  1:47       ` Wake Liu
  2026-06-10  2:00         ` John Stultz
                           ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Wake Liu @ 2026-06-10  1:47 UTC (permalink / raw)
  To: anna-maria, frederic, tglx, jstultz, shuah
  Cc: sboyd, cmllamas, linux-kernel, linux-kselftest, Wake Liu

This partially reverts commit 80fa614e2fbc ("selftests: timers: Remove
local NSEC_PER_SEC and USEC_PER_SEC defines").

The original commit removed local definitions of NSEC_PER_SEC and
USEC_PER_SEC in favor of including <include/vdso/time64.h>. However,
NSEC_PER_SEC in vdso/time64.h is defined as 1000000000L, which is
32-bit on 32-bit architectures. This causes integer overflow warnings
in several timer tests when doing arithmetic like NSEC_PER_SEC * 10 on
32-bit systems.

To fix this, restore the local definitions of NSEC_PER_SEC and
USEC_PER_SEC in the test files, but use "LL" suffix consistently
(1000000000LL and 1000000LL) to ensure 64-bit arithmetic and avoid
overflows.

We keep the cleanup from the original commit that renamed plural
definitions (NSECS_PER_SEC/USECS_PER_SEC) to singular ones in
posix_timers.c, but we now define them locally there as well.
This also removes the dependency of the selftests on the internal
kernel header <include/vdso/time64.h>.

Signed-off-by: Wake Liu <wakel@google.com>
---
 tools/testing/selftests/timers/Makefile              | 2 +-
 tools/testing/selftests/timers/adjtick.c             | 5 +++--
 tools/testing/selftests/timers/alarmtimer-suspend.c  | 3 ++-
 tools/testing/selftests/timers/inconsistency-check.c | 3 ++-
 tools/testing/selftests/timers/leap-a-day.c          | 3 ++-
 tools/testing/selftests/timers/mqueue-lat.c          | 3 ++-
 tools/testing/selftests/timers/nanosleep.c           | 3 ++-
 tools/testing/selftests/timers/nsleep-lat.c          | 3 ++-
 tools/testing/selftests/timers/posix_timers.c        | 4 +++-
 tools/testing/selftests/timers/raw_skew.c            | 3 ++-
 tools/testing/selftests/timers/set-2038.c            | 3 ++-
 tools/testing/selftests/timers/set-timer-lat.c       | 3 ++-
 tools/testing/selftests/timers/valid-adjtimex.c      | 4 +++-
 13 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/tools/testing/selftests/timers/Makefile b/tools/testing/selftests/timers/Makefile
index 32203593c62e..0e73a16874c4 100644
--- a/tools/testing/selftests/timers/Makefile
+++ b/tools/testing/selftests/timers/Makefile
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
-CFLAGS += -O3 -Wl,-no-as-needed -Wall -I $(top_srcdir)
+CFLAGS += -O3 -Wl,-no-as-needed -Wall
 LDLIBS += -lrt -lpthread -lm
 
 # these are all "safe" tests that don't modify
diff --git a/tools/testing/selftests/timers/adjtick.c b/tools/testing/selftests/timers/adjtick.c
index 5b3ef708d6e9..22d274d5520f 100644
--- a/tools/testing/selftests/timers/adjtick.c
+++ b/tools/testing/selftests/timers/adjtick.c
@@ -22,10 +22,11 @@
 #include <sys/time.h>
 #include <sys/timex.h>
 #include <time.h>
-#include <include/vdso/time64.h>
-
 #include "kselftest.h"
 
+#define NSEC_PER_SEC		1000000000LL
+#define USEC_PER_SEC		1000000LL
+
 #define MILLION			1000000
 
 long systick;
diff --git a/tools/testing/selftests/timers/alarmtimer-suspend.c b/tools/testing/selftests/timers/alarmtimer-suspend.c
index aa66c805f6a4..d55d5b0377c6 100644
--- a/tools/testing/selftests/timers/alarmtimer-suspend.c
+++ b/tools/testing/selftests/timers/alarmtimer-suspend.c
@@ -28,10 +28,11 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
-#include <include/vdso/time64.h>
 #include <errno.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define UNREASONABLE_LAT (NSEC_PER_SEC * 5) /* hopefully we resume in 5 secs */
 
 #define SUSPEND_SECS 15
diff --git a/tools/testing/selftests/timers/inconsistency-check.c b/tools/testing/selftests/timers/inconsistency-check.c
index e53e63e18683..9ab7066b4e32 100644
--- a/tools/testing/selftests/timers/inconsistency-check.c
+++ b/tools/testing/selftests/timers/inconsistency-check.c
@@ -28,9 +28,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
diff --git a/tools/testing/selftests/timers/leap-a-day.c b/tools/testing/selftests/timers/leap-a-day.c
index 3568cfb3e815..26d788abda6c 100644
--- a/tools/testing/selftests/timers/leap-a-day.c
+++ b/tools/testing/selftests/timers/leap-a-day.c
@@ -48,9 +48,10 @@
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define CLOCK_TAI 11
 
 time_t next_leap;
diff --git a/tools/testing/selftests/timers/mqueue-lat.c b/tools/testing/selftests/timers/mqueue-lat.c
index c0d9368e4fca..ce8700c95cac 100644
--- a/tools/testing/selftests/timers/mqueue-lat.c
+++ b/tools/testing/selftests/timers/mqueue-lat.c
@@ -29,9 +29,10 @@
 #include <signal.h>
 #include <errno.h>
 #include <mqueue.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 
 #define TARGET_TIMEOUT		100000000	/* 100ms in nanoseconds */
 #define UNRESONABLE_LATENCY	40000000	/* 40ms in nanosecs */
diff --git a/tools/testing/selftests/timers/nanosleep.c b/tools/testing/selftests/timers/nanosleep.c
index a054680b3372..ceff18149a48 100644
--- a/tools/testing/selftests/timers/nanosleep.c
+++ b/tools/testing/selftests/timers/nanosleep.c
@@ -27,9 +27,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
diff --git a/tools/testing/selftests/timers/nsleep-lat.c b/tools/testing/selftests/timers/nsleep-lat.c
index a7ba1eb1e21b..15f6493ca7b5 100644
--- a/tools/testing/selftests/timers/nsleep-lat.c
+++ b/tools/testing/selftests/timers/nsleep-lat.c
@@ -24,9 +24,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define UNRESONABLE_LATENCY 40000000 /* 40ms in nanosecs */
 
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
diff --git a/tools/testing/selftests/timers/posix_timers.c b/tools/testing/selftests/timers/posix_timers.c
index 38512623622a..9fb231cd8279 100644
--- a/tools/testing/selftests/timers/posix_timers.c
+++ b/tools/testing/selftests/timers/posix_timers.c
@@ -16,12 +16,14 @@
 #include <string.h>
 #include <unistd.h>
 #include <time.h>
-#include <include/vdso/time64.h>
 #include <pthread.h>
 #include <stdbool.h>
 
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+#define USEC_PER_SEC 1000000LL
+
 #define DELAY 2
 
 static void __fatal_error(const char *test, const char *name, const char *what)
diff --git a/tools/testing/selftests/timers/raw_skew.c b/tools/testing/selftests/timers/raw_skew.c
index a7bae7d80916..2dd16cb4cdd0 100644
--- a/tools/testing/selftests/timers/raw_skew.c
+++ b/tools/testing/selftests/timers/raw_skew.c
@@ -25,9 +25,10 @@
 #include <sys/time.h>
 #include <sys/timex.h>
 #include <time.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define shift_right(x, s) ({		\
 	__typeof__(x) __x = (x);	\
 	__typeof__(s) __s = (s);	\
diff --git a/tools/testing/selftests/timers/set-2038.c b/tools/testing/selftests/timers/set-2038.c
index ecc171de4728..c1235638406d 100644
--- a/tools/testing/selftests/timers/set-2038.c
+++ b/tools/testing/selftests/timers/set-2038.c
@@ -27,9 +27,10 @@
 #include <unistd.h>
 #include <time.h>
 #include <sys/time.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define KTIME_MAX	((long long)~((unsigned long long)1 << 63))
 #define KTIME_SEC_MAX	(KTIME_MAX / NSEC_PER_SEC)
 
diff --git a/tools/testing/selftests/timers/set-timer-lat.c b/tools/testing/selftests/timers/set-timer-lat.c
index 44d2e3614fa5..e092c18befff 100644
--- a/tools/testing/selftests/timers/set-timer-lat.c
+++ b/tools/testing/selftests/timers/set-timer-lat.c
@@ -28,9 +28,10 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
diff --git a/tools/testing/selftests/timers/valid-adjtimex.c b/tools/testing/selftests/timers/valid-adjtimex.c
index e1e56d3097d6..dc2559eb11a5 100644
--- a/tools/testing/selftests/timers/valid-adjtimex.c
+++ b/tools/testing/selftests/timers/valid-adjtimex.c
@@ -29,9 +29,11 @@
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+#define USEC_PER_SEC 1000000LL
+
 #define ADJ_SETOFFSET 0x0100
 
 #include <sys/syscall.h>
-- 
2.54.0.1099.g489fc7bff1-goog


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] selftests: timers: Partially revert "Remove local NSEC_PER_SEC and USEC_PER_SEC defines"
  2026-06-10  1:47       ` [PATCH v2] selftests: timers: Partially revert "Remove " Wake Liu
@ 2026-06-10  2:00         ` John Stultz
  2026-06-10  3:13           ` Wake Liu
  2026-07-07 22:22         ` [tip: timers/core] " tip-bot2 for Wake Liu
  2026-07-10  7:25         ` tip-bot2 for Wake Liu
  2 siblings, 1 reply; 9+ messages in thread
From: John Stultz @ 2026-06-10  2:00 UTC (permalink / raw)
  To: Wake Liu
  Cc: anna-maria, frederic, tglx, shuah, sboyd, cmllamas, linux-kernel,
	linux-kselftest

On Tue, Jun 9, 2026 at 6:47 PM Wake Liu <wakel@google.com> wrote:
>
> This partially reverts commit 80fa614e2fbc ("selftests: timers: Remove
> local NSEC_PER_SEC and USEC_PER_SEC defines").
>
> The original commit removed local definitions of NSEC_PER_SEC and
> USEC_PER_SEC in favor of including <include/vdso/time64.h>. However,
> NSEC_PER_SEC in vdso/time64.h is defined as 1000000000L, which is
> 32-bit on 32-bit architectures. This causes integer overflow warnings
> in several timer tests when doing arithmetic like NSEC_PER_SEC * 10 on
> 32-bit systems.
>
> To fix this, restore the local definitions of NSEC_PER_SEC and
> USEC_PER_SEC in the test files, but use "LL" suffix consistently
> (1000000000LL and 1000000LL) to ensure 64-bit arithmetic and avoid
> overflows.
>
> We keep the cleanup from the original commit that renamed plural
> definitions (NSECS_PER_SEC/USECS_PER_SEC) to singular ones in
> posix_timers.c, but we now define them locally there as well.
> This also removes the dependency of the selftests on the internal
> kernel header <include/vdso/time64.h>.
>
> Signed-off-by: Wake Liu <wakel@google.com>

This looks ok to me. Thanks for putting this together!

Acked-by: John Stultz <jstultz@google.com>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [PATCH v2] selftests: timers: Partially revert "Remove local NSEC_PER_SEC and USEC_PER_SEC defines"
  2026-06-10  2:00         ` John Stultz
@ 2026-06-10  3:13           ` Wake Liu
  0 siblings, 0 replies; 9+ messages in thread
From: Wake Liu @ 2026-06-10  3:13 UTC (permalink / raw)
  To: John Stultz
  Cc: anna-maria, frederic, tglx, shuah, sboyd, cmllamas, linux-kernel,
	linux-kselftest

Hi John,

Thanks for the review and Ack!


On Wed, Jun 10, 2026 at 10:00 AM John Stultz <jstultz@google.com> wrote:
>
> On Tue, Jun 9, 2026 at 6:47 PM Wake Liu <wakel@google.com> wrote:
> >
> > This partially reverts commit 80fa614e2fbc ("selftests: timers: Remove
> > local NSEC_PER_SEC and USEC_PER_SEC defines").
> >
> > The original commit removed local definitions of NSEC_PER_SEC and
> > USEC_PER_SEC in favor of including <include/vdso/time64.h>. However,
> > NSEC_PER_SEC in vdso/time64.h is defined as 1000000000L, which is
> > 32-bit on 32-bit architectures. This causes integer overflow warnings
> > in several timer tests when doing arithmetic like NSEC_PER_SEC * 10 on
> > 32-bit systems.
> >
> > To fix this, restore the local definitions of NSEC_PER_SEC and
> > USEC_PER_SEC in the test files, but use "LL" suffix consistently
> > (1000000000LL and 1000000LL) to ensure 64-bit arithmetic and avoid
> > overflows.
> >
> > We keep the cleanup from the original commit that renamed plural
> > definitions (NSECS_PER_SEC/USECS_PER_SEC) to singular ones in
> > posix_timers.c, but we now define them locally there as well.
> > This also removes the dependency of the selftests on the internal
> > kernel header <include/vdso/time64.h>.
> >
> > Signed-off-by: Wake Liu <wakel@google.com>
>
> This looks ok to me. Thanks for putting this together!
>
> Acked-by: John Stultz <jstultz@google.com>



--
Best Regards,
Wake Liu

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [tip: timers/core] selftests: timers: Partially revert "Remove local NSEC_PER_SEC and USEC_PER_SEC defines"
  2026-06-10  1:47       ` [PATCH v2] selftests: timers: Partially revert "Remove " Wake Liu
  2026-06-10  2:00         ` John Stultz
@ 2026-07-07 22:22         ` tip-bot2 for Wake Liu
  2026-07-10  7:25         ` tip-bot2 for Wake Liu
  2 siblings, 0 replies; 9+ messages in thread
From: tip-bot2 for Wake Liu @ 2026-07-07 22:22 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Wake Liu, Thomas Gleixner, John Stultz, x86, linux-kernel

The following commit has been merged into the timers/core branch of tip:

Commit-ID:     aca60c717492c858814f74d4403aeb37643eef78
Gitweb:        https://git.kernel.org/tip/aca60c717492c858814f74d4403aeb37643eef78
Author:        Wake Liu <wakel@google.com>
AuthorDate:    Wed, 10 Jun 2026 01:47:21 
Committer:     Thomas Gleixner <tglx@kernel.org>
CommitterDate: Wed, 08 Jul 2026 00:21:19 +02:00

selftests: timers: Partially revert "Remove local NSEC_PER_SEC and USEC_PER_SEC defines"

This partially reverts commit 80fa614e2fbc ("selftests: timers: Remove
local NSEC_PER_SEC and USEC_PER_SEC defines").

The original commit removed local definitions of NSEC_PER_SEC and
USEC_PER_SEC in favor of including <include/vdso/time64.h>. However,
NSEC_PER_SEC in vdso/time64.h is defined as 1000000000L, which is
32-bit on 32-bit architectures. This causes integer overflow warnings
in several timer tests when doing arithmetic like NSEC_PER_SEC * 10 on
32-bit systems.

To fix this, restore the local definitions of NSEC_PER_SEC and
USEC_PER_SEC in the test files, but use "LL" suffix consistently
(1000000000LL and 1000000LL) to ensure 64-bit arithmetic and avoid
overflows.

We keep the cleanup from the original commit that renamed plural
definitions (NSECS_PER_SEC/USECS_PER_SEC) to singular ones in
posix_timers.c, but we now define them locally there as well.
This also removes the dependency of the selftests on the internal
kernel header <include/vdso/time64.h>.

Signed-off-by: Wake Liu <wakel@google.com>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Acked-by: John Stultz <jstultz@google.com>
Link: https://patch.msgid.link/20260610014721.718362-1-wakel@google.com
---
 tools/testing/selftests/timers/Makefile              | 2 +-
 tools/testing/selftests/timers/adjtick.c             | 5 +++--
 tools/testing/selftests/timers/alarmtimer-suspend.c  | 3 ++-
 tools/testing/selftests/timers/inconsistency-check.c | 3 ++-
 tools/testing/selftests/timers/leap-a-day.c          | 3 ++-
 tools/testing/selftests/timers/mqueue-lat.c          | 3 ++-
 tools/testing/selftests/timers/nanosleep.c           | 3 ++-
 tools/testing/selftests/timers/nsleep-lat.c          | 3 ++-
 tools/testing/selftests/timers/posix_timers.c        | 4 +++-
 tools/testing/selftests/timers/raw_skew.c            | 3 ++-
 tools/testing/selftests/timers/set-2038.c            | 3 ++-
 tools/testing/selftests/timers/set-timer-lat.c       | 3 ++-
 tools/testing/selftests/timers/valid-adjtimex.c      | 4 +++-
 13 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/tools/testing/selftests/timers/Makefile b/tools/testing/selftests/timers/Makefile
index 3220359..0e73a16 100644
--- a/tools/testing/selftests/timers/Makefile
+++ b/tools/testing/selftests/timers/Makefile
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
-CFLAGS += -O3 -Wl,-no-as-needed -Wall -I $(top_srcdir)
+CFLAGS += -O3 -Wl,-no-as-needed -Wall
 LDLIBS += -lrt -lpthread -lm
 
 # these are all "safe" tests that don't modify
diff --git a/tools/testing/selftests/timers/adjtick.c b/tools/testing/selftests/timers/adjtick.c
index 5b3ef70..22d274d 100644
--- a/tools/testing/selftests/timers/adjtick.c
+++ b/tools/testing/selftests/timers/adjtick.c
@@ -22,10 +22,11 @@
 #include <sys/time.h>
 #include <sys/timex.h>
 #include <time.h>
-#include <include/vdso/time64.h>
-
 #include "kselftest.h"
 
+#define NSEC_PER_SEC		1000000000LL
+#define USEC_PER_SEC		1000000LL
+
 #define MILLION			1000000
 
 long systick;
diff --git a/tools/testing/selftests/timers/alarmtimer-suspend.c b/tools/testing/selftests/timers/alarmtimer-suspend.c
index aa66c80..d55d5b0 100644
--- a/tools/testing/selftests/timers/alarmtimer-suspend.c
+++ b/tools/testing/selftests/timers/alarmtimer-suspend.c
@@ -28,10 +28,11 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
-#include <include/vdso/time64.h>
 #include <errno.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define UNREASONABLE_LAT (NSEC_PER_SEC * 5) /* hopefully we resume in 5 secs */
 
 #define SUSPEND_SECS 15
diff --git a/tools/testing/selftests/timers/inconsistency-check.c b/tools/testing/selftests/timers/inconsistency-check.c
index e53e63e..9ab7066 100644
--- a/tools/testing/selftests/timers/inconsistency-check.c
+++ b/tools/testing/selftests/timers/inconsistency-check.c
@@ -28,9 +28,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
diff --git a/tools/testing/selftests/timers/leap-a-day.c b/tools/testing/selftests/timers/leap-a-day.c
index 97c8c66..71b4973 100644
--- a/tools/testing/selftests/timers/leap-a-day.c
+++ b/tools/testing/selftests/timers/leap-a-day.c
@@ -51,9 +51,10 @@
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define CLOCK_TAI 11
 
 time_t next_leap;
diff --git a/tools/testing/selftests/timers/mqueue-lat.c b/tools/testing/selftests/timers/mqueue-lat.c
index c0d9368..ce8700c 100644
--- a/tools/testing/selftests/timers/mqueue-lat.c
+++ b/tools/testing/selftests/timers/mqueue-lat.c
@@ -29,9 +29,10 @@
 #include <signal.h>
 #include <errno.h>
 #include <mqueue.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 
 #define TARGET_TIMEOUT		100000000	/* 100ms in nanoseconds */
 #define UNRESONABLE_LATENCY	40000000	/* 40ms in nanosecs */
diff --git a/tools/testing/selftests/timers/nanosleep.c b/tools/testing/selftests/timers/nanosleep.c
index a054680..ceff181 100644
--- a/tools/testing/selftests/timers/nanosleep.c
+++ b/tools/testing/selftests/timers/nanosleep.c
@@ -27,9 +27,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
diff --git a/tools/testing/selftests/timers/nsleep-lat.c b/tools/testing/selftests/timers/nsleep-lat.c
index a7ba1eb..15f6493 100644
--- a/tools/testing/selftests/timers/nsleep-lat.c
+++ b/tools/testing/selftests/timers/nsleep-lat.c
@@ -24,9 +24,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define UNRESONABLE_LATENCY 40000000 /* 40ms in nanosecs */
 
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
diff --git a/tools/testing/selftests/timers/posix_timers.c b/tools/testing/selftests/timers/posix_timers.c
index 2f3bac9..fa168d8 100644
--- a/tools/testing/selftests/timers/posix_timers.c
+++ b/tools/testing/selftests/timers/posix_timers.c
@@ -16,12 +16,14 @@
 #include <string.h>
 #include <unistd.h>
 #include <time.h>
-#include <include/vdso/time64.h>
 #include <pthread.h>
 #include <stdbool.h>
 
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+#define USEC_PER_SEC 1000000LL
+
 #define DELAY 2
 
 static void __fatal_error(const char *test, const char *name, const char *what)
diff --git a/tools/testing/selftests/timers/raw_skew.c b/tools/testing/selftests/timers/raw_skew.c
index a7bae7d..2dd16cb 100644
--- a/tools/testing/selftests/timers/raw_skew.c
+++ b/tools/testing/selftests/timers/raw_skew.c
@@ -25,9 +25,10 @@
 #include <sys/time.h>
 #include <sys/timex.h>
 #include <time.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define shift_right(x, s) ({		\
 	__typeof__(x) __x = (x);	\
 	__typeof__(s) __s = (s);	\
diff --git a/tools/testing/selftests/timers/set-2038.c b/tools/testing/selftests/timers/set-2038.c
index ecc171d..c123563 100644
--- a/tools/testing/selftests/timers/set-2038.c
+++ b/tools/testing/selftests/timers/set-2038.c
@@ -27,9 +27,10 @@
 #include <unistd.h>
 #include <time.h>
 #include <sys/time.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define KTIME_MAX	((long long)~((unsigned long long)1 << 63))
 #define KTIME_SEC_MAX	(KTIME_MAX / NSEC_PER_SEC)
 
diff --git a/tools/testing/selftests/timers/set-timer-lat.c b/tools/testing/selftests/timers/set-timer-lat.c
index 44d2e36..e092c18 100644
--- a/tools/testing/selftests/timers/set-timer-lat.c
+++ b/tools/testing/selftests/timers/set-timer-lat.c
@@ -28,9 +28,10 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
diff --git a/tools/testing/selftests/timers/valid-adjtimex.c b/tools/testing/selftests/timers/valid-adjtimex.c
index e1e56d3..dc2559e 100644
--- a/tools/testing/selftests/timers/valid-adjtimex.c
+++ b/tools/testing/selftests/timers/valid-adjtimex.c
@@ -29,9 +29,11 @@
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+#define USEC_PER_SEC 1000000LL
+
 #define ADJ_SETOFFSET 0x0100
 
 #include <sys/syscall.h>

^ permalink raw reply	[flat|nested] 9+ messages in thread

* [tip: timers/core] selftests: timers: Partially revert "Remove local NSEC_PER_SEC and USEC_PER_SEC defines"
  2026-06-10  1:47       ` [PATCH v2] selftests: timers: Partially revert "Remove " Wake Liu
  2026-06-10  2:00         ` John Stultz
  2026-07-07 22:22         ` [tip: timers/core] " tip-bot2 for Wake Liu
@ 2026-07-10  7:25         ` tip-bot2 for Wake Liu
  2 siblings, 0 replies; 9+ messages in thread
From: tip-bot2 for Wake Liu @ 2026-07-10  7:25 UTC (permalink / raw)
  To: linux-tip-commits
  Cc: Wake Liu, Thomas Gleixner, John Stultz, x86, linux-kernel

The following commit has been merged into the timers/core branch of tip:

Commit-ID:     f44ce7fdbdd00a596455b8689b62c12d5530d610
Gitweb:        https://git.kernel.org/tip/f44ce7fdbdd00a596455b8689b62c12d5530d610
Author:        Wake Liu <wakel@google.com>
AuthorDate:    Wed, 10 Jun 2026 01:47:21 
Committer:     Thomas Gleixner <tglx@kernel.org>
CommitterDate: Fri, 10 Jul 2026 09:20:55 +02:00

selftests: timers: Partially revert "Remove local NSEC_PER_SEC and USEC_PER_SEC defines"

This partially reverts commit 80fa614e2fbc ("selftests: timers: Remove
local NSEC_PER_SEC and USEC_PER_SEC defines").

The original commit removed local definitions of NSEC_PER_SEC and
USEC_PER_SEC in favor of including <include/vdso/time64.h>. However,
NSEC_PER_SEC in vdso/time64.h is defined as 1000000000L, which is
32-bit on 32-bit architectures. This causes integer overflow warnings
in several timer tests when doing arithmetic like NSEC_PER_SEC * 10 on
32-bit systems.

To fix this, restore the local definitions of NSEC_PER_SEC and
USEC_PER_SEC in the test files, but use "LL" suffix consistently
(1000000000LL and 1000000LL) to ensure 64-bit arithmetic and avoid
overflows.

We keep the cleanup from the original commit that renamed plural
definitions (NSECS_PER_SEC/USECS_PER_SEC) to singular ones in
posix_timers.c, but we now define them locally there as well.
This also removes the dependency of the selftests on the internal
kernel header <include/vdso/time64.h>.

Signed-off-by: Wake Liu <wakel@google.com>
Signed-off-by: Thomas Gleixner <tglx@kernel.org>
Acked-by: John Stultz <jstultz@google.com>
Link: https://patch.msgid.link/20260610014721.718362-1-wakel@google.com
---
 tools/testing/selftests/timers/Makefile              | 2 +-
 tools/testing/selftests/timers/adjtick.c             | 5 +++--
 tools/testing/selftests/timers/alarmtimer-suspend.c  | 3 ++-
 tools/testing/selftests/timers/inconsistency-check.c | 3 ++-
 tools/testing/selftests/timers/leap-a-day.c          | 3 ++-
 tools/testing/selftests/timers/mqueue-lat.c          | 3 ++-
 tools/testing/selftests/timers/nanosleep.c           | 3 ++-
 tools/testing/selftests/timers/nsleep-lat.c          | 3 ++-
 tools/testing/selftests/timers/posix_timers.c        | 4 +++-
 tools/testing/selftests/timers/raw_skew.c            | 3 ++-
 tools/testing/selftests/timers/set-2038.c            | 3 ++-
 tools/testing/selftests/timers/set-timer-lat.c       | 3 ++-
 tools/testing/selftests/timers/valid-adjtimex.c      | 4 +++-
 13 files changed, 28 insertions(+), 14 deletions(-)

diff --git a/tools/testing/selftests/timers/Makefile b/tools/testing/selftests/timers/Makefile
index 3220359..0e73a16 100644
--- a/tools/testing/selftests/timers/Makefile
+++ b/tools/testing/selftests/timers/Makefile
@@ -1,5 +1,5 @@
 # SPDX-License-Identifier: GPL-2.0
-CFLAGS += -O3 -Wl,-no-as-needed -Wall -I $(top_srcdir)
+CFLAGS += -O3 -Wl,-no-as-needed -Wall
 LDLIBS += -lrt -lpthread -lm
 
 # these are all "safe" tests that don't modify
diff --git a/tools/testing/selftests/timers/adjtick.c b/tools/testing/selftests/timers/adjtick.c
index 5b3ef70..22d274d 100644
--- a/tools/testing/selftests/timers/adjtick.c
+++ b/tools/testing/selftests/timers/adjtick.c
@@ -22,10 +22,11 @@
 #include <sys/time.h>
 #include <sys/timex.h>
 #include <time.h>
-#include <include/vdso/time64.h>
-
 #include "kselftest.h"
 
+#define NSEC_PER_SEC		1000000000LL
+#define USEC_PER_SEC		1000000LL
+
 #define MILLION			1000000
 
 long systick;
diff --git a/tools/testing/selftests/timers/alarmtimer-suspend.c b/tools/testing/selftests/timers/alarmtimer-suspend.c
index aa66c80..d55d5b0 100644
--- a/tools/testing/selftests/timers/alarmtimer-suspend.c
+++ b/tools/testing/selftests/timers/alarmtimer-suspend.c
@@ -28,10 +28,11 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
-#include <include/vdso/time64.h>
 #include <errno.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define UNREASONABLE_LAT (NSEC_PER_SEC * 5) /* hopefully we resume in 5 secs */
 
 #define SUSPEND_SECS 15
diff --git a/tools/testing/selftests/timers/inconsistency-check.c b/tools/testing/selftests/timers/inconsistency-check.c
index e53e63e..9ab7066 100644
--- a/tools/testing/selftests/timers/inconsistency-check.c
+++ b/tools/testing/selftests/timers/inconsistency-check.c
@@ -28,9 +28,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
diff --git a/tools/testing/selftests/timers/leap-a-day.c b/tools/testing/selftests/timers/leap-a-day.c
index 97c8c66..71b4973 100644
--- a/tools/testing/selftests/timers/leap-a-day.c
+++ b/tools/testing/selftests/timers/leap-a-day.c
@@ -51,9 +51,10 @@
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define CLOCK_TAI 11
 
 time_t next_leap;
diff --git a/tools/testing/selftests/timers/mqueue-lat.c b/tools/testing/selftests/timers/mqueue-lat.c
index c0d9368..ce8700c 100644
--- a/tools/testing/selftests/timers/mqueue-lat.c
+++ b/tools/testing/selftests/timers/mqueue-lat.c
@@ -29,9 +29,10 @@
 #include <signal.h>
 #include <errno.h>
 #include <mqueue.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 
 #define TARGET_TIMEOUT		100000000	/* 100ms in nanoseconds */
 #define UNRESONABLE_LATENCY	40000000	/* 40ms in nanosecs */
diff --git a/tools/testing/selftests/timers/nanosleep.c b/tools/testing/selftests/timers/nanosleep.c
index a054680..ceff181 100644
--- a/tools/testing/selftests/timers/nanosleep.c
+++ b/tools/testing/selftests/timers/nanosleep.c
@@ -27,9 +27,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
diff --git a/tools/testing/selftests/timers/nsleep-lat.c b/tools/testing/selftests/timers/nsleep-lat.c
index a7ba1eb..15f6493 100644
--- a/tools/testing/selftests/timers/nsleep-lat.c
+++ b/tools/testing/selftests/timers/nsleep-lat.c
@@ -24,9 +24,10 @@
 #include <sys/timex.h>
 #include <string.h>
 #include <signal.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define UNRESONABLE_LATENCY 40000000 /* 40ms in nanosecs */
 
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
diff --git a/tools/testing/selftests/timers/posix_timers.c b/tools/testing/selftests/timers/posix_timers.c
index 2f3bac9..fa168d8 100644
--- a/tools/testing/selftests/timers/posix_timers.c
+++ b/tools/testing/selftests/timers/posix_timers.c
@@ -16,12 +16,14 @@
 #include <string.h>
 #include <unistd.h>
 #include <time.h>
-#include <include/vdso/time64.h>
 #include <pthread.h>
 #include <stdbool.h>
 
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+#define USEC_PER_SEC 1000000LL
+
 #define DELAY 2
 
 static void __fatal_error(const char *test, const char *name, const char *what)
diff --git a/tools/testing/selftests/timers/raw_skew.c b/tools/testing/selftests/timers/raw_skew.c
index a7bae7d..2dd16cb 100644
--- a/tools/testing/selftests/timers/raw_skew.c
+++ b/tools/testing/selftests/timers/raw_skew.c
@@ -25,9 +25,10 @@
 #include <sys/time.h>
 #include <sys/timex.h>
 #include <time.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define shift_right(x, s) ({		\
 	__typeof__(x) __x = (x);	\
 	__typeof__(s) __s = (s);	\
diff --git a/tools/testing/selftests/timers/set-2038.c b/tools/testing/selftests/timers/set-2038.c
index ecc171d..c123563 100644
--- a/tools/testing/selftests/timers/set-2038.c
+++ b/tools/testing/selftests/timers/set-2038.c
@@ -27,9 +27,10 @@
 #include <unistd.h>
 #include <time.h>
 #include <sys/time.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 #define KTIME_MAX	((long long)~((unsigned long long)1 << 63))
 #define KTIME_SEC_MAX	(KTIME_MAX / NSEC_PER_SEC)
 
diff --git a/tools/testing/selftests/timers/set-timer-lat.c b/tools/testing/selftests/timers/set-timer-lat.c
index 44d2e36..e092c18 100644
--- a/tools/testing/selftests/timers/set-timer-lat.c
+++ b/tools/testing/selftests/timers/set-timer-lat.c
@@ -28,9 +28,10 @@
 #include <signal.h>
 #include <stdlib.h>
 #include <pthread.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+
 /* CLOCK_HWSPECIFIC == CLOCK_SGI_CYCLE (Deprecated) */
 #define CLOCK_HWSPECIFIC		10
 
diff --git a/tools/testing/selftests/timers/valid-adjtimex.c b/tools/testing/selftests/timers/valid-adjtimex.c
index e1e56d3..dc2559e 100644
--- a/tools/testing/selftests/timers/valid-adjtimex.c
+++ b/tools/testing/selftests/timers/valid-adjtimex.c
@@ -29,9 +29,11 @@
 #include <string.h>
 #include <signal.h>
 #include <unistd.h>
-#include <include/vdso/time64.h>
 #include "kselftest.h"
 
+#define NSEC_PER_SEC 1000000000LL
+#define USEC_PER_SEC 1000000LL
+
 #define ADJ_SETOFFSET 0x0100
 
 #include <sys/syscall.h>

^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2026-07-10  7:25 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-06-03  7:55 [PATCH] selftests: timers: Fix integer overflows in 32-bit mode Wake Liu
2026-06-03 17:41 ` John Stultz
2026-06-09  7:56   ` [PATCH] Revert "selftests: timers: Remove local NSEC_PER_SEC and USEC_PER_SEC defines" Wake Liu
2026-06-10  1:28     ` John Stultz
2026-06-10  1:47       ` [PATCH v2] selftests: timers: Partially revert "Remove " Wake Liu
2026-06-10  2:00         ` John Stultz
2026-06-10  3:13           ` Wake Liu
2026-07-07 22:22         ` [tip: timers/core] " tip-bot2 for Wake Liu
2026-07-10  7:25         ` tip-bot2 for Wake Liu

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox

Powered by JetHome