diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-08-21 14:46:05 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-10-19 10:45:25 -0700 |
commit | 6f6e3ee567cbff328df83dcf9ee0a5459746fce0 (patch) | |
tree | a61f9d12d5b24e37ac8d4e39c9585e37e0e4f900 /sysdeps/unix/sysv/linux/signalfd.c | |
parent | 2028f49dabb94bd56a85a7be16141bee4853aae6 (diff) | |
download | glibc-hjl/i386/master.tar glibc-hjl/i386/master.tar.gz glibc-hjl/i386/master.tar.bz2 glibc-hjl/i386/master.zip |
Avoid reading errno in syscall implementationshjl/i386/master
Reading errno is expensive for x86 PIC. With INTERNAL_SYSCALL,
INTERNAL_SYSCALL_ERROR_P, INTERNAL_SYSCALL_ERRNO and
INLINE_SYSCALL_ERROR_RETURN_VALUE, we can avoid reading errno.
There are no code changes on x86-64. On i686, libc.so sizes in bytes
show:
text data bss dec
after 1748495 11380 11132 1771007
before 1748403 11380 11132 1770915
* sysdeps/unix/sysv/linux/eventfd.c (eventfd): Use
INTERNAL_SYSCALL, INTERNAL_SYSCALL_ERROR_P and
INTERNAL_SYSCALL_ERRNO to avoid reading errno.
* sysdeps/unix/sysv/linux/fstatfs64.c (__fstatfs64): Likewise.
* sysdeps/unix/sysv/linux/getrlimit64.c (__getrlimit64):
Likewise.
* sysdeps/unix/sysv/linux/setrlimit64.c (setrlimit64):
Likewise.
* sysdeps/unix/sysv/linux/signalfd.c (signalfd): Likewise.
* sysdeps/unix/sysv/linux/statfs64.c (__statfs64): Likewise.
Diffstat (limited to 'sysdeps/unix/sysv/linux/signalfd.c')
-rw-r--r-- | sysdeps/unix/sysv/linux/signalfd.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/sysdeps/unix/sysv/linux/signalfd.c b/sysdeps/unix/sysv/linux/signalfd.c index 8573450bd1..95a9707852 100644 --- a/sysdeps/unix/sysv/linux/signalfd.c +++ b/sysdeps/unix/sysv/linux/signalfd.c @@ -26,11 +26,17 @@ int signalfd (int fd, const sigset_t *mask, int flags) { #ifdef __NR_signalfd4 - int res = INLINE_SYSCALL (signalfd4, 4, fd, mask, _NSIG / 8, flags); # ifndef __ASSUME_SIGNALFD4 - if (res != -1 || errno != ENOSYS) -# endif + INTERNAL_SYSCALL_DECL (err); + int res = INTERNAL_SYSCALL (signalfd4, err, 4, fd, mask, _NSIG / 8, + flags); + if (!__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (res, err))) return res; + else if (INTERNAL_SYSCALL_ERRNO (res, err) != ENOSYS) + return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (res, err)); +# else + return INLINE_SYSCALL (signalfd4, 4, fd, mask, _NSIG / 8, flags); +# endif #endif #ifndef __ASSUME_SIGNALFD4 |