From 6f6e3ee567cbff328df83dcf9ee0a5459746fce0 Mon Sep 17 00:00:00 2001 From: "H.J. Lu" Date: Fri, 21 Aug 2015 14:46:05 -0700 Subject: Avoid reading errno in syscall implementations 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. --- sysdeps/unix/sysv/linux/statfs64.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'sysdeps/unix/sysv/linux/statfs64.c') diff --git a/sysdeps/unix/sysv/linux/statfs64.c b/sysdeps/unix/sysv/linux/statfs64.c index ac5c33fbf0..469eda1376 100644 --- a/sysdeps/unix/sysv/linux/statfs64.c +++ b/sysdeps/unix/sysv/linux/statfs64.c @@ -37,12 +37,18 @@ __statfs64 (const char *file, struct statfs64 *buf) if (! __no_statfs64) # endif { - int result = INLINE_SYSCALL (statfs64, 3, file, sizeof (*buf), buf); - # if __ASSUME_STATFS64 == 0 - if (result == 0 || errno != ENOSYS) -# endif + INTERNAL_SYSCALL_DECL (err); + int result = INTERNAL_SYSCALL (statfs64, err, 3, file, + sizeof (*buf), buf); + + if (!__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err))) return result; + else if (INTERNAL_SYSCALL_ERRNO (result, err) != ENOSYS) + return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (result, err)); +# else + return INLINE_SYSCALL (statfs64, 3, file, sizeof (*buf), buf); +# endif # if __ASSUME_STATFS64 == 0 __no_statfs64 = 1; -- cgit v1.2.3-70-g09d2