diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-06-15 22:43:51 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-06-22 12:09:52 -0300 |
commit | eef7913c2f5512a954e658a5908a47dbc0ec8c2e (patch) | |
tree | efd27199fcfd2dbe5b2ee13d2fc53fac130b5d51 /sysvipc | |
parent | 4b6551902e5c701e5f3156928d88aadeb6487dc1 (diff) | |
download | glibc-eef7913c2f5512a954e658a5908a47dbc0ec8c2e.tar glibc-eef7913c2f5512a954e658a5908a47dbc0ec8c2e.tar.gz glibc-eef7913c2f5512a954e658a5908a47dbc0ec8c2e.tar.bz2 glibc-eef7913c2f5512a954e658a5908a47dbc0ec8c2e.zip |
linux: Only use 64-bit syscall if required for semtimedop
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 <lukma@denx.de>
Diffstat (limited to 'sysvipc')
-rw-r--r-- | sysvipc/Makefile | 9 | ||||
-rw-r--r-- | sysvipc/test-sysvsem.c | 22 |
2 files changed, 26 insertions, 5 deletions
diff --git a/sysvipc/Makefile b/sysvipc/Makefile index 86911803b5..d2acb6a70b 100644 --- a/sysvipc/Makefile +++ b/sysvipc/Makefile @@ -38,3 +38,12 @@ include ../Rules CFLAGS-msgrcv.c += -fexceptions -fasynchronous-unwind-tables CFLAGS-msgsnd.c += -fexceptions -fasynchronous-unwind-tables + +ifeq (yes,$(build-shared)) +librt = $(common-objpfx)rt/librt.so +else +librt = $(common-objpfx)rt/librt.a +endif + +$(objpfx)test-sysvsem: $(librt) +$(objpfx)test-sysvsem-time64: $(librt) diff --git a/sysvipc/test-sysvsem.c b/sysvipc/test-sysvsem.c index 092418205d..d9034c3dae 100644 --- a/sysvipc/test-sysvsem.c +++ b/sysvipc/test-sysvsem.c @@ -16,6 +16,7 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ +#include <intprops.h> #include <stdio.h> #include <stdlib.h> #include <errno.h> @@ -30,6 +31,8 @@ #include <support/support.h> #include <support/check.h> #include <support/temp_file.h> +#include <support/xtime.h> +#include <support/xsignal.h> /* These are for the temporary file we generate. */ static char *name; @@ -112,11 +115,20 @@ do_test (void) #ifdef _GNU_SOURCE /* Set a time for half a second. The semaphore operation should timeout with EAGAIN. */ - struct timespec ts = { 0 /* sec */, 500000000 /* nsec */ }; - if (semtimedop (semid, &sb2, 1, &ts) != -1 - || (errno != EAGAIN && errno != ENOSYS)) - FAIL_EXIT1 ("semtimedop succeed or returned errno != {EAGAIN,ENOSYS} " - "(errno=%i)", errno); + { + struct timespec ts = { 0 /* sec */, 500000000 /* nsec */ }; + if (semtimedop (semid, &sb2, 1, &ts) != -1 + || (errno != EAGAIN && errno != ENOSYS)) + FAIL_EXIT1 ("semtimedop succeed or returned errno != {EAGAIN,ENOSYS} " + "(errno=%i)", errno); + } + + { + support_create_timer (0, 100000000, false, NULL); + struct timespec ts = { TYPE_MAXIMUM (time_t), 0 }; + TEST_COMPARE (semtimedop (semid, &sb2, 1, &ts), -1); + TEST_VERIFY (errno == EINTR || errno == EOVERFLOW); + } #endif /* Finally free up the semnaphore resource. */ |