linux-kselftest.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres
@ 2025-08-12  5:39 Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 1/8] selftests: vDSO: fix -Wunitialized in powerpc VDSO_CALL() wrapper Thomas Weißschuh
                   ` (7 more replies)
  0 siblings, 8 replies; 10+ messages in thread
From: Thomas Weißschuh @ 2025-08-12  5:39 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Vincenzo Frascino, Shuah Khan,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Christophe Leroy, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	Thomas Weißschuh, kernel test robot

Some cleanups for the vDSO selftests.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
Changes in v2:
- Also drop vdso_test_clock_getres from .gitignore
- Move patch to fix -Wunitialized in powerpc VDSO_CALL() into this series
- Rebase on v6.17-rc1
- Add test for clock_gettime64()
- Link to v1: https://lore.kernel.org/r/20250707-vdso-tests-fixes-v1-0-545be9781b0c@linutronix.de

---
Thomas Weißschuh (8):
      selftests: vDSO: fix -Wunitialized in powerpc VDSO_CALL() wrapper
      selftests: vDSO: vdso_test_abi: Correctly skip whole test with missing vDSO
      selftests: vDSO: vdso_test_abi: Use ksft_finished()
      selftests: vDSO: vdso_test_abi: Drop clock availability tests
      selftests: vDSO: vdso_test_abi: Use explicit indices for name array
      selftests: vDSO: vdso_test_abi: Test CPUTIME clocks
      selftests: vDSO: vdso_test_abi: Add tests for clock_gettime64()
      selftests: vDSO: Drop vdso_test_clock_getres

 tools/testing/selftests/vDSO/.gitignore            |   1 -
 tools/testing/selftests/vDSO/Makefile              |   2 -
 tools/testing/selftests/vDSO/vdso_call.h           |   7 +-
 tools/testing/selftests/vDSO/vdso_test_abi.c       | 101 +++++++++--------
 .../selftests/vDSO/vdso_test_clock_getres.c        | 123 ---------------------
 5 files changed, 59 insertions(+), 175 deletions(-)
---
base-commit: 8f5ae30d69d7543eee0d70083daf4de8fe15d585
change-id: 20250707-vdso-tests-fixes-7e4ddffd7f27

Best regards,
-- 
Thomas Weißschuh <thomas.weissschuh@linutronix.de>


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

* [PATCH v2 1/8] selftests: vDSO: fix -Wunitialized in powerpc VDSO_CALL() wrapper
  2025-08-12  5:39 [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres Thomas Weißschuh
@ 2025-08-12  5:39 ` Thomas Weißschuh
  2025-08-12  6:05   ` Christophe Leroy
  2025-08-12  5:39 ` [PATCH v2 2/8] selftests: vDSO: vdso_test_abi: Correctly skip whole test with missing vDSO Thomas Weißschuh
                   ` (6 subsequent siblings)
  7 siblings, 1 reply; 10+ messages in thread
From: Thomas Weißschuh @ 2025-08-12  5:39 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Vincenzo Frascino, Shuah Khan,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Christophe Leroy, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	Thomas Weißschuh, kernel test robot

The _rval register variable is meant to be an output operand of the asm
statement but is instead used as input operand.
clang 20.1 notices this and triggers -Wuninitialized warnings:

tools/testing/selftests/timers/auxclock.c:154:10: error: variable '_rval' is uninitialized when used here [-Werror,-Wuninitialized]
  154 |                 return VDSO_CALL(self->vdso_clock_gettime64, 2, clockid, ts);
      |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
tools/testing/selftests/timers/../vDSO/vdso_call.h:59:10: note: expanded from macro 'VDSO_CALL'
   59 |                 : "r" (_rval)                                           \
      |                        ^~~~~
tools/testing/selftests/timers/auxclock.c:154:10: note: variable '_rval' is declared here
tools/testing/selftests/timers/../vDSO/vdso_call.h:47:2: note: expanded from macro 'VDSO_CALL'
   47 |         register long _rval asm ("r3");                                 \
      |         ^

It seems the list of input and output operands have been switched around.
However as the argument registers are not always initialized they can not
be marked as pure inputs as that would trigger -Wuninitialized warnings.
Adding _rval as another input and output operand does also not work as it
would collide with the existing _r3 variable.

Instead reuse _r3 for both the argument and the return value.

Reported-by: kernel test robot <lkp@intel.com>
Closes: https://lore.kernel.org/oe-kbuild-all/202506180223.BOOk5jDK-lkp@intel.com/
Fixes: 6eda706a535c ("selftests: vDSO: fix the way vDSO functions are called for powerpc")
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 tools/testing/selftests/vDSO/vdso_call.h | 7 +++----
 1 file changed, 3 insertions(+), 4 deletions(-)

diff --git a/tools/testing/selftests/vDSO/vdso_call.h b/tools/testing/selftests/vDSO/vdso_call.h
index bb237d771051bd4103367fc60b54b505b7586965..e7205584cbdca5e10c13c1e9425d2023b02cda7f 100644
--- a/tools/testing/selftests/vDSO/vdso_call.h
+++ b/tools/testing/selftests/vDSO/vdso_call.h
@@ -44,7 +44,6 @@
 	register long _r6 asm ("r6");					\
 	register long _r7 asm ("r7");					\
 	register long _r8 asm ("r8");					\
-	register long _rval asm ("r3");					\
 									\
 	LOADARGS_##nr(fn, args);					\
 									\
@@ -54,13 +53,13 @@
 		"	bns+	1f\n"					\
 		"	neg	3, 3\n"					\
 		"1:"							\
-		: "+r" (_r0), "=r" (_r3), "+r" (_r4), "+r" (_r5),	\
+		: "+r" (_r0), "+r" (_r3), "+r" (_r4), "+r" (_r5),	\
 		  "+r" (_r6), "+r" (_r7), "+r" (_r8)			\
-		: "r" (_rval)						\
+		:							\
 		: "r9", "r10", "r11", "r12", "cr0", "cr1", "cr5",	\
 		  "cr6", "cr7", "xer", "lr", "ctr", "memory"		\
 	);								\
-	_rval;								\
+	_r3;								\
 })
 
 #else

-- 
2.50.1


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

* [PATCH v2 2/8] selftests: vDSO: vdso_test_abi: Correctly skip whole test with missing vDSO
  2025-08-12  5:39 [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 1/8] selftests: vDSO: fix -Wunitialized in powerpc VDSO_CALL() wrapper Thomas Weißschuh
@ 2025-08-12  5:39 ` Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 3/8] selftests: vDSO: vdso_test_abi: Use ksft_finished() Thomas Weißschuh
                   ` (5 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Thomas Weißschuh @ 2025-08-12  5:39 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Vincenzo Frascino, Shuah Khan,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Christophe Leroy, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	Thomas Weißschuh

If AT_SYSINFO_EHDR is missing the whole test needs to be skipped.
Currently this results in the following output:

	TAP version 13
	1..16
	# AT_SYSINFO_EHDR is not present!

This output is incorrect, as "1..16" still requires the subtest lines to
be printed, which isn't done however.

Switch to the correct skipping functions, so the output now correctly
indicates that no subtests are being run:

	TAP version 13
	1..0 # SKIP AT_SYSINFO_EHDR is not present!

Fixes: 693f5ca08ca0 ("kselftest: Extend vDSO selftest")
Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 tools/testing/selftests/vDSO/vdso_test_abi.c | 9 ++++-----
 1 file changed, 4 insertions(+), 5 deletions(-)

diff --git a/tools/testing/selftests/vDSO/vdso_test_abi.c b/tools/testing/selftests/vDSO/vdso_test_abi.c
index a54424e2336f4597e67668052b62cd7d6c0531ff..67cbfc56e4e1b0edce50d37ae145a054e304892a 100644
--- a/tools/testing/selftests/vDSO/vdso_test_abi.c
+++ b/tools/testing/selftests/vDSO/vdso_test_abi.c
@@ -182,12 +182,11 @@ int main(int argc, char **argv)
 	unsigned long sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR);
 
 	ksft_print_header();
-	ksft_set_plan(VDSO_TEST_PLAN);
 
-	if (!sysinfo_ehdr) {
-		ksft_print_msg("AT_SYSINFO_EHDR is not present!\n");
-		return KSFT_SKIP;
-	}
+	if (!sysinfo_ehdr)
+		ksft_exit_skip("AT_SYSINFO_EHDR is not present!\n");
+
+	ksft_set_plan(VDSO_TEST_PLAN);
 
 	version = versions[VDSO_VERSION];
 	name = (const char **)&names[VDSO_NAMES];

-- 
2.50.1


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

* [PATCH v2 3/8] selftests: vDSO: vdso_test_abi: Use ksft_finished()
  2025-08-12  5:39 [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 1/8] selftests: vDSO: fix -Wunitialized in powerpc VDSO_CALL() wrapper Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 2/8] selftests: vDSO: vdso_test_abi: Correctly skip whole test with missing vDSO Thomas Weißschuh
@ 2025-08-12  5:39 ` Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 4/8] selftests: vDSO: vdso_test_abi: Drop clock availability tests Thomas Weißschuh
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Thomas Weißschuh @ 2025-08-12  5:39 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Vincenzo Frascino, Shuah Khan,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Christophe Leroy, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	Thomas Weißschuh

The existing logic is just an open-coded ksft_finished().
Replace it with the real thing.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 tools/testing/selftests/vDSO/vdso_test_abi.c | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)

diff --git a/tools/testing/selftests/vDSO/vdso_test_abi.c b/tools/testing/selftests/vDSO/vdso_test_abi.c
index 67cbfc56e4e1b0edce50d37ae145a054e304892a..b989167ec2472d1f8369e61f13e535b15545a6bb 100644
--- a/tools/testing/selftests/vDSO/vdso_test_abi.c
+++ b/tools/testing/selftests/vDSO/vdso_test_abi.c
@@ -231,6 +231,5 @@ int main(int argc, char **argv)
 
 	vdso_test_time();
 
-	ksft_print_cnts();
-	return ksft_get_fail_cnt() == 0 ? KSFT_PASS : KSFT_FAIL;
+	ksft_finished();
 }

-- 
2.50.1


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

* [PATCH v2 4/8] selftests: vDSO: vdso_test_abi: Drop clock availability tests
  2025-08-12  5:39 [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres Thomas Weißschuh
                   ` (2 preceding siblings ...)
  2025-08-12  5:39 ` [PATCH v2 3/8] selftests: vDSO: vdso_test_abi: Use ksft_finished() Thomas Weißschuh
@ 2025-08-12  5:39 ` Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 5/8] selftests: vDSO: vdso_test_abi: Use explicit indices for name array Thomas Weißschuh
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Thomas Weißschuh @ 2025-08-12  5:39 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Vincenzo Frascino, Shuah Khan,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Christophe Leroy, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	Thomas Weißschuh

The test uses the kselftest.h framework and declares in its testplan to
always execute 16 testcases. If any of the clockids were not available,
the testplan would not be satisfied anymore and the test would fail.
Apparently that never happened, so the clockids are always available.

Remove the pointless checks.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 tools/testing/selftests/vDSO/vdso_test_abi.c | 24 ------------------------
 1 file changed, 24 deletions(-)

diff --git a/tools/testing/selftests/vDSO/vdso_test_abi.c b/tools/testing/selftests/vDSO/vdso_test_abi.c
index b989167ec2472d1f8369e61f13e535b15545a6bb..d236dd8305e1e3f41df07e0b7ffd5cfe8aebf826 100644
--- a/tools/testing/selftests/vDSO/vdso_test_abi.c
+++ b/tools/testing/selftests/vDSO/vdso_test_abi.c
@@ -197,37 +197,13 @@ int main(int argc, char **argv)
 
 	vdso_test_gettimeofday();
 
-#if _POSIX_TIMERS > 0
-
-#ifdef CLOCK_REALTIME
 	vdso_test_clock(CLOCK_REALTIME);
-#endif
-
-#ifdef CLOCK_BOOTTIME
 	vdso_test_clock(CLOCK_BOOTTIME);
-#endif
-
-#ifdef CLOCK_TAI
 	vdso_test_clock(CLOCK_TAI);
-#endif
-
-#ifdef CLOCK_REALTIME_COARSE
 	vdso_test_clock(CLOCK_REALTIME_COARSE);
-#endif
-
-#ifdef CLOCK_MONOTONIC
 	vdso_test_clock(CLOCK_MONOTONIC);
-#endif
-
-#ifdef CLOCK_MONOTONIC_RAW
 	vdso_test_clock(CLOCK_MONOTONIC_RAW);
-#endif
-
-#ifdef CLOCK_MONOTONIC_COARSE
 	vdso_test_clock(CLOCK_MONOTONIC_COARSE);
-#endif
-
-#endif
 
 	vdso_test_time();
 

-- 
2.50.1


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

* [PATCH v2 5/8] selftests: vDSO: vdso_test_abi: Use explicit indices for name array
  2025-08-12  5:39 [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres Thomas Weißschuh
                   ` (3 preceding siblings ...)
  2025-08-12  5:39 ` [PATCH v2 4/8] selftests: vDSO: vdso_test_abi: Drop clock availability tests Thomas Weißschuh
@ 2025-08-12  5:39 ` Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 6/8] selftests: vDSO: vdso_test_abi: Test CPUTIME clocks Thomas Weißschuh
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 10+ messages in thread
From: Thomas Weißschuh @ 2025-08-12  5:39 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Vincenzo Frascino, Shuah Khan,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Christophe Leroy, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	Thomas Weißschuh

The array relies on the numeric values of the clock IDs.
When reading the code it is not obvious that the order is correct.

Make the code easier to read by using explicit indices.

While at it make the array static.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 tools/testing/selftests/vDSO/vdso_test_abi.c | 26 +++++++++++++-------------
 1 file changed, 13 insertions(+), 13 deletions(-)

diff --git a/tools/testing/selftests/vDSO/vdso_test_abi.c b/tools/testing/selftests/vDSO/vdso_test_abi.c
index d236dd8305e1e3f41df07e0b7ffd5cfe8aebf826..a9a65f0deef3c32a96d7907620184ca541a3637d 100644
--- a/tools/testing/selftests/vDSO/vdso_test_abi.c
+++ b/tools/testing/selftests/vDSO/vdso_test_abi.c
@@ -31,19 +31,19 @@ typedef long (*vdso_clock_gettime_t)(clockid_t clk_id, struct timespec *ts);
 typedef long (*vdso_clock_getres_t)(clockid_t clk_id, struct timespec *ts);
 typedef time_t (*vdso_time_t)(time_t *t);
 
-const char *vdso_clock_name[12] = {
-	"CLOCK_REALTIME",
-	"CLOCK_MONOTONIC",
-	"CLOCK_PROCESS_CPUTIME_ID",
-	"CLOCK_THREAD_CPUTIME_ID",
-	"CLOCK_MONOTONIC_RAW",
-	"CLOCK_REALTIME_COARSE",
-	"CLOCK_MONOTONIC_COARSE",
-	"CLOCK_BOOTTIME",
-	"CLOCK_REALTIME_ALARM",
-	"CLOCK_BOOTTIME_ALARM",
-	"CLOCK_SGI_CYCLE",
-	"CLOCK_TAI",
+static const char * const vdso_clock_name[] = {
+	[CLOCK_REALTIME]		= "CLOCK_REALTIME",
+	[CLOCK_MONOTONIC]		= "CLOCK_MONOTONIC",
+	[CLOCK_PROCESS_CPUTIME_ID]	= "CLOCK_PROCESS_CPUTIME_ID",
+	[CLOCK_THREAD_CPUTIME_ID]	= "CLOCK_THREAD_CPUTIME_ID",
+	[CLOCK_MONOTONIC_RAW]		= "CLOCK_MONOTONIC_RAW",
+	[CLOCK_REALTIME_COARSE]		= "CLOCK_REALTIME_COARSE",
+	[CLOCK_MONOTONIC_COARSE]	= "CLOCK_MONOTONIC_COARSE",
+	[CLOCK_BOOTTIME]		= "CLOCK_BOOTTIME",
+	[CLOCK_REALTIME_ALARM]		= "CLOCK_REALTIME_ALARM",
+	[CLOCK_BOOTTIME_ALARM]		= "CLOCK_BOOTTIME_ALARM",
+	[10 /* CLOCK_SGI_CYCLE */]	= "CLOCK_SGI_CYCLE",
+	[CLOCK_TAI]			= "CLOCK_TAI",
 };
 
 static void vdso_test_gettimeofday(void)

-- 
2.50.1


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

* [PATCH v2 6/8] selftests: vDSO: vdso_test_abi: Test CPUTIME clocks
  2025-08-12  5:39 [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres Thomas Weißschuh
                   ` (4 preceding siblings ...)
  2025-08-12  5:39 ` [PATCH v2 5/8] selftests: vDSO: vdso_test_abi: Use explicit indices for name array Thomas Weißschuh
@ 2025-08-12  5:39 ` Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 7/8] selftests: vDSO: vdso_test_abi: Add tests for clock_gettime64() Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 8/8] selftests: vDSO: Drop vdso_test_clock_getres Thomas Weißschuh
  7 siblings, 0 replies; 10+ messages in thread
From: Thomas Weißschuh @ 2025-08-12  5:39 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Vincenzo Frascino, Shuah Khan,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Christophe Leroy, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	Thomas Weißschuh

The structure is already there anyways, so test the CPUTIME clocks, too.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 tools/testing/selftests/vDSO/vdso_test_abi.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/vDSO/vdso_test_abi.c b/tools/testing/selftests/vDSO/vdso_test_abi.c
index a9a65f0deef3c32a96d7907620184ca541a3637d..c25f09998b82d797d690228e6ff026150b28934b 100644
--- a/tools/testing/selftests/vDSO/vdso_test_abi.c
+++ b/tools/testing/selftests/vDSO/vdso_test_abi.c
@@ -175,7 +175,7 @@ static inline void vdso_test_clock(clockid_t clock_id)
 	vdso_test_clock_getres(clock_id);
 }
 
-#define VDSO_TEST_PLAN	16
+#define VDSO_TEST_PLAN	20
 
 int main(int argc, char **argv)
 {
@@ -204,6 +204,8 @@ int main(int argc, char **argv)
 	vdso_test_clock(CLOCK_MONOTONIC);
 	vdso_test_clock(CLOCK_MONOTONIC_RAW);
 	vdso_test_clock(CLOCK_MONOTONIC_COARSE);
+	vdso_test_clock(CLOCK_PROCESS_CPUTIME_ID);
+	vdso_test_clock(CLOCK_THREAD_CPUTIME_ID);
 
 	vdso_test_time();
 

-- 
2.50.1


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

* [PATCH v2 7/8] selftests: vDSO: vdso_test_abi: Add tests for clock_gettime64()
  2025-08-12  5:39 [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres Thomas Weißschuh
                   ` (5 preceding siblings ...)
  2025-08-12  5:39 ` [PATCH v2 6/8] selftests: vDSO: vdso_test_abi: Test CPUTIME clocks Thomas Weißschuh
@ 2025-08-12  5:39 ` Thomas Weißschuh
  2025-08-12  5:39 ` [PATCH v2 8/8] selftests: vDSO: Drop vdso_test_clock_getres Thomas Weißschuh
  7 siblings, 0 replies; 10+ messages in thread
From: Thomas Weißschuh @ 2025-08-12  5:39 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Vincenzo Frascino, Shuah Khan,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Christophe Leroy, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	Thomas Weißschuh

To be y2038-safe, 32-bit userspace needs to explicitly call the 64-bit safe
time APIs. For this the 32-bit vDSOs contains a clock_gettime() variant
which always uses 64-bit time types.

Also test this vDSO function.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 tools/testing/selftests/vDSO/vdso_test_abi.c | 37 +++++++++++++++++++++++++++-
 1 file changed, 36 insertions(+), 1 deletion(-)

diff --git a/tools/testing/selftests/vDSO/vdso_test_abi.c b/tools/testing/selftests/vDSO/vdso_test_abi.c
index c25f09998b82d797d690228e6ff026150b28934b..238d609a457a281d802734b40d6a2c35ba7f6d72 100644
--- a/tools/testing/selftests/vDSO/vdso_test_abi.c
+++ b/tools/testing/selftests/vDSO/vdso_test_abi.c
@@ -26,8 +26,15 @@
 static const char *version;
 static const char **name;
 
+/* The same as struct __kernel_timespec */
+struct vdso_timespec64 {
+	uint64_t tv_sec;
+	uint64_t tv_nsec;
+};
+
 typedef long (*vdso_gettimeofday_t)(struct timeval *tv, struct timezone *tz);
 typedef long (*vdso_clock_gettime_t)(clockid_t clk_id, struct timespec *ts);
+typedef long (*vdso_clock_gettime64_t)(clockid_t clk_id, struct vdso_timespec64 *ts);
 typedef long (*vdso_clock_getres_t)(clockid_t clk_id, struct timespec *ts);
 typedef time_t (*vdso_time_t)(time_t *t);
 
@@ -70,6 +77,33 @@ static void vdso_test_gettimeofday(void)
 	}
 }
 
+static void vdso_test_clock_gettime64(clockid_t clk_id)
+{
+	/* Find clock_gettime64. */
+	vdso_clock_gettime64_t vdso_clock_gettime64 =
+		(vdso_clock_gettime64_t)vdso_sym(version, name[5]);
+
+	if (!vdso_clock_gettime64) {
+		ksft_print_msg("Couldn't find %s\n", name[5]);
+		ksft_test_result_skip("%s %s\n", name[5],
+				      vdso_clock_name[clk_id]);
+		return;
+	}
+
+	struct vdso_timespec64 ts;
+	long ret = VDSO_CALL(vdso_clock_gettime64, 2, clk_id, &ts);
+
+	if (ret == 0) {
+		ksft_print_msg("The time is %lld.%06lld\n",
+			       (long long)ts.tv_sec, (long long)ts.tv_nsec);
+		ksft_test_result_pass("%s %s\n", name[5],
+				      vdso_clock_name[clk_id]);
+	} else {
+		ksft_test_result_fail("%s %s\n", name[5],
+				      vdso_clock_name[clk_id]);
+	}
+}
+
 static void vdso_test_clock_gettime(clockid_t clk_id)
 {
 	/* Find clock_gettime. */
@@ -171,11 +205,12 @@ static inline void vdso_test_clock(clockid_t clock_id)
 	ksft_print_msg("clock_id: %s\n", vdso_clock_name[clock_id]);
 
 	vdso_test_clock_gettime(clock_id);
+	vdso_test_clock_gettime64(clock_id);
 
 	vdso_test_clock_getres(clock_id);
 }
 
-#define VDSO_TEST_PLAN	20
+#define VDSO_TEST_PLAN	29
 
 int main(int argc, char **argv)
 {

-- 
2.50.1


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

* [PATCH v2 8/8] selftests: vDSO: Drop vdso_test_clock_getres
  2025-08-12  5:39 [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres Thomas Weißschuh
                   ` (6 preceding siblings ...)
  2025-08-12  5:39 ` [PATCH v2 7/8] selftests: vDSO: vdso_test_abi: Add tests for clock_gettime64() Thomas Weißschuh
@ 2025-08-12  5:39 ` Thomas Weißschuh
  7 siblings, 0 replies; 10+ messages in thread
From: Thomas Weißschuh @ 2025-08-12  5:39 UTC (permalink / raw)
  To: Andy Lutomirski, Thomas Gleixner, Vincenzo Frascino, Shuah Khan,
	Nathan Chancellor, Nick Desaulniers, Bill Wendling, Justin Stitt,
	Christophe Leroy, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	Thomas Weißschuh

vdso_test_abi provides the exact same functionality, properly uses
kselftest.h and explicitly calls into the vDSO without relying on the libc.

Drop the pointless testcase.

Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>
---
 tools/testing/selftests/vDSO/.gitignore            |   1 -
 tools/testing/selftests/vDSO/Makefile              |   2 -
 .../selftests/vDSO/vdso_test_clock_getres.c        | 123 ---------------------
 3 files changed, 126 deletions(-)

diff --git a/tools/testing/selftests/vDSO/.gitignore b/tools/testing/selftests/vDSO/.gitignore
index 30d5c8f0e5c7dfe9a330e440801aeac7e19faea9..ba322a353aff14eb3e951294e3604378eec2b14c 100644
--- a/tools/testing/selftests/vDSO/.gitignore
+++ b/tools/testing/selftests/vDSO/.gitignore
@@ -1,7 +1,6 @@
 # SPDX-License-Identifier: GPL-2.0-only
 vdso_test
 vdso_test_abi
-vdso_test_clock_getres
 vdso_test_correctness
 vdso_test_gettimeofday
 vdso_test_getcpu
diff --git a/tools/testing/selftests/vDSO/Makefile b/tools/testing/selftests/vDSO/Makefile
index 918a2caa070ebc681a9525f0518afffcf10f5ae3..e361aca22a74dc5c279ab1aa16f308b7e6e85bf1 100644
--- a/tools/testing/selftests/vDSO/Makefile
+++ b/tools/testing/selftests/vDSO/Makefile
@@ -4,7 +4,6 @@ include ../../../scripts/Makefile.arch
 TEST_GEN_PROGS := vdso_test_gettimeofday
 TEST_GEN_PROGS += vdso_test_getcpu
 TEST_GEN_PROGS += vdso_test_abi
-TEST_GEN_PROGS += vdso_test_clock_getres
 ifeq ($(ARCH),$(filter $(ARCH),x86 x86_64))
 TEST_GEN_PROGS += vdso_standalone_test_x86
 endif
@@ -29,7 +28,6 @@ CFLAGS_NOLIBC := -nostdlib -nostdinc -ffreestanding -fno-asynchronous-unwind-tab
 $(OUTPUT)/vdso_test_gettimeofday: parse_vdso.c vdso_test_gettimeofday.c
 $(OUTPUT)/vdso_test_getcpu: parse_vdso.c vdso_test_getcpu.c
 $(OUTPUT)/vdso_test_abi: parse_vdso.c vdso_test_abi.c
-$(OUTPUT)/vdso_test_clock_getres: vdso_test_clock_getres.c
 
 $(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c | headers
 $(OUTPUT)/vdso_standalone_test_x86: CFLAGS:=$(CFLAGS_NOLIBC) $(CFLAGS)
diff --git a/tools/testing/selftests/vDSO/vdso_test_clock_getres.c b/tools/testing/selftests/vDSO/vdso_test_clock_getres.c
deleted file mode 100644
index b5d5f59f725a703c357dfca91bfe170aaaeb42fa..0000000000000000000000000000000000000000
--- a/tools/testing/selftests/vDSO/vdso_test_clock_getres.c
+++ /dev/null
@@ -1,123 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note
-/*
- * vdso_clock_getres.c: Sample code to test clock_getres.
- * Copyright (c) 2019 Arm Ltd.
- *
- * Compile with:
- * gcc -std=gnu99 vdso_clock_getres.c
- *
- * Tested on ARM, ARM64, MIPS32, x86 (32-bit and 64-bit),
- * Power (32-bit and 64-bit), S390x (32-bit and 64-bit).
- * Might work on other architectures.
- */
-
-#define _GNU_SOURCE
-#include <elf.h>
-#include <fcntl.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <time.h>
-#include <sys/auxv.h>
-#include <sys/mman.h>
-#include <sys/time.h>
-#include <unistd.h>
-#include <sys/syscall.h>
-
-#include "../kselftest.h"
-
-static long syscall_clock_getres(clockid_t _clkid, struct timespec *_ts)
-{
-	long ret;
-
-	ret = syscall(SYS_clock_getres, _clkid, _ts);
-
-	return ret;
-}
-
-const char *vdso_clock_name[12] = {
-	"CLOCK_REALTIME",
-	"CLOCK_MONOTONIC",
-	"CLOCK_PROCESS_CPUTIME_ID",
-	"CLOCK_THREAD_CPUTIME_ID",
-	"CLOCK_MONOTONIC_RAW",
-	"CLOCK_REALTIME_COARSE",
-	"CLOCK_MONOTONIC_COARSE",
-	"CLOCK_BOOTTIME",
-	"CLOCK_REALTIME_ALARM",
-	"CLOCK_BOOTTIME_ALARM",
-	"CLOCK_SGI_CYCLE",
-	"CLOCK_TAI",
-};
-
-/*
- * This function calls clock_getres in vdso and by system call
- * with different values for clock_id.
- *
- * Example of output:
- *
- * clock_id: CLOCK_REALTIME [PASS]
- * clock_id: CLOCK_BOOTTIME [PASS]
- * clock_id: CLOCK_TAI [PASS]
- * clock_id: CLOCK_REALTIME_COARSE [PASS]
- * clock_id: CLOCK_MONOTONIC [PASS]
- * clock_id: CLOCK_MONOTONIC_RAW [PASS]
- * clock_id: CLOCK_MONOTONIC_COARSE [PASS]
- */
-static inline int vdso_test_clock(unsigned int clock_id)
-{
-	struct timespec x, y;
-
-	printf("clock_id: %s", vdso_clock_name[clock_id]);
-	clock_getres(clock_id, &x);
-	syscall_clock_getres(clock_id, &y);
-
-	if ((x.tv_sec != y.tv_sec) || (x.tv_nsec != y.tv_nsec)) {
-		printf(" [FAIL]\n");
-		return KSFT_FAIL;
-	}
-
-	printf(" [PASS]\n");
-	return KSFT_PASS;
-}
-
-int main(int argc, char **argv)
-{
-	int ret = 0;
-
-#if _POSIX_TIMERS > 0
-
-#ifdef CLOCK_REALTIME
-	ret += vdso_test_clock(CLOCK_REALTIME);
-#endif
-
-#ifdef CLOCK_BOOTTIME
-	ret += vdso_test_clock(CLOCK_BOOTTIME);
-#endif
-
-#ifdef CLOCK_TAI
-	ret += vdso_test_clock(CLOCK_TAI);
-#endif
-
-#ifdef CLOCK_REALTIME_COARSE
-	ret += vdso_test_clock(CLOCK_REALTIME_COARSE);
-#endif
-
-#ifdef CLOCK_MONOTONIC
-	ret += vdso_test_clock(CLOCK_MONOTONIC);
-#endif
-
-#ifdef CLOCK_MONOTONIC_RAW
-	ret += vdso_test_clock(CLOCK_MONOTONIC_RAW);
-#endif
-
-#ifdef CLOCK_MONOTONIC_COARSE
-	ret += vdso_test_clock(CLOCK_MONOTONIC_COARSE);
-#endif
-
-#endif
-	if (ret > 0)
-		return KSFT_FAIL;
-
-	return KSFT_PASS;
-}

-- 
2.50.1


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

* Re: [PATCH v2 1/8] selftests: vDSO: fix -Wunitialized in powerpc VDSO_CALL() wrapper
  2025-08-12  5:39 ` [PATCH v2 1/8] selftests: vDSO: fix -Wunitialized in powerpc VDSO_CALL() wrapper Thomas Weißschuh
@ 2025-08-12  6:05   ` Christophe Leroy
  0 siblings, 0 replies; 10+ messages in thread
From: Christophe Leroy @ 2025-08-12  6:05 UTC (permalink / raw)
  To: Thomas Weißschuh, Andy Lutomirski, Thomas Gleixner,
	Vincenzo Frascino, Shuah Khan, Nathan Chancellor,
	Nick Desaulniers, Bill Wendling, Justin Stitt, Jason A. Donenfeld
  Cc: linux-kernel, linux-kselftest, Shuah Khan, llvm,
	kernel test robot



Le 12/08/2025 à 07:39, Thomas Weißschuh a écrit :
> The _rval register variable is meant to be an output operand of the asm
> statement but is instead used as input operand.
> clang 20.1 notices this and triggers -Wuninitialized warnings:
> 
> tools/testing/selftests/timers/auxclock.c:154:10: error: variable '_rval' is uninitialized when used here [-Werror,-Wuninitialized]
>    154 |                 return VDSO_CALL(self->vdso_clock_gettime64, 2, clockid, ts);
>        |                        ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> tools/testing/selftests/timers/../vDSO/vdso_call.h:59:10: note: expanded from macro 'VDSO_CALL'
>     59 |                 : "r" (_rval)                                           \
>        |                        ^~~~~
> tools/testing/selftests/timers/auxclock.c:154:10: note: variable '_rval' is declared here
> tools/testing/selftests/timers/../vDSO/vdso_call.h:47:2: note: expanded from macro 'VDSO_CALL'
>     47 |         register long _rval asm ("r3");                                 \
>        |         ^
> 
> It seems the list of input and output operands have been switched around.
> However as the argument registers are not always initialized they can not
> be marked as pure inputs as that would trigger -Wuninitialized warnings.
> Adding _rval as another input and output operand does also not work as it
> would collide with the existing _r3 variable.
> 
> Instead reuse _r3 for both the argument and the return value.
> 
> Reported-by: kernel test robot <lkp@intel.com>
> Closes: https://eur01.safelinks.protection.outlook.com/?url=https%3A%2F%2Flore.kernel.org%2Foe-kbuild-all%2F202506180223.BOOk5jDK-lkp%40intel.com%2F&data=05%7C02%7Cchristophe.leroy%40csgroup.eu%7C611dd96dfdad4dcd55d708ddd9629305%7C8b87af7d86474dc78df45f69a2011bb5%7C0%7C0%7C638905739611064850%7CUnknown%7CTWFpbGZsb3d8eyJFbXB0eU1hcGkiOnRydWUsIlYiOiIwLjAuMDAwMCIsIlAiOiJXaW4zMiIsIkFOIjoiTWFpbCIsIldUIjoyfQ%3D%3D%7C0%7C%7C%7C&sdata=QcOje8P4T0%2BsqgkSaP%2BkT3fS875kqCZhxChDmvWVY%2Fg%3D&reserved=0
> Fixes: 6eda706a535c ("selftests: vDSO: fix the way vDSO functions are called for powerpc")
> Signed-off-by: Thomas Weißschuh <thomas.weissschuh@linutronix.de>

Reviewed-by: Christophe Leroy <christophe.leroy@csgroup.eu>

> ---
>   tools/testing/selftests/vDSO/vdso_call.h | 7 +++----
>   1 file changed, 3 insertions(+), 4 deletions(-)
> 
> diff --git a/tools/testing/selftests/vDSO/vdso_call.h b/tools/testing/selftests/vDSO/vdso_call.h
> index bb237d771051bd4103367fc60b54b505b7586965..e7205584cbdca5e10c13c1e9425d2023b02cda7f 100644
> --- a/tools/testing/selftests/vDSO/vdso_call.h
> +++ b/tools/testing/selftests/vDSO/vdso_call.h
> @@ -44,7 +44,6 @@
>   	register long _r6 asm ("r6");					\
>   	register long _r7 asm ("r7");					\
>   	register long _r8 asm ("r8");					\
> -	register long _rval asm ("r3");					\
>   									\
>   	LOADARGS_##nr(fn, args);					\
>   									\
> @@ -54,13 +53,13 @@
>   		"	bns+	1f\n"					\
>   		"	neg	3, 3\n"					\
>   		"1:"							\
> -		: "+r" (_r0), "=r" (_r3), "+r" (_r4), "+r" (_r5),	\
> +		: "+r" (_r0), "+r" (_r3), "+r" (_r4), "+r" (_r5),	\
>   		  "+r" (_r6), "+r" (_r7), "+r" (_r8)			\
> -		: "r" (_rval)						\
> +		:							\
>   		: "r9", "r10", "r11", "r12", "cr0", "cr1", "cr5",	\
>   		  "cr6", "cr7", "xer", "lr", "ctr", "memory"		\
>   	);								\
> -	_rval;								\
> +	_r3;								\
>   })
>   
>   #else
> 


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

end of thread, other threads:[~2025-08-12  6:20 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-08-12  5:39 [PATCH v2 0/8] selftests: vDSO: Clean up vdso_test_abi and drop vdso_test_clock_getres Thomas Weißschuh
2025-08-12  5:39 ` [PATCH v2 1/8] selftests: vDSO: fix -Wunitialized in powerpc VDSO_CALL() wrapper Thomas Weißschuh
2025-08-12  6:05   ` Christophe Leroy
2025-08-12  5:39 ` [PATCH v2 2/8] selftests: vDSO: vdso_test_abi: Correctly skip whole test with missing vDSO Thomas Weißschuh
2025-08-12  5:39 ` [PATCH v2 3/8] selftests: vDSO: vdso_test_abi: Use ksft_finished() Thomas Weißschuh
2025-08-12  5:39 ` [PATCH v2 4/8] selftests: vDSO: vdso_test_abi: Drop clock availability tests Thomas Weißschuh
2025-08-12  5:39 ` [PATCH v2 5/8] selftests: vDSO: vdso_test_abi: Use explicit indices for name array Thomas Weißschuh
2025-08-12  5:39 ` [PATCH v2 6/8] selftests: vDSO: vdso_test_abi: Test CPUTIME clocks Thomas Weißschuh
2025-08-12  5:39 ` [PATCH v2 7/8] selftests: vDSO: vdso_test_abi: Add tests for clock_gettime64() Thomas Weißschuh
2025-08-12  5:39 ` [PATCH v2 8/8] selftests: vDSO: Drop vdso_test_clock_getres Thomas Weißschuh

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 NNTP newsgroup(s).