This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Assume prlimit64 is available
- From: Adhemerval Zanella <adhemerval dot zanella at linaro dot org>
- To: libc-alpha at sourceware dot org
- Date: Tue, 9 May 2017 09:10:15 -0300
- Subject: Re: Assume prlimit64 is available
- Authentication-results: sourceware.org; auth=none
- References: <alpine.DEB.2.20.1705082356330.6952@digraph.polyomino.org.uk>
On 08/05/2017 20:56, Joseph Myers wrote:
> 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.
>
> 2017-05-08 Joseph Myers <joseph@codesourcery.com>
>
> * 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.
LGTM, thanks.
>
> diff --git a/sysdeps/unix/sysv/linux/getrlimit64.c b/sysdeps/unix/sysv/linux/getrlimit64.c
> index 37c1732..56af3c0 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 d837c22..74ac627 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 2996e73..d31980f 100644
> --- a/sysdeps/unix/sysv/linux/prlimit.c
> +++ b/sysdeps/unix/sysv/linux/prlimit.c
> @@ -20,7 +20,6 @@
> #include <sys/syscall.h>
>
>
> -#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 01812ac..8773c78 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 2dd129d..db1960f 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)
>
>