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.
This commit is contained in:
Joseph Myers 2017-05-09 14:05:09 +00:00
parent a972dc672c
commit 695d7d138e
6 changed files with 16 additions and 85 deletions

View File

@ -1,3 +1,16 @@
2017-05-09 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.
2017-05-09 Zack Weinberg <zackw@panix.com>
* sunrpc/tst-xdrmem2.c: Include stdint.h.

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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)