Assume prlimit64 is available

Message ID alpine.DEB.2.20.1705082356330.6952@digraph.polyomino.org.uk
State Committed
Headers

Commit Message

Joseph Myers May 8, 2017, 11:56 p.m. UTC
  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.
  

Comments

Adhemerval Zanella Netto May 9, 2017, 12:10 p.m. UTC | #1
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)
>  
>
  

Patch

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)