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_fadvise.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_fadvise.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/posix_fadvise.c | 45 |
1 files changed, 32 insertions, 13 deletions
diff --git a/sysdeps/unix/sysv/linux/posix_fadvise.c b/sysdeps/unix/sysv/linux/posix_fadvise.c index 093d707ccf..869a642f6d 100644 --- a/sysdeps/unix/sysv/linux/posix_fadvise.c +++ b/sysdeps/unix/sysv/linux/posix_fadvise.c @@ -22,27 +22,46 @@ /* Advice the system about the expected behaviour of the application with respect to the file associated with FD. */ +#ifndef __OFF_T_MATCHES_OFF64_T + +/* 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. */ + int posix_fadvise (int fd, off_t offset, off_t len, int advise) { -#if defined(__NR_fadvise64) || defined(__NR_fadvise64_64) INTERNAL_SYSCALL_DECL (err); # ifdef __NR_fadvise64 - int ret = INTERNAL_SYSCALL (fadvise64, err, 5, fd, - __LONG_LONG_PAIR (offset >> 31, offset), len, - advise); + int ret = INTERNAL_SYSCALL_CALL (fadvise64, err, fd, + __ALIGNMENT_ARG SYSCALL_LL (offset), + len, advise); # else - int ret = INTERNAL_SYSCALL (fadvise64_64, err, 6, fd, - __LONG_LONG_PAIR ((long) (offset >> 31), - (long) offset), - __LONG_LONG_PAIR ((long) (len >> 31), - (long) len), - advise); +# ifdef __ASSUME_FADVISE64_64_6ARG + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, advise, + __ALIGNMENT_ARG SYSCALL_LL (offset), + SYSCALL_LL (len)); +# else + +# ifdef __ASSUME_FADVISE64_64_NO_ALIGN +# undef __ALIGNMENT_ARG +# define __ALIGNMENT_ARG +# endif + + int ret = INTERNAL_SYSCALL_CALL (fadvise64_64, err, fd, + __ALIGNMENT_ARG SYSCALL_LL (offset), + SYSCALL_LL (len), advise); +# endif # endif if (INTERNAL_SYSCALL_ERROR_P (ret, err)) return INTERNAL_SYSCALL_ERRNO (ret, err); return 0; -#else - return ENOSYS; -#endif } +#endif /* __OFF_T_MATCHES_OFF64_T */ |