about summary refs log tree commit diff
path: root/sysdeps/unix/sysv/linux/lxstat64.c
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-08-21 14:46:05 -0700
committerH.J. Lu <hjl.tools@gmail.com>2015-10-19 10:45:25 -0700
commit6f6e3ee567cbff328df83dcf9ee0a5459746fce0 (patch)
treea61f9d12d5b24e37ac8d4e39c9585e37e0e4f900 /sysdeps/unix/sysv/linux/lxstat64.c
parent2028f49dabb94bd56a85a7be16141bee4853aae6 (diff)
downloadglibc-6f6e3ee567cbff328df83dcf9ee0a5459746fce0.tar.gz
glibc-6f6e3ee567cbff328df83dcf9ee0a5459746fce0.tar.xz
glibc-6f6e3ee567cbff328df83dcf9ee0a5459746fce0.zip
Avoid reading errno in syscall implementations hjl/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/lxstat64.c')
-rw-r--r--sysdeps/unix/sysv/linux/lxstat64.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/sysdeps/unix/sysv/linux/lxstat64.c b/sysdeps/unix/sysv/linux/lxstat64.c
index 5d0c051aa1..63959cf93b 100644
--- a/sysdeps/unix/sysv/linux/lxstat64.c
+++ b/sysdeps/unix/sysv/linux/lxstat64.c
@@ -30,8 +30,11 @@
 int
 ___lxstat64 (int vers, const char *name, struct stat64 *buf)
 {
-  int result;
-  result = INLINE_SYSCALL (lstat64, 2, name, buf);
+  INTERNAL_SYSCALL_DECL (err);
+  int result = INTERNAL_SYSCALL (lstat64, err, 2, name, buf);
+  if (__glibc_unlikely (INTERNAL_SYSCALL_ERROR_P (result, err)))
+    return INLINE_SYSCALL_ERROR_RETURN_VALUE (INTERNAL_SYSCALL_ERRNO (result,
+								      err));
 #if defined _HAVE_STAT64___ST_INO && __ASSUME_ST_INO_64_BIT == 0
   if (__builtin_expect (!result, 1) && buf->__st_ino != (__ino_t) buf->st_ino)
     buf->st_ino = buf->__st_ino;