diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2016-07-06 08:52:11 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2016-10-07 14:16:41 -0300 |
commit | 96b7fe424371f19dd360eb2ab356ff85d2775344 (patch) | |
tree | 5466880e50283c4967d07c07125b661c13e16799 /sysdeps/unix/sysv/linux/posix_fadvise64.c | |
parent | 45ff2bfcb34228ef8d36306a9691d1e540a6468a (diff) | |
download | glibc-96b7fe424371f19dd360eb2ab356ff85d2775344.tar glibc-96b7fe424371f19dd360eb2ab356ff85d2775344.tar.gz glibc-96b7fe424371f19dd360eb2ab356ff85d2775344.tar.bz2 glibc-96b7fe424371f19dd360eb2ab356ff85d2775344.zip |
Consolidate posix_fadvise implementations
This patch consolidates mostly of the Linux posix_fadvise{64} implementations
on sysdeps/unix/sysv/linux/posix_fadvise{64}.c. It still keeps arch-specific
files for:
* S390-32: it uses a packed structure to pass all the arguments on syscall.
It is the only supported port that implements __NR_fadvise64_64 in this
way.
* ARM: it does not implement __NR_fadvise64 (as other 32-bits ports), so
posix_fadvise calls internal posix_fadvise64 symbol.
* MIPS64 n64: it requires a different version number that other ports.
The new macro SYSCALL_LL{64} is used to handle the offset argument and
INTERNAL_SYSCALL_CALL to handle passing the correct number of expect
arguments.
The default Linux adds two new defines a port can use to control how
__NR_fadvise64_64 passes the kernel arguments:
* __ASSUME_FADVISE64_64_6ARG: the 'advise' argument is moved on second
position. This is the case of powerpc32 and arm to avoid implement
7 argument syscall.
* __ASSUME_FADVISE64_64_NO_ALIGN: for ABIs that defines
__ASSUME_ALIGNED_REGISTER_PAIRS packs the offset without the leading
'0'. This is the case of tile 32 bits.
ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64 (which is also
handled on arch kernel-feature.h).
Tested on x86_64, x32, i686, armhf, and aarch64.
* posix/Makefile (tests): Add tst-posix_fadvise and tst-posix_fadvise64.
* posix/tst-posix_fadvise.c: New file.
* posix/tst-posix_fadvise64.c: Likewise.
* posix/tst-posix_fadvise-common.c: Likewise.
* sysdeps/unix/sysv/linux/arm/kernel-features.h
(__ASSUME_FADVISE64_64_6ARG): Define.
* sysdeps/unix/sysv/linux/powerpc/kernel-features.h
[!__powerpc64__] (__ASSUME_FADVISE64_64_6ARG): Add define.
* sysdeps/unix/sysv/linux/arm/posix_fadvise64.c: Remove file.
* sysdeps/unix/sysv/linux/generic/wordsize-32/posix_fadvise.c: Likewise.
* sysdeps/unix/sysv/linux/i386/posix_fadvise64.S: Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise.c: Likewise.
* sysdeps/unix/sysv/linux/mips/mips32/posix_fadvise64.c: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise.c: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n32/posix_fadvise64.c: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise.c: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise.c: Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/posix_fadvise64.c:
Likewise.
* sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise.c: Likewise.
* sysdeps/unix/sysv/linux/wordsize-64/posix_fadvise64.c: Likewise.
* sysdeps/unix/sysv/linux/mips/mips64/n64/posix_fadvise64.c
(SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]:
Alias to __posix_fadvise64_l32.
(SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l32]:
Add compat definition to posix_fadvise64.
(SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) [__posix_fadvise64_l64]:
Add versioned definition to posix_fadvise64.
* sysdeps/unix/sysv/linux/posix_fadvise.c (posix_fadvise): Build iff
__OFF_T_MATCHES_OFF64_T is defined, use INTERNAL_SYSCALL_CALL, add
__ASSUME_FADVISE64_64_6ARG/__ASSUME_FADVISE64_64_NO_ALIGN support.
* sysdeps/unix/sysv/linux/posix_fadvise64.c (posix_fadvise64): Add
__ASSUME_FADVISE64_64_NO_ALIGN support and use INTERNAL_SYSCALL_CALL.
Diffstat (limited to 'sysdeps/unix/sysv/linux/posix_fadvise64.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/posix_fadvise64.c | 51 |
1 files changed, 39 insertions, 12 deletions
diff --git a/sysdeps/unix/sysv/linux/posix_fadvise64.c b/sysdeps/unix/sysv/linux/posix_fadvise64.c index 6d10558a5e..b4adb5fad6 100644 --- a/sysdeps/unix/sysv/linux/posix_fadvise64.c +++ b/sysdeps/unix/sysv/linux/posix_fadvise64.c @@ -17,10 +17,29 @@ #include <errno.h> #include <fcntl.h> -#include <sysdep.h> +#include <shlib-compat.h> int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise); -int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); + +/* Both arm and powerpc implements fadvise64_64 with last 'advise' argument + just after 'fd' to avoid the requirement of implementing 7-arg syscalls. + ARM also defines __NR_fadvise64_64 as __NR_arm_fadvise64_64. + + tile requires __ASSUME_ALIGNED_REGISTER_PAIRS but implements the 32-bit + fadvise64_64 without the padding 0 after fd. + + s390 implements fadvice64_64 using a specific struct with arguments + packed inside. This is the only implementation handled in arch-specific + code. */ + +#ifdef __ASSUME_FADVISE64_64_NO_ALIGN +# undef __ALIGNMENT_ARG +# define __ALIGNMENT_ARG +#endif + +#ifndef __NR_fadvise64_64 +# define __NR_fadvise64_64 __NR_fadvise64 +#endif /* Advice the system about the expected behaviour of the application with respect to the file associated with FD. */ @@ -29,20 +48,24 @@ int __posix_fadvise64_l64 (int fd, off64_t offset, off64_t len, int advise) { INTERNAL_SYSCALL_DECL (err); - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, - __LONG_LONG_PAIR ((long) (offset >> 32), - (long) offset), - __LONG_LONG_PAIR ((long) (len >> 32), - (long) len), - advise); +#ifdef __ASSUME_FADVISE64_64_6ARG + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, advise, + SYSCALL_LL64 (offset), SYSCALL_LL64 (len)); +#else + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, + __ALIGNMENT_ARG SYSCALL_LL64 (offset), + SYSCALL_LL64 (len), advise); +#endif if (!INTERNAL_SYSCALL_ERROR_P (ret, err)) return 0; return INTERNAL_SYSCALL_ERRNO (ret, err); } -#include <shlib-compat.h> - -#if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) +/* The type of the len argument was changed from size_t to off_t in + POSIX.1-2003 TC1. */ +#ifndef __OFF_T_MATCHES_OFF64_T +# if SHLIB_COMPAT(libc, GLIBC_2_2, GLIBC_2_3_3) +int __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise); int attribute_compat_text_section @@ -53,6 +76,10 @@ __posix_fadvise64_l32 (int fd, off64_t offset, size_t len, int advise) versioned_symbol (libc, __posix_fadvise64_l64, posix_fadvise64, GLIBC_2_3_3); compat_symbol (libc, __posix_fadvise64_l32, posix_fadvise64, GLIBC_2_2); +# else +weak_alias (__posix_fadvise64_l64, posix_fadvise64); +# endif #else -strong_alias (__posix_fadvise64_l64, posix_fadvise64); +weak_alias (__posix_fadvise64_l64, posix_fadvise64); +strong_alias (__posix_fadvise64_l64, posix_fadvise); #endif |