linux-kselftest.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/4] kselftest: Extend vDSO tests
@ 2020-04-29 11:28 Vincenzo Frascino
  2020-04-29 11:28 ` [PATCH v2 1/4] kselftest: Enable vDSO test on non x86 platforms Vincenzo Frascino
                   ` (4 more replies)
  0 siblings, 5 replies; 9+ messages in thread
From: Vincenzo Frascino @ 2020-04-29 11:28 UTC (permalink / raw)
  To: linux-kernel, linux-kselftest
  Cc: Vincenzo Frascino, Shuah Khan, Thomas Gleixner, Andy Lutomirski

This series extends the kselftests for the vDSO library making sure: that
they compile correctly on non x86 platforms, that they can be cross
compiled and introducing new tests that verify the correctness of the
library.

The so extended vDSO kselftests have been verified on all the platforms
supported by the unified vDSO library [1].

The only new patch that this series introduces is the first one, patch 2 and
patch 3 have already been reviewed in past as part of other series [2] [3].

[1] https://lore.kernel.org/lkml/20190621095252.32307-1-vincenzo.frascino@arm.com
[2] https://lore.kernel.org/lkml/20190621095252.32307-26-vincenzo.frascino@arm.com
[3] https://lore.kernel.org/lkml/20190523112116.19233-4-vincenzo.frascino@arm.com

Changes:
--------
v2:
  - Addressed review comments from Andy.
  - Rebased on 5.7-rc3.

Cc: Shuah Khan <shuah@kernel.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Andy Lutomirski <luto@kernel.org>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>

Vincenzo Frascino (4):
  kselftest: Enable vDSO test on non x86 platforms
  kselftest: Extend vDSO selftest
  kselftest: Extend vDSO selftest to clock_getres
  kselftest: Move test_vdso to the vDSO test suite

 tools/testing/selftests/Makefile              |   1 +
 tools/testing/selftests/vDSO/Makefile         |  16 +-
 .../selftests/vDSO/vdso_clock_getres.c        | 124 +++++++++
 tools/testing/selftests/vDSO/vdso_config.h    |  90 +++++++
 .../vdso_correctness_test_x86.c}              |   0
 tools/testing/selftests/vDSO/vdso_full_test.c | 244 ++++++++++++++++++
 tools/testing/selftests/x86/Makefile          |   2 +-
 7 files changed, 472 insertions(+), 5 deletions(-)
 create mode 100644 tools/testing/selftests/vDSO/vdso_clock_getres.c
 create mode 100644 tools/testing/selftests/vDSO/vdso_config.h
 rename tools/testing/selftests/{x86/test_vdso.c => vDSO/vdso_correctness_test_x86.c} (100%)
 create mode 100644 tools/testing/selftests/vDSO/vdso_full_test.c

-- 
2.25.2


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

* [PATCH v2 1/4] kselftest: Enable vDSO test on non x86 platforms
  2020-04-29 11:28 [PATCH v2 0/4] kselftest: Extend vDSO tests Vincenzo Frascino
@ 2020-04-29 11:28 ` Vincenzo Frascino
  2020-04-29 11:28 ` [PATCH v2 2/4] kselftest: Extend vDSO selftest Vincenzo Frascino
                   ` (3 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Vincenzo Frascino @ 2020-04-29 11:28 UTC (permalink / raw)
  To: linux-kernel, linux-kselftest
  Cc: Vincenzo Frascino, Shuah Khan, Thomas Gleixner, Andy Lutomirski

Currently the vDSO tests are built only on x86 platforms and cannot be
cross compiled.

Enable vDSO TARGET for all the platforms.

Future patches will extend the tests.

Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
---
 tools/testing/selftests/Makefile      | 1 +
 tools/testing/selftests/vDSO/Makefile | 2 --
 2 files changed, 1 insertion(+), 2 deletions(-)

diff --git a/tools/testing/selftests/Makefile b/tools/testing/selftests/Makefile
index 2ff68702fd41..e135b03c3d66 100644
--- a/tools/testing/selftests/Makefile
+++ b/tools/testing/selftests/Makefile
@@ -61,6 +61,7 @@ endif
 TARGETS += tmpfs
 TARGETS += tpm2
 TARGETS += user
+TARGETS += vDSO
 TARGETS += vm
 TARGETS += x86
 TARGETS += zram
diff --git a/tools/testing/selftests/vDSO/Makefile b/tools/testing/selftests/vDSO/Makefile
index 9e03d61f52fd..2989e4d5a730 100644
--- a/tools/testing/selftests/vDSO/Makefile
+++ b/tools/testing/selftests/vDSO/Makefile
@@ -9,7 +9,6 @@ ifeq ($(ARCH),x86)
 TEST_GEN_PROGS += $(OUTPUT)/vdso_standalone_test_x86
 endif
 
-ifndef CROSS_COMPILE
 CFLAGS := -std=gnu99
 CFLAGS_vdso_standalone_test_x86 := -nostdlib -fno-asynchronous-unwind-tables -fno-stack-protector
 ifeq ($(CONFIG_X86_32),y)
@@ -23,4 +22,3 @@ $(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c
 		vdso_standalone_test_x86.c parse_vdso.c \
 		-o $@
 
-endif
-- 
2.25.2


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

* [PATCH v2 2/4] kselftest: Extend vDSO selftest
  2020-04-29 11:28 [PATCH v2 0/4] kselftest: Extend vDSO tests Vincenzo Frascino
  2020-04-29 11:28 ` [PATCH v2 1/4] kselftest: Enable vDSO test on non x86 platforms Vincenzo Frascino
@ 2020-04-29 11:28 ` Vincenzo Frascino
  2020-04-29 11:28 ` [PATCH v2 3/4] kselftest: Extend vDSO selftest to clock_getres Vincenzo Frascino
                   ` (2 subsequent siblings)
  4 siblings, 0 replies; 9+ messages in thread
From: Vincenzo Frascino @ 2020-04-29 11:28 UTC (permalink / raw)
  To: linux-kernel, linux-kselftest
  Cc: Vincenzo Frascino, Shuah Khan, Thomas Gleixner, Andy Lutomirski

The current version of the multiarch vDSO selftest verifies only
gettimeofday.

Extend the vDSO selftest to the other library functions:
 - time
 - clock_getres
 - clock_gettime

The extension has been used to verify the unified vdso library on the
supported architectures.

Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
---
 tools/testing/selftests/vDSO/Makefile         |   2 +
 tools/testing/selftests/vDSO/vdso_config.h    |  90 +++++++
 tools/testing/selftests/vDSO/vdso_full_test.c | 244 ++++++++++++++++++
 3 files changed, 336 insertions(+)
 create mode 100644 tools/testing/selftests/vDSO/vdso_config.h
 create mode 100644 tools/testing/selftests/vDSO/vdso_full_test.c

diff --git a/tools/testing/selftests/vDSO/Makefile b/tools/testing/selftests/vDSO/Makefile
index 2989e4d5a730..46aab4eaccbd 100644
--- a/tools/testing/selftests/vDSO/Makefile
+++ b/tools/testing/selftests/vDSO/Makefile
@@ -5,6 +5,7 @@ uname_M := $(shell uname -m 2>/dev/null || echo not)
 ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
 
 TEST_GEN_PROGS := $(OUTPUT)/vdso_test
+TEST_GEN_PROGS += $(OUTPUT)/vdso_full_test
 ifeq ($(ARCH),x86)
 TEST_GEN_PROGS += $(OUTPUT)/vdso_standalone_test_x86
 endif
@@ -17,6 +18,7 @@ endif
 
 all: $(TEST_GEN_PROGS)
 $(OUTPUT)/vdso_test: parse_vdso.c vdso_test.c
+$(OUTPUT)/vdso_full_test: parse_vdso.c vdso_full_test.c
 $(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c
 	$(CC) $(CFLAGS) $(CFLAGS_vdso_standalone_test_x86) \
 		vdso_standalone_test_x86.c parse_vdso.c \
diff --git a/tools/testing/selftests/vDSO/vdso_config.h b/tools/testing/selftests/vDSO/vdso_config.h
new file mode 100644
index 000000000000..eeb725df6045
--- /dev/null
+++ b/tools/testing/selftests/vDSO/vdso_config.h
@@ -0,0 +1,90 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+/*
+ * vdso_config.h: Configuration options for vDSO tests.
+ * Copyright (c) 2019 Arm Ltd.
+ */
+#ifndef __VDSO_CONFIG_H__
+#define __VDSO_CONFIG_H__
+
+/*
+ * Each architecture exports its vDSO implementation with different names
+ * and a different version from the others, so we need to handle it as a
+ * special case.
+ */
+#if defined(__arm__)
+#define VDSO_VERSION		0
+#define VDSO_NAMES		1
+#define VDSO_32BIT		1
+#elif defined(__aarch64__)
+#define VDSO_VERSION		3
+#define VDSO_NAMES		0
+#elif defined(__powerpc__)
+#define VDSO_VERSION		1
+#define VDSO_NAMES		0
+#define VDSO_32BIT		1
+#elif defined(__powerpc64__)
+#define VDSO_VERSION		1
+#define VDSO_NAMES		0
+#elif defined (__s390__)
+#define VDSO_VERSION		2
+#define VDSO_NAMES		0
+#define VDSO_32BIT		1
+#elif defined (__s390X__)
+#define VDSO_VERSION		2
+#define VDSO_NAMES		0
+#elif defined(__mips__)
+#define VDSO_VERSION		0
+#define VDSO_NAMES		1
+#define VDSO_32BIT		1
+#elif defined(__sparc__)
+#define VDSO_VERSION		0
+#define VDSO_NAMES		1
+#define VDSO_32BIT		1
+#elif defined(__i386__)
+#define VDSO_VERSION		0
+#define VDSO_NAMES		1
+#define VDSO_32BIT		1
+#elif defined(__x86_64__)
+#define VDSO_VERSION		0
+#define VDSO_NAMES		1
+#elif defined(__riscv__)
+#define VDSO_VERSION		5
+#define VDSO_NAMES		1
+#define VDSO_32BIT		1
+#else /* nds32 */
+#define VDSO_VERSION		4
+#define VDSO_NAMES		1
+#define VDSO_32BIT		1
+#endif
+
+static const char *versions[6] = {
+	"LINUX_2.6",
+	"LINUX_2.6.15",
+	"LINUX_2.6.29",
+	"LINUX_2.6.39",
+	"LINUX_4",
+	"LINUX_4.15",
+};
+
+static const char *names[2][5] = {
+	{
+		"__kernel_gettimeofday",
+		"__kernel_clock_gettime",
+		"__kernel_time",
+		"__kernel_clock_getres",
+#if defined(VDSO_32BIT)
+		"__kernel_clock_gettime64",
+#endif
+	},
+	{
+		"__vdso_gettimeofday",
+		"__vdso_clock_gettime",
+		"__vdso_time",
+		"__vdso_clock_getres",
+#if defined(VDSO_32BIT)
+		"__vdso_clock_gettime64",
+#endif
+	},
+};
+
+#endif /* __VDSO_CONFIG_H__ */
diff --git a/tools/testing/selftests/vDSO/vdso_full_test.c b/tools/testing/selftests/vDSO/vdso_full_test.c
new file mode 100644
index 000000000000..3d603f1394af
--- /dev/null
+++ b/tools/testing/selftests/vDSO/vdso_full_test.c
@@ -0,0 +1,244 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * vdso_full_test.c: Sample code to test all the timers.
+ * Copyright (c) 2019 Arm Ltd.
+ *
+ * Compile with:
+ * gcc -std=gnu99 vdso_full_test.c parse_vdso.c
+ *
+ */
+
+#include <stdint.h>
+#include <elf.h>
+#include <stdio.h>
+#include <time.h>
+#include <sys/auxv.h>
+#include <sys/time.h>
+#define _GNU_SOURCE
+#include <unistd.h>
+#include <sys/syscall.h>
+
+#include "../kselftest.h"
+#include "vdso_config.h"
+
+extern void *vdso_sym(const char *version, const char *name);
+extern void vdso_init_from_sysinfo_ehdr(uintptr_t base);
+extern void vdso_init_from_auxv(void *auxv);
+
+static const char *version;
+static const char **name;
+
+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_getres_t)(clockid_t clk_id, struct timespec *ts);
+typedef time_t (*vdso_time_t)(time_t *t);
+
+static int vdso_test_gettimeofday(void)
+{
+	/* Find gettimeofday. */
+	vdso_gettimeofday_t vdso_gettimeofday =
+		(vdso_gettimeofday_t)vdso_sym(version, name[0]);
+
+	if (!vdso_gettimeofday) {
+		printf("Could not find %s\n", name[0]);
+		return KSFT_SKIP;
+	}
+
+	struct timeval tv;
+	long ret = vdso_gettimeofday(&tv, 0);
+
+	if (ret == 0) {
+		printf("The time is %lld.%06lld\n",
+		       (long long)tv.tv_sec, (long long)tv.tv_usec);
+	} else {
+		printf("%s failed\n", name[0]);
+		return KSFT_FAIL;
+	}
+
+	return KSFT_PASS;
+}
+
+static int vdso_test_clock_gettime(clockid_t clk_id)
+{
+	/* Find clock_gettime. */
+	vdso_clock_gettime_t vdso_clock_gettime =
+		(vdso_clock_gettime_t)vdso_sym(version, name[1]);
+
+	if (!vdso_clock_gettime) {
+		printf("Could not find %s\n", name[1]);
+		return KSFT_SKIP;
+	}
+
+	struct timespec ts;
+	long ret = vdso_clock_gettime(clk_id, &ts);
+
+	if (ret == 0) {
+		printf("The time is %lld.%06lld\n",
+		       (long long)ts.tv_sec, (long long)ts.tv_nsec);
+	} else {
+		printf("%s failed\n", name[1]);
+		return KSFT_FAIL;
+	}
+
+	return KSFT_PASS;
+}
+
+static int vdso_test_time(void)
+{
+	/* Find time. */
+	vdso_time_t vdso_time =
+		(vdso_time_t)vdso_sym(version, name[2]);
+
+	if (!vdso_time) {
+		printf("Could not find %s\n", name[2]);
+		return KSFT_SKIP;
+	}
+
+	long ret = vdso_time(NULL);
+
+	if (ret > 0) {
+		printf("The time in hours since January 1, 1970 is %lld\n",
+				(long long)(ret / 3600));
+	} else {
+		printf("%s failed\n", name[2]);
+		return KSFT_FAIL;
+	}
+
+	return KSFT_PASS;
+}
+
+static int vdso_test_clock_getres(clockid_t clk_id)
+{
+	/* Find clock_getres. */
+	vdso_clock_getres_t vdso_clock_getres =
+		(vdso_clock_getres_t)vdso_sym(version, name[3]);
+
+	if (!vdso_clock_getres) {
+		printf("Could not find %s\n", name[3]);
+		return KSFT_SKIP;
+	}
+
+	struct timespec ts, sys_ts;
+	long ret = vdso_clock_getres(clk_id, &ts);
+
+	if (ret == 0) {
+		printf("The resolution is %lld %lld\n",
+		       (long long)ts.tv_sec, (long long)ts.tv_nsec);
+	} else {
+		printf("%s failed\n", name[3]);
+		return KSFT_FAIL;
+	}
+
+	ret = syscall(SYS_clock_getres, clk_id, &sys_ts);
+
+	if ((sys_ts.tv_sec != ts.tv_sec) || (sys_ts.tv_nsec != ts.tv_nsec)) {
+		printf("%s failed\n", name[3]);
+		return KSFT_FAIL;
+	}
+
+	return KSFT_PASS;
+}
+
+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 vdso_test_clock_gettime and vdso_test_clock_getres
+ * with different values for clock_id.
+ */
+static inline int vdso_test_clock(clockid_t clock_id)
+{
+	int ret0, ret1;
+
+	ret0 = vdso_test_clock_gettime(clock_id);
+	/* A skipped test is considered passed */
+	if (ret0 == KSFT_SKIP)
+		ret0 = KSFT_PASS;
+
+	ret1 = vdso_test_clock_getres(clock_id);
+	/* A skipped test is considered passed */
+	if (ret1 == KSFT_SKIP)
+		ret1 = KSFT_PASS;
+
+	ret0 += ret1;
+
+	printf("clock_id: %s", vdso_clock_name[clock_id]);
+
+	if (ret0 > 0)
+		printf(" [FAIL]\n");
+	else
+		printf(" [PASS]\n");
+
+	return ret0;
+}
+
+int main(int argc, char **argv)
+{
+	unsigned long sysinfo_ehdr = getauxval(AT_SYSINFO_EHDR);
+	int ret;
+
+	if (!sysinfo_ehdr) {
+		printf("AT_SYSINFO_EHDR is not present!\n");
+		return KSFT_SKIP;
+	}
+
+	version = versions[VDSO_VERSION];
+	name = (const char **)&names[VDSO_NAMES];
+
+	printf("[vDSO kselftest] VDSO_VERSION: %s\n", version);
+
+	vdso_init_from_sysinfo_ehdr(getauxval(AT_SYSINFO_EHDR));
+
+	ret = vdso_test_gettimeofday();
+
+#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
+
+	ret += vdso_test_time();
+
+	if (ret > 0)
+		return KSFT_FAIL;
+
+	return KSFT_PASS;
+}
-- 
2.25.2


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

* [PATCH v2 3/4] kselftest: Extend vDSO selftest to clock_getres
  2020-04-29 11:28 [PATCH v2 0/4] kselftest: Extend vDSO tests Vincenzo Frascino
  2020-04-29 11:28 ` [PATCH v2 1/4] kselftest: Enable vDSO test on non x86 platforms Vincenzo Frascino
  2020-04-29 11:28 ` [PATCH v2 2/4] kselftest: Extend vDSO selftest Vincenzo Frascino
@ 2020-04-29 11:28 ` Vincenzo Frascino
  2020-04-29 11:28 ` [PATCH v2 4/4] kselftest: Move test_vdso to the vDSO test suite Vincenzo Frascino
  2020-05-05 14:50 ` [PATCH v2 0/4] kselftest: Extend vDSO tests Arnd Bergmann
  4 siblings, 0 replies; 9+ messages in thread
From: Vincenzo Frascino @ 2020-04-29 11:28 UTC (permalink / raw)
  To: linux-kernel, linux-kselftest
  Cc: Vincenzo Frascino, Shuah Khan, Thomas Gleixner, Andy Lutomirski

The current version of the multiarch vDSO selftest verifies only
gettimeofday.

Extend the vDSO selftest to clock_getres, to verify that the
syscall and the vDSO library function return the same information.

The extension has been used to verify the hrtimer_resoltion fix.

Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
---
 tools/testing/selftests/vDSO/Makefile         |   2 +
 .../selftests/vDSO/vdso_clock_getres.c        | 124 ++++++++++++++++++
 2 files changed, 126 insertions(+)
 create mode 100644 tools/testing/selftests/vDSO/vdso_clock_getres.c

diff --git a/tools/testing/selftests/vDSO/Makefile b/tools/testing/selftests/vDSO/Makefile
index 46aab4eaccbd..7b096eedfd5d 100644
--- a/tools/testing/selftests/vDSO/Makefile
+++ b/tools/testing/selftests/vDSO/Makefile
@@ -6,6 +6,7 @@ ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
 
 TEST_GEN_PROGS := $(OUTPUT)/vdso_test
 TEST_GEN_PROGS += $(OUTPUT)/vdso_full_test
+TEST_GEN_PROGS += $(OUTPUT)/vdso_clock_getres
 ifeq ($(ARCH),x86)
 TEST_GEN_PROGS += $(OUTPUT)/vdso_standalone_test_x86
 endif
@@ -19,6 +20,7 @@ endif
 all: $(TEST_GEN_PROGS)
 $(OUTPUT)/vdso_test: parse_vdso.c vdso_test.c
 $(OUTPUT)/vdso_full_test: parse_vdso.c vdso_full_test.c
+$(OUTPUT)/vdso_clock_getres: vdso_clock_getres.c
 $(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c
 	$(CC) $(CFLAGS) $(CFLAGS_vdso_standalone_test_x86) \
 		vdso_standalone_test_x86.c parse_vdso.c \
diff --git a/tools/testing/selftests/vDSO/vdso_clock_getres.c b/tools/testing/selftests/vDSO/vdso_clock_getres.c
new file mode 100644
index 000000000000..15dcee16ff72
--- /dev/null
+++ b/tools/testing/selftests/vDSO/vdso_clock_getres.c
@@ -0,0 +1,124 @@
+// 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 <err.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;
+
+#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.25.2


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

* [PATCH v2 4/4] kselftest: Move test_vdso to the vDSO test suite
  2020-04-29 11:28 [PATCH v2 0/4] kselftest: Extend vDSO tests Vincenzo Frascino
                   ` (2 preceding siblings ...)
  2020-04-29 11:28 ` [PATCH v2 3/4] kselftest: Extend vDSO selftest to clock_getres Vincenzo Frascino
@ 2020-04-29 11:28 ` Vincenzo Frascino
  2020-05-05 14:50 ` [PATCH v2 0/4] kselftest: Extend vDSO tests Arnd Bergmann
  4 siblings, 0 replies; 9+ messages in thread
From: Vincenzo Frascino @ 2020-04-29 11:28 UTC (permalink / raw)
  To: linux-kernel, linux-kselftest
  Cc: Vincenzo Frascino, Shuah Khan, Thomas Gleixner, Andy Lutomirski

Move test_vdso from x86 to the vDSO test suite.

Suggested-by: Andy Lutomirski <luto@kernel.org>
Cc: Shuah Khan <shuah@kernel.org>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
---
 tools/testing/selftests/vDSO/Makefile                  | 10 ++++++++--
 .../test_vdso.c => vDSO/vdso_correctness_test_x86.c}   |  0
 tools/testing/selftests/x86/Makefile                   |  2 +-
 3 files changed, 9 insertions(+), 3 deletions(-)
 rename tools/testing/selftests/{x86/test_vdso.c => vDSO/vdso_correctness_test_x86.c} (100%)

diff --git a/tools/testing/selftests/vDSO/Makefile b/tools/testing/selftests/vDSO/Makefile
index 7b096eedfd5d..cdffb51cb413 100644
--- a/tools/testing/selftests/vDSO/Makefile
+++ b/tools/testing/selftests/vDSO/Makefile
@@ -7,12 +7,14 @@ ARCH ?= $(shell echo $(uname_M) | sed -e s/i.86/x86/ -e s/x86_64/x86/)
 TEST_GEN_PROGS := $(OUTPUT)/vdso_test
 TEST_GEN_PROGS += $(OUTPUT)/vdso_full_test
 TEST_GEN_PROGS += $(OUTPUT)/vdso_clock_getres
-ifeq ($(ARCH),x86)
+ifeq ($(ARCH),$(filter $(ARCH),x86 x86_64))
 TEST_GEN_PROGS += $(OUTPUT)/vdso_standalone_test_x86
+TEST_GEN_PROGS += $(OUTPUT)/vdso_correctness_test_x86
 endif
 
 CFLAGS := -std=gnu99
 CFLAGS_vdso_standalone_test_x86 := -nostdlib -fno-asynchronous-unwind-tables -fno-stack-protector
+LDFLAGS_vdso_correctness_test_x86 := -ldl
 ifeq ($(CONFIG_X86_32),y)
 LDLIBS += -lgcc_s
 endif
@@ -25,4 +27,8 @@ $(OUTPUT)/vdso_standalone_test_x86: vdso_standalone_test_x86.c parse_vdso.c
 	$(CC) $(CFLAGS) $(CFLAGS_vdso_standalone_test_x86) \
 		vdso_standalone_test_x86.c parse_vdso.c \
 		-o $@
-
+$(OUTPUT)/vdso_correctness_test_x86: vdso_correctness_test_x86.c
+	$(CC) $(CFLAGS) \
+		vdso_correctness_test_x86.c \
+		-o $@ \
+		$(LDFLAGS_vdso_correctness_test_x86)
diff --git a/tools/testing/selftests/x86/test_vdso.c b/tools/testing/selftests/vDSO/vdso_correctness_test_x86.c
similarity index 100%
rename from tools/testing/selftests/x86/test_vdso.c
rename to tools/testing/selftests/vDSO/vdso_correctness_test_x86.c
diff --git a/tools/testing/selftests/x86/Makefile b/tools/testing/selftests/x86/Makefile
index 5d49bfec1e9a..d20586a4cfd2 100644
--- a/tools/testing/selftests/x86/Makefile
+++ b/tools/testing/selftests/x86/Makefile
@@ -12,7 +12,7 @@ CAN_BUILD_WITH_NOPIE := $(shell ./check_cc.sh $(CC) trivial_program.c -no-pie)
 
 TARGETS_C_BOTHBITS := single_step_syscall sysret_ss_attrs syscall_nt test_mremap_vdso \
 			check_initial_reg_state sigreturn iopl ioperm \
-			protection_keys test_vdso test_vsyscall mov_ss_trap \
+			protection_keys test_vsyscall mov_ss_trap \
 			syscall_arg_fault
 TARGETS_C_32BIT_ONLY := entry_from_vm86 test_syscall_vdso unwind_vdso \
 			test_FCMOV test_FCOMI test_FISTTP \
-- 
2.25.2


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

* Re: [PATCH v2 0/4] kselftest: Extend vDSO tests
  2020-04-29 11:28 [PATCH v2 0/4] kselftest: Extend vDSO tests Vincenzo Frascino
                   ` (3 preceding siblings ...)
  2020-04-29 11:28 ` [PATCH v2 4/4] kselftest: Move test_vdso to the vDSO test suite Vincenzo Frascino
@ 2020-05-05 14:50 ` Arnd Bergmann
  2020-05-05 15:04   ` Vincenzo Frascino
  4 siblings, 1 reply; 9+ messages in thread
From: Arnd Bergmann @ 2020-05-05 14:50 UTC (permalink / raw)
  To: Vincenzo Frascino
  Cc: linux-kernel, open list:KERNEL SELFTEST FRAMEWORK, Shuah Khan,
	Thomas Gleixner, Andy Lutomirski

On Wed, Apr 29, 2020 at 1:34 PM Vincenzo Frascino
<vincenzo.frascino@arm.com> wrote:
>
> This series extends the kselftests for the vDSO library making sure: that
> they compile correctly on non x86 platforms, that they can be cross
> compiled and introducing new tests that verify the correctness of the
> library.
>
> The so extended vDSO kselftests have been verified on all the platforms
> supported by the unified vDSO library [1].
>
> The only new patch that this series introduces is the first one, patch 2 and
> patch 3 have already been reviewed in past as part of other series [2] [3].
>
> [1] https://lore.kernel.org/lkml/20190621095252.32307-1-vincenzo.frascino@arm.com
> [2] https://lore.kernel.org/lkml/20190621095252.32307-26-vincenzo.frascino@arm.com
> [3] https://lore.kernel.org/lkml/20190523112116.19233-4-vincenzo.frascino@arm.com

Hi Vincenzo,

Not sure if you are aware of the recent bug report about clock_gettime64()
returning invalid times on some arm32 kernels:
https://github.com/raspberrypi/linux/issues/3579

Regardless of when that gets fixed or by whom, I wonder if kselftest should
also check for consistency, i.e. call both the vdso and the syscall version of
clock_gettime() and clock_gettime64() and check that the results are always
in sequence.

      Arnd

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

* Re: [PATCH v2 0/4] kselftest: Extend vDSO tests
  2020-05-05 14:50 ` [PATCH v2 0/4] kselftest: Extend vDSO tests Arnd Bergmann
@ 2020-05-05 15:04   ` Vincenzo Frascino
  2020-05-05 15:07     ` Arnd Bergmann
  0 siblings, 1 reply; 9+ messages in thread
From: Vincenzo Frascino @ 2020-05-05 15:04 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-kernel, open list:KERNEL SELFTEST FRAMEWORK, Shuah Khan,
	Thomas Gleixner, Andy Lutomirski

Hi Arnd,

On 5/5/20 3:50 PM, Arnd Bergmann wrote:
> On Wed, Apr 29, 2020 at 1:34 PM Vincenzo Frascino
> <vincenzo.frascino@arm.com> wrote:
>>
>> This series extends the kselftests for the vDSO library making sure: that
>> they compile correctly on non x86 platforms, that they can be cross
>> compiled and introducing new tests that verify the correctness of the
>> library.
>>
>> The so extended vDSO kselftests have been verified on all the platforms
>> supported by the unified vDSO library [1].
>>
>> The only new patch that this series introduces is the first one, patch 2 and
>> patch 3 have already been reviewed in past as part of other series [2] [3].
>>
>> [1] https://lore.kernel.org/lkml/20190621095252.32307-1-vincenzo.frascino@arm.com
>> [2] https://lore.kernel.org/lkml/20190621095252.32307-26-vincenzo.frascino@arm.com
>> [3] https://lore.kernel.org/lkml/20190523112116.19233-4-vincenzo.frascino@arm.com
> 
> Hi Vincenzo,
> 
> Not sure if you are aware of the recent bug report about clock_gettime64()
> returning invalid times on some arm32 kernels:
> https://github.com/raspberrypi/linux/issues/3579
> 

No, I was not aware of the problem. There has been no mention on the arm list
(unless I missed it). I can try to have a look at it as soon as I get some time.

> Regardless of when that gets fixed or by whom, I wonder if kselftest should
> also check for consistency, i.e. call both the vdso and the syscall version of
> clock_gettime() and clock_gettime64() and check that the results are always
> in sequence.
> 

The test #4 partially does that: it calls syscall-vdso-syscall and verifies that
the sequencing is correct. I reused the x86 code for that. I could extend it to
clock_gettime64() and make sure it builds on all the platforms.

>       Arnd
> 

-- 
Regards,
Vincenzo

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

* Re: [PATCH v2 0/4] kselftest: Extend vDSO tests
  2020-05-05 15:04   ` Vincenzo Frascino
@ 2020-05-05 15:07     ` Arnd Bergmann
  2020-05-05 15:11       ` Vincenzo Frascino
  0 siblings, 1 reply; 9+ messages in thread
From: Arnd Bergmann @ 2020-05-05 15:07 UTC (permalink / raw)
  To: Vincenzo Frascino
  Cc: linux-kernel, open list:KERNEL SELFTEST FRAMEWORK, Shuah Khan,
	Thomas Gleixner, Andy Lutomirski

On Tue, May 5, 2020 at 5:03 PM Vincenzo Frascino
<vincenzo.frascino@arm.com> wrote:
> On 5/5/20 3:50 PM, Arnd Bergmann wrote:
> > On Wed, Apr 29, 2020 at 1:34 PM Vincenzo Frascino <vincenzo.frascino@arm.com> wrote:
> >
> > Not sure if you are aware of the recent bug report about clock_gettime64()
> > returning invalid times on some arm32 kernels:
> > https://github.com/raspberrypi/linux/issues/3579
> >
>
> No, I was not aware of the problem. There has been no mention on the arm list
> (unless I missed it). I can try to have a look at it as soon as I get some time.

Right, it was on only on the musl list, and I had pinged you on IRC, but you
must have been offline.

> > Regardless of when that gets fixed or by whom, I wonder if kselftest should
> > also check for consistency, i.e. call both the vdso and the syscall version of
> > clock_gettime() and clock_gettime64() and check that the results are always
> > in sequence.
> >
>
> The test #4 partially does that: it calls syscall-vdso-syscall and verifies that
> the sequencing is correct. I reused the x86 code for that. I could extend it to
> clock_gettime64() and make sure it builds on all the platforms.

Sounds good to me.

       Arnd

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

* Re: [PATCH v2 0/4] kselftest: Extend vDSO tests
  2020-05-05 15:07     ` Arnd Bergmann
@ 2020-05-05 15:11       ` Vincenzo Frascino
  0 siblings, 0 replies; 9+ messages in thread
From: Vincenzo Frascino @ 2020-05-05 15:11 UTC (permalink / raw)
  To: Arnd Bergmann
  Cc: linux-kernel, open list:KERNEL SELFTEST FRAMEWORK, Shuah Khan,
	Thomas Gleixner, Andy Lutomirski

Hi Arnd,

On 5/5/20 4:07 PM, Arnd Bergmann wrote:
> On Tue, May 5, 2020 at 5:03 PM Vincenzo Frascino
> <vincenzo.frascino@arm.com> wrote:
>> On 5/5/20 3:50 PM, Arnd Bergmann wrote:
>>> On Wed, Apr 29, 2020 at 1:34 PM Vincenzo Frascino <vincenzo.frascino@arm.com> wrote:
>>>
>>> Not sure if you are aware of the recent bug report about clock_gettime64()
>>> returning invalid times on some arm32 kernels:
>>> https://github.com/raspberrypi/linux/issues/3579
>>>
>>
>> No, I was not aware of the problem. There has been no mention on the arm list
>> (unless I missed it). I can try to have a look at it as soon as I get some time.
> 
> Right, it was on only on the musl list, and I had pinged you on IRC, but you
> must have been offline.
> 

Sorry about that, I did not get your message :( The only thing I can think it is
that if it was last to last week, I was on holiday... Anyway thanks for pointing
this out.

>>> Regardless of when that gets fixed or by whom, I wonder if kselftest should
>>> also check for consistency, i.e. call both the vdso and the syscall version of
>>> clock_gettime() and clock_gettime64() and check that the results are always
>>> in sequence.
>>>
>>
>> The test #4 partially does that: it calls syscall-vdso-syscall and verifies that
>> the sequencing is correct. I reused the x86 code for that. I could extend it to
>> clock_gettime64() and make sure it builds on all the platforms.
> 
> Sounds good to me.
> 
>        Arnd
> 

-- 
Regards,
Vincenzo

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

end of thread, other threads:[~2020-05-05 15:10 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-04-29 11:28 [PATCH v2 0/4] kselftest: Extend vDSO tests Vincenzo Frascino
2020-04-29 11:28 ` [PATCH v2 1/4] kselftest: Enable vDSO test on non x86 platforms Vincenzo Frascino
2020-04-29 11:28 ` [PATCH v2 2/4] kselftest: Extend vDSO selftest Vincenzo Frascino
2020-04-29 11:28 ` [PATCH v2 3/4] kselftest: Extend vDSO selftest to clock_getres Vincenzo Frascino
2020-04-29 11:28 ` [PATCH v2 4/4] kselftest: Move test_vdso to the vDSO test suite Vincenzo Frascino
2020-05-05 14:50 ` [PATCH v2 0/4] kselftest: Extend vDSO tests Arnd Bergmann
2020-05-05 15:04   ` Vincenzo Frascino
2020-05-05 15:07     ` Arnd Bergmann
2020-05-05 15:11       ` Vincenzo Frascino

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).