avoid use of readv syscall in __stdio_read backend when not needed
authorRich Felker <dalias@aerifal.cx>
Sat, 24 Feb 2018 16:19:54 +0000 (11:19 -0500)
committerRich Felker <dalias@aerifal.cx>
Sat, 24 Feb 2018 16:19:54 +0000 (11:19 -0500)
formally, calling readv with a zero-length first iov component should
behave identically to calling read on just the second component, but
presence of a zero-length iov component has triggered bugs in some
kernels and performs significantly worse than a simple read on some
file types.

src/stdio/__stdio_read.c

index 909c36a9b9692b8a4ddcb2f9db6f28c9d9233c7b..ea675da34abbfd4f34edcd042314b8fb93cf9426 100644 (file)
@@ -9,7 +9,8 @@ size_t __stdio_read(FILE *f, unsigned char *buf, size_t len)
        };
        ssize_t cnt;
 
-       cnt = syscall(SYS_readv, f->fd, iov, 2);
+       cnt = iov[0].iov_len ? syscall(SYS_readv, f->fd, iov, 2)
+               : syscall(SYS_read, f->fd, iov[1].iov_base, iov[1].iov_len);
        if (cnt <= 0) {
                f->flags |= cnt ? F_ERR : F_EOF;
                return 0;