From 695d7d138eda449678a1650a8b8b58181033353f Mon Sep 17 00:00:00 2001 From: Joseph Myers Date: Tue, 9 May 2017 14:05:09 +0000 Subject: Assume prlimit64 is available. This patch makes sysdeps/unix/sysv/linux code assume the prlimit64 syscall is always available, given the minimum of a 3.2 kernel. __ASSUME_PRLIMIT64, which in fact was no longer used, is removed. Code conditional on __NR_prlimit64 being defined is made unconditional. Fallback code for the case where prlimit64 produces an ENOSYS error is removed, substantially simplifying some functions. Tested for x86_64 and x86. * sysdeps/unix/sysv/linux/kernel-features.h (__ASSUME_PRLIMIT64): Remove macro. * sysdeps/unix/sysv/linux/getrlimit64.c (__getrlimit64): Assume prlimit64 is always available and does not give an ENOSYS error. * sysdeps/unix/sysv/linux/prlimit.c [__NR_prlimit64]: Make code unconditional. [!__NR_prlimit64]: Remove conditional code. * sysdeps/unix/sysv/linux/setrlimit.c (__setrlimit): Assume prlimit64 is always available and does not give an ENOSYS error. * sysdeps/unix/sysv/linux/setrlimit64.c (__setrlimit64): Likewise. --- sysdeps/unix/sysv/linux/getrlimit64.c | 35 +------------------------------ sysdeps/unix/sysv/linux/kernel-features.h | 5 ----- sysdeps/unix/sysv/linux/prlimit.c | 10 --------- sysdeps/unix/sysv/linux/setrlimit.c | 7 +------ sysdeps/unix/sysv/linux/setrlimit64.c | 31 +-------------------------- 5 files changed, 3 insertions(+), 85 deletions(-) (limited to 'sysdeps/unix/sysv') diff --git a/sysdeps/unix/sysv/linux/getrlimit64.c b/sysdeps/unix/sysv/linux/getrlimit64.c index 37c173286f..56af3c0646 100644 --- a/sysdeps/unix/sysv/linux/getrlimit64.c +++ b/sysdeps/unix/sysv/linux/getrlimit64.c @@ -35,40 +35,7 @@ int __getrlimit64 (enum __rlimit_resource resource, struct rlimit64 *rlimits) { -#ifdef __NR_prlimit64 - int res = INLINE_SYSCALL_CALL (prlimit64, 0, resource, NULL, rlimits); - if (res == 0 || errno != ENOSYS) - return res; -#endif - -/* The fallback code only makes sense if the platform supports either - __NR_ugetrlimit and/or __NR_getrlimit. */ -#if defined (__NR_ugetrlimit) || defined (__NR_getrlimit) -# ifndef __NR_ugetrlimit -# define __NR_ugetrlimit __NR_getrlimit -# endif -# if __RLIM_T_MATCHES_RLIM64_T -# define rlimits32 (*rlimits) -# else - struct rlimit rlimits32; -# endif - - if (INLINE_SYSCALL_CALL (ugetrlimit, resource, &rlimits32) < 0) - return -1; - -# if !__RLIM_T_MATCHES_RLIM64_T - if (rlimits32.rlim_cur == RLIM_INFINITY) - rlimits->rlim_cur = RLIM64_INFINITY; - else - rlimits->rlim_cur = rlimits32.rlim_cur; - if (rlimits32.rlim_max == RLIM_INFINITY) - rlimits->rlim_max = RLIM64_INFINITY; - else - rlimits->rlim_max = rlimits32.rlim_max; -# endif /* !__RLIM_T_MATCHES_RLIM64_T */ -#endif /* defined (__NR_ugetrlimit) || defined (__NR_getrlimit) */ - - return 0; + return INLINE_SYSCALL_CALL (prlimit64, 0, resource, NULL, rlimits); } libc_hidden_def (__getrlimit64) diff --git a/sysdeps/unix/sysv/linux/kernel-features.h b/sysdeps/unix/sysv/linux/kernel-features.h index d837c221fb..74ac6276e8 100644 --- a/sysdeps/unix/sysv/linux/kernel-features.h +++ b/sysdeps/unix/sysv/linux/kernel-features.h @@ -103,11 +103,6 @@ # define __ASSUME_STATFS_F_FLAGS 1 #endif -/* prlimit64 is available in 2.6.36. */ -#if __LINUX_KERNEL_VERSION >= 0x020624 -# define __ASSUME_PRLIMIT64 1 -#endif - /* Support for sendmmsg functionality was added in 3.0. The macros defined correspond to those for accept4 and recvmmsg. */ #if __LINUX_KERNEL_VERSION >= 0x030000 diff --git a/sysdeps/unix/sysv/linux/prlimit.c b/sysdeps/unix/sysv/linux/prlimit.c index 2996e73b81..d31980f10c 100644 --- a/sysdeps/unix/sysv/linux/prlimit.c +++ b/sysdeps/unix/sysv/linux/prlimit.c @@ -20,7 +20,6 @@ #include -#ifdef __NR_prlimit64 int prlimit (__pid_t pid, enum __rlimit_resource resource, const struct rlimit *new_rlimit, struct rlimit *old_rlimit) @@ -73,12 +72,3 @@ prlimit (__pid_t pid, enum __rlimit_resource resource, return res; } -#else -int -prlimit (__pid_t pid, enum __rlimit_resource resource, - const struct rlimit *new_rlimit, struct rlimit *old_rlimit) -{ - return INLINE_SYSCALL_ERROR_RETURN_VALUE (ENOSYS); -} -stub_warning (prlimit) -#endif diff --git a/sysdeps/unix/sysv/linux/setrlimit.c b/sysdeps/unix/sysv/linux/setrlimit.c index 01812ac355..8773c78236 100644 --- a/sysdeps/unix/sysv/linux/setrlimit.c +++ b/sysdeps/unix/sysv/linux/setrlimit.c @@ -34,7 +34,6 @@ int __setrlimit (enum __rlimit_resource resource, const struct rlimit *rlim) { -# ifdef __NR_prlimit64 struct rlimit64 rlim64; if (rlim->rlim_cur == RLIM_INFINITY) @@ -46,11 +45,7 @@ __setrlimit (enum __rlimit_resource resource, const struct rlimit *rlim) else rlim64.rlim_max = rlim->rlim_max; - int res = INLINE_SYSCALL_CALL (prlimit64, 0, resource, &rlim64, NULL); - if (res == 0 || errno != ENOSYS) - return res; -# endif - return INLINE_SYSCALL_CALL (setrlimit, resource, rlim); + return INLINE_SYSCALL_CALL (prlimit64, 0, resource, &rlim64, NULL); } # if SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_2) diff --git a/sysdeps/unix/sysv/linux/setrlimit64.c b/sysdeps/unix/sysv/linux/setrlimit64.c index 2dd129d99e..db1960fc18 100644 --- a/sysdeps/unix/sysv/linux/setrlimit64.c +++ b/sysdeps/unix/sysv/linux/setrlimit64.c @@ -36,36 +36,7 @@ int __setrlimit64 (enum __rlimit_resource resource, const struct rlimit64 *rlimits) { - int res; - -#ifdef __NR_prlimit64 - res = INLINE_SYSCALL_CALL (prlimit64, 0, resource, rlimits, NULL); - if (res == 0 || errno != ENOSYS) - return res; -#endif - -/* The fallback code only makes sense if the platform supports - __NR_setrlimit. */ -#ifdef __NR_setrlimit -# if !__RLIM_T_MATCHES_RLIM64_T - struct rlimit rlimits32; - - if (rlimits->rlim_cur >= RLIM_INFINITY) - rlimits32.rlim_cur = RLIM_INFINITY; - else - rlimits32.rlim_cur = rlimits->rlim_cur; - if (rlimits->rlim_max >= RLIM_INFINITY) - rlimits32.rlim_max = RLIM_INFINITY; - else - rlimits32.rlim_max = rlimits->rlim_max; -# else -# define rlimits32 (*rlimits) -# endif - - res = INLINE_SYSCALL_CALL (setrlimit, resource, &rlimits32); -#endif - - return res; + return INLINE_SYSCALL_CALL (prlimit64, 0, resource, rlimits, NULL); } weak_alias (__setrlimit64, setrlimit64) -- cgit 1.4.1