From 6d97330d7acc47898b3a2bf4c8588d4bd7114269 Mon Sep 17 00:00:00 2001 From: Adhemerval Zanella Date: Wed, 16 Jun 2021 11:12:25 -0300 Subject: linux: Only use 64-bit syscall if required for clock_nanosleep For !__ASSUME_TIME64_SYSCALLS there is no need to issue a 64-bit syscall if the provided timeout fits in a 32-bit one. The 64-bit usage should be rare since the timeout is a relative one. Checked on i686-linux-gnu on a 4.15 kernel and on a 5.11 kernel (with and without --enable-kernel=5.1) and on x86_64-linux-gnu. Reviewed-by: Lukasz Majewski --- time/Makefile | 9 +++++++++ time/tst-clock_nanosleep.c | 40 +++++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 15 deletions(-) (limited to 'time') diff --git a/time/Makefile b/time/Makefile index c84bd5d3ec..0bea84966c 100644 --- a/time/Makefile +++ b/time/Makefile @@ -86,6 +86,15 @@ $(objpfx)tst-strftime2.out: $(gen-locales) $(objpfx)tst-strftime3.out: $(gen-locales) endif +ifeq (yes,$(build-shared)) +librt = $(common-objpfx)rt/librt.so +else +librt = $(common-objpfx)rt/librt.a +endif + +$(objpfx)tst-clock_nanosleep: $(librt) +$(objpfx)tst-clock_nanosleep-time64: $(librt) + tz-cflags = -DTZDIR='"$(zonedir)"' \ -DTZDEFAULT='"$(localtime-file)"' \ -DTZDEFRULES='"$(posixrules-file)"' diff --git a/time/tst-clock_nanosleep.c b/time/tst-clock_nanosleep.c index 47537435c1..a5a7f9430a 100644 --- a/time/tst-clock_nanosleep.c +++ b/time/tst-clock_nanosleep.c @@ -20,38 +20,48 @@ #include #include #include - +#include +#include +#include /* Test that clock_nanosleep() does sleep. */ -static int -do_test (void) +static void +clock_nanosleep_test (void) { /* Current time. */ struct timeval tv1; - (void) gettimeofday (&tv1, NULL); + gettimeofday (&tv1, NULL); - struct timespec ts; - ts.tv_sec = 1; - ts.tv_nsec = 0; + struct timespec ts = { 1, 0 }; TEMP_FAILURE_RETRY (clock_nanosleep (CLOCK_REALTIME, 0, &ts, &ts)); /* At least one second must have passed. */ struct timeval tv2; - (void) gettimeofday (&tv2, NULL); + gettimeofday (&tv2, NULL); tv2.tv_sec -= tv1.tv_sec; tv2.tv_usec -= tv1.tv_usec; if (tv2.tv_usec < 0) --tv2.tv_sec; - if (tv2.tv_sec < 1) - { - puts ("clock_nanosleep didn't sleep long enough"); - return 1; - } + TEST_VERIFY (tv2.tv_sec >= 1); +} + +static void +clock_nanosleep_large_timeout (void) +{ + support_create_timer (0, 100000000, false, NULL); + struct timespec ts = { TYPE_MAXIMUM (time_t), 0 }; + int r = clock_nanosleep (CLOCK_REALTIME, 0, &ts, NULL); + TEST_VERIFY (r == EINTR || r == EOVERFLOW); +} +static int +do_test (void) +{ + clock_nanosleep_test (); + clock_nanosleep_large_timeout (); return 0; } -#define TEST_FUNCTION do_test () -#include "../test-skeleton.c" +#include -- cgit 1.4.1