All of lore.kernel.org
 help / color / mirror / Atom feed
From: "tip-bot2 for Andrei Vagin" <tip-bot2@linutronix.de>
To: linux-tip-commits@vger.kernel.org
Cc: Andrei Vagin <avagin@gmail.com>, Dmitry Safonov <dima@arista.com>,
	Thomas Gleixner <tglx@linutronix.de>, x86 <x86@kernel.org>,
	LKML <linux-kernel@vger.kernel.org>
Subject: [tip: timers/core] selftests/timens: Add a test for clock_nanosleep()
Date: Tue, 14 Jan 2020 13:02:13 -0000	[thread overview]
Message-ID: <157900693371.396.7843624097685904606.tip-bot2@tip-bot2> (raw)
In-Reply-To: <20191112012724.250792-31-dima@arista.com>

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

Commit-ID:     46e003433f8946283c3bfec1be854ca87b5ba402
Gitweb:        https://git.kernel.org/tip/46e003433f8946283c3bfec1be854ca87b5ba402
Author:        Andrei Vagin <avagin@gmail.com>
AuthorDate:    Tue, 12 Nov 2019 01:27:19 
Committer:     Thomas Gleixner <tglx@linutronix.de>
CommitterDate: Tue, 14 Jan 2020 12:21:01 +01:00

selftests/timens: Add a test for clock_nanosleep()

Check that clock_nanosleep() takes into account clock offsets.

Output on success:
 1..4
 ok 1 clockid: 1 abs:0
 ok 2 clockid: 1 abs:1
 ok 3 clockid: 9 abs:0
 ok 4 clockid: 9 abs:1

Output with lack of permissions:
 1..4
 not ok 1 # SKIP need to run as root

Output without support of time namespaces:
 1..4
 not ok 1 # SKIP Time namespaces are not supported

Co-developed-by: Dmitry Safonov <dima@arista.com>
Signed-off-by: Andrei Vagin <avagin@gmail.com>
Signed-off-by: Dmitry Safonov <dima@arista.com>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Link: https://lore.kernel.org/r/20191112012724.250792-31-dima@arista.com


---
 tools/testing/selftests/timens/.gitignore        |   1 +-
 tools/testing/selftests/timens/Makefile          |   4 +-
 tools/testing/selftests/timens/clock_nanosleep.c | 149 ++++++++++++++-
 3 files changed, 152 insertions(+), 2 deletions(-)
 create mode 100644 tools/testing/selftests/timens/clock_nanosleep.c

diff --git a/tools/testing/selftests/timens/.gitignore b/tools/testing/selftests/timens/.gitignore
index b609f6e..9b6c8dd 100644
--- a/tools/testing/selftests/timens/.gitignore
+++ b/tools/testing/selftests/timens/.gitignore
@@ -1,2 +1,3 @@
+clock_nanosleep
 timens
 timerfd
diff --git a/tools/testing/selftests/timens/Makefile b/tools/testing/selftests/timens/Makefile
index 293aed6..40f630d 100644
--- a/tools/testing/selftests/timens/Makefile
+++ b/tools/testing/selftests/timens/Makefile
@@ -1,6 +1,6 @@
-TEST_GEN_PROGS := timens timerfd
+TEST_GEN_PROGS := timens timerfd clock_nanosleep
 
-CFLAGS := -Wall -Werror
+CFLAGS := -Wall -Werror -pthread
 LDFLAGS := -lrt
 
 include ../lib.mk
diff --git a/tools/testing/selftests/timens/clock_nanosleep.c b/tools/testing/selftests/timens/clock_nanosleep.c
new file mode 100644
index 0000000..8e7b7c7
--- /dev/null
+++ b/tools/testing/selftests/timens/clock_nanosleep.c
@@ -0,0 +1,149 @@
+// SPDX-License-Identifier: GPL-2.0
+#define _GNU_SOURCE
+#include <sched.h>
+
+#include <sys/timerfd.h>
+#include <sys/syscall.h>
+#include <time.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <pthread.h>
+#include <signal.h>
+#include <string.h>
+
+#include "log.h"
+#include "timens.h"
+
+void test_sig(int sig)
+{
+	if (sig == SIGUSR2)
+		pthread_exit(NULL);
+}
+
+struct thread_args {
+	struct timespec *now, *rem;
+	pthread_mutex_t *lock;
+	int clockid;
+	int abs;
+};
+
+void *call_nanosleep(void *_args)
+{
+	struct thread_args *args = _args;
+
+	clock_nanosleep(args->clockid, args->abs ? TIMER_ABSTIME : 0, args->now, args->rem);
+	pthread_mutex_unlock(args->lock);
+	return NULL;
+}
+
+int run_test(int clockid, int abs)
+{
+	struct timespec now = {}, rem;
+	struct thread_args args = { .now = &now, .rem = &rem, .clockid = clockid};
+	struct timespec start;
+	pthread_mutex_t lock;
+	pthread_t thread;
+	int j, ok, ret;
+
+	signal(SIGUSR1, test_sig);
+	signal(SIGUSR2, test_sig);
+
+	pthread_mutex_init(&lock, NULL);
+	pthread_mutex_lock(&lock);
+
+	if (clock_gettime(clockid, &start) == -1) {
+		if (errno == EINVAL && check_skip(clockid))
+			return 0;
+		return pr_perror("clock_gettime");
+	}
+
+
+	if (abs) {
+		now.tv_sec = start.tv_sec;
+		now.tv_nsec = start.tv_nsec;
+	}
+
+	now.tv_sec += 3600;
+	args.abs = abs;
+	args.lock = &lock;
+	ret = pthread_create(&thread, NULL, call_nanosleep, &args);
+	if (ret != 0) {
+		pr_err("Unable to create a thread: %s", strerror(ret));
+		return 1;
+	}
+
+	/* Wait when the thread will call clock_nanosleep(). */
+	ok = 0;
+	for (j = 0; j < 8; j++) {
+		/* The maximum timeout is about 5 seconds. */
+		usleep(10000 << j);
+
+		/* Try to interrupt clock_nanosleep(). */
+		pthread_kill(thread, SIGUSR1);
+
+		usleep(10000 << j);
+		/* Check whether clock_nanosleep() has been interrupted or not. */
+		if (pthread_mutex_trylock(&lock) == 0) {
+			/**/
+			ok = 1;
+			break;
+		}
+	}
+	if (!ok)
+		pthread_kill(thread, SIGUSR2);
+	pthread_join(thread, NULL);
+	pthread_mutex_destroy(&lock);
+
+	if (!ok) {
+		ksft_test_result_pass("clockid: %d abs:%d timeout\n", clockid, abs);
+		return 1;
+	}
+
+	if (rem.tv_sec < 3300 || rem.tv_sec > 3900) {
+		pr_fail("clockid: %d abs: %d remain: %ld\n",
+			clockid, abs, rem.tv_sec);
+		return 1;
+	}
+	ksft_test_result_pass("clockid: %d abs:%d\n", clockid, abs);
+
+	return 0;
+}
+
+int main(int argc, char *argv[])
+{
+	int ret, nsfd;
+
+	nscheck();
+
+	ksft_set_plan(4);
+
+	check_config_posix_timers();
+
+	if (unshare_timens())
+		return 1;
+
+	if (_settime(CLOCK_MONOTONIC, 7 * 24 * 3600))
+		return 1;
+	if (_settime(CLOCK_BOOTTIME, 9 * 24 * 3600))
+		return 1;
+
+	nsfd = open("/proc/self/ns/time_for_children", O_RDONLY);
+	if (nsfd < 0)
+		return pr_perror("Unable to open timens_for_children");
+
+	if (setns(nsfd, CLONE_NEWTIME))
+		return pr_perror("Unable to set timens");
+
+	ret = 0;
+	ret |= run_test(CLOCK_MONOTONIC, 0);
+	ret |= run_test(CLOCK_MONOTONIC, 1);
+	ret |= run_test(CLOCK_BOOTTIME_ALARM, 0);
+	ret |= run_test(CLOCK_BOOTTIME_ALARM, 1);
+
+	if (ret)
+		ksft_exit_fail();
+	ksft_exit_pass();
+	return ret;
+}

  parent reply	other threads:[~2020-01-14 13:05 UTC|newest]

Thread overview: 160+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-11-12  1:26 [PATCHv8 00/34] kernel: Introduce Time Namespace Dmitry Safonov
2019-11-12  1:26 ` Dmitry Safonov
2019-11-12  1:26 ` [PATCHv8 01/34] lib/vdso: Add unlikely() hint into vdso_read_begin() Dmitry Safonov
2019-11-12  1:26   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:26 ` [PATCHv8 02/34] lib/vdso: make do_hres and do_coarse as __always_inline Dmitry Safonov
2019-11-12  1:26   ` Dmitry Safonov
2020-01-10  9:45   ` Vincenzo Frascino
2020-01-10  9:45     ` Vincenzo Frascino
2020-01-10 11:42     ` Thomas Gleixner
2020-01-10 11:47       ` Vincenzo Frascino
2020-01-10 11:47         ` Vincenzo Frascino
2020-01-10 12:02         ` Thomas Gleixner
2020-01-10 12:18           ` Vincenzo Frascino
2020-01-10 12:18             ` Vincenzo Frascino
2020-01-13  5:27           ` Andrei Vagin
2020-01-13  5:27             ` Andrei Vagin
2020-01-13 19:09   ` [tip: timers/core] lib/vdso: Mark do_hres() and do_coarse() " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:26 ` [PATCHv8 03/34] ns: Introduce Time Namespace Dmitry Safonov
2019-11-12  1:26   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2020-01-27 14:12   ` [PATCHv8 03/34] " Dmitry Vyukov
2020-01-27 14:12     ` Dmitry Vyukov
2020-01-27 14:19     ` Dmitry Safonov
2020-01-27 14:19       ` Dmitry Safonov
2020-02-17 14:20   ` Time Namespaces: CLONE_NEWTIME and clone3()? Michael Kerrisk
2020-02-17 14:59     ` Christian Brauner
2020-02-17 21:47       ` Michael Kerrisk (man-pages)
2020-02-17 23:03         ` Christian Brauner
2020-02-17 23:29           ` Thomas Gleixner
2020-02-18  2:37             ` Eric W. Biederman
2020-02-18 17:11           ` Adrian Reber
2020-02-18 17:26             ` Christian Brauner
2019-11-12  1:26 ` [PATCHv8 04/34] time: Add timens_offsets to be used for tasks in timens Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] time: Add timens_offsets to be used for tasks in time namespace tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:26 ` [PATCHv8 05/34] posix-clocks: Rename the clock_get() callback to clock_get_timespec() Dmitry Safonov
2019-11-12  1:26   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:26 ` [PATCHv8 06/34] posix-clocks: Rename .clock_get_timespec() callbacks accordingly Dmitry Safonov
2019-11-12  1:26   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:26 ` [PATCHv8 07/34] alarmtimer: Rename gettime() callback to get_ktime() Dmitry Safonov
2019-11-12  1:26   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:26 ` [PATCHv8 08/34] alarmtimer: Provide get_timespec() callback Dmitry Safonov
2019-11-12  1:26   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:26 ` [PATCHv8 09/34] posix-clocks: Introduce clock_get_ktime() callback Dmitry Safonov
2019-11-12  1:26   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:26 ` [PATCHv8 10/34] posix-timers: Use clock_get_ktime() in common_timer_get() Dmitry Safonov
2019-11-12  1:26   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 11/34] posix-clocks: Wire up clock_gettime() with timens offsets Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 12/34] kernel: Add do_timens_ktime_to_host() helper Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] time: " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 13/34] timerfd: Make timerfd_settime() time namespace aware Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 14/34] posix-timers: Make timer_settime() " Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 15/34] alarmtimer: Make nanosleep " Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] alarmtimer: Make nanosleep() " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 16/34] hrtimers: Prepare hrtimer_nanosleep() for time namespaces Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 17/34] posix-timers: Make clock_nanosleep() time namespace aware Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 18/34] fs/proc: Respect boottime inside time namespace for /proc/uptime Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 19/34] x86/vdso: Restrict splitting VVAR VMA Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 20/34] lib/vdso: Prepare for time namespace support Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-12 10:32   ` Thomas Gleixner
2020-01-12 10:32     ` Thomas Gleixner
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Thomas Gleixner
2020-01-14 13:02   ` tip-bot2 for Thomas Gleixner
2019-11-12  1:27 ` [PATCHv8 21/34] x86/vdso: Provide vdso_data offset on vvar_page Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 22/34] x86/vdso: Add timens page Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] x86/vdso: Add time napespace page tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 23/34] time: Allocate per-timens vvar page Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 24/34] x86/vdso: Handle faults on timens page Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 25/34] x86/vdso: On timens page fault prefault also VVAR page Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 26/34] x86/vdso: Zap vvar pages on switch a time namspace Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] x86/vdso: Zap vvar pages when switching to a time namespace tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 27/34] fs/proc: Introduce /proc/pid/timens_offsets Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 28/34] selftests/timens: Add Time Namespace test for supported clocks Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 29/34] selftests/timens: Add a test for timerfd Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 30/34] selftests/timens: Add a test for clock_nanosleep() Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin [this message]
2019-11-12  1:27 ` [PATCHv8 31/34] selftests/timens: Add procfs selftest Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Dmitry Safonov
2020-01-14 13:02   ` tip-bot2 for Dmitry Safonov
2019-11-12  1:27 ` [PATCHv8 32/34] selftests/timens: Add timer offsets test Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 33/34] selftests/timens: Add a simple perf test for clock_gettime() Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-12  1:27 ` [PATCHv8 34/34] selftests/timens: Check for right timens offsets after fork and exec Dmitry Safonov
2019-11-12  1:27   ` Dmitry Safonov
2020-01-13 19:09   ` [tip: timers/core] " tip-bot2 for Andrei Vagin
2020-01-14 13:02   ` tip-bot2 for Andrei Vagin
2019-11-21 18:05 ` [PATCHv8 00/34] kernel: Introduce Time Namespace Andrei Vagin
2019-12-11 20:38   ` Dmitry Safonov
2020-01-09 21:09     ` Thomas Gleixner
2020-01-10  9:52       ` Vincenzo Frascino

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=157900693371.396.7843624097685904606.tip-bot2@tip-bot2 \
    --to=tip-bot2@linutronix.de \
    --cc=avagin@gmail.com \
    --cc=dima@arista.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-tip-commits@vger.kernel.org \
    --cc=tglx@linutronix.de \
    --cc=x86@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.