manual: Move preadv/writev variants to Scatter-Gather section

Also remove a comment about performance.  fwrite vs writev performance
is a very complex topic and cannot be reduced to a simple advice based
on transfer size.
This commit is contained in:
Florian Weimer 2017-11-19 08:58:31 +01:00
parent 5f9d19490b
commit f6e965ee94
2 changed files with 207 additions and 211 deletions

View File

@ -1,3 +1,9 @@
2017-11-19 Florian Weimer <fweimer@redhat.com>
* manual/llio.texi (I/O Primitives): Move preadv, preadv64,
pwritev, pwritev64, preadv2, preadv64v2, pwritev2, pwritev64v2 ...
(Scatter-Gather): ... to here. Remove misleading comment.
2017-11-18 Christian Brauner <christian.brauner@ubuntu.com>
* support/support_become_root.c (setup_uid_gid_mapping): Fix comment

View File

@ -654,210 +654,6 @@ When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
@code{pwrite} and so transparently replaces the 32 bit interface.
@end deftypefun
@deftypefun ssize_t preadv (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off_t @var{offset})
@standards{BSD, sys/uio.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux 3.2 for all architectures but microblaze
@c (which was added on 3.15). The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pread, and it is now a syscall on all
@c targets.
This function is similar to the @code{readv} function, with the difference
it adds an extra @var{offset} parameter of type @code{off_t} similar to
@code{pread}. The data is written to the file starting at position
@var{offset}. The position of the file descriptor itself is not affected
by the operation. The value is the same as before the call.
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
@code{preadv} function is in fact @code{preadv64} and the type
@code{off_t} has 64 bits, which makes it possible to handle files up to
@twoexp{63} bytes in length.
The return value is a count of bytes (@emph{not} buffers) read, @math{0}
indicating end-of-file, or @math{-1} indicating an error. The possible
errors are the same as in @code{readv} and @code{pread}.
@end deftypefun
@deftypefun ssize_t preadv64 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off64_t @var{offset})
@standards{BSD, unistd.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux 3.2 for all architectures but microblaze
@c (which was added on 3.15). The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pread64, and it is now a syscall on all
@c targets.
This function is similar to the @code{preadv} function with the difference
is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t}. It makes it possible on 32 bit machines to address
files larger than @twoexp{31} bytes and up to @twoexp{63} bytes. The
file descriptor @code{filedes} must be opened using @code{open64} since
otherwise the large offsets possible with @code{off64_t} will lead to
errors with a descriptor in small file mode.
When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
32 bit machine this function is actually available under the name
@code{preadv} and so transparently replaces the 32 bit interface.
@end deftypefun
@deftypefun ssize_t pwritev (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off_t @var{offset})
@standards{BSD, sys/uio.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux 3.2 for all architectures but microblaze
@c (which was added on 3.15). The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pwrite, and it is now a syscall on all
@c targets.
This function is similar to the @code{writev} function, with the difference
it adds an extra @var{offset} parameter of type @code{off_t} similar to
@code{pwrite}. The data is written to the file starting at position
@var{offset}. The position of the file descriptor itself is not affected
by the operation. The value is the same as before the call.
However, on Linux, if a file is opened with @code{O_APPEND}, @code{pwrite}
appends data to the end of the file, regardless of the value of
@code{offset}.
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
@code{pwritev} function is in fact @code{pwritev64} and the type
@code{off_t} has 64 bits, which makes it possible to handle files up to
@twoexp{63} bytes in length.
The return value is a count of bytes (@emph{not} buffers) written, @math{0}
indicating end-of-file, or @math{-1} indicating an error. The possible
errors are the same as in @code{writev} and @code{pwrite}.
@end deftypefun
@deftypefun ssize_t pwritev64 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off64_t @var{offset})
@standards{BSD, unistd.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux 3.2 for all architectures but microblaze
@c (which was added on 3.15). The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pwrite64, and it is now a syscall on all
@c targets.
This function is similar to the @code{pwritev} function with the difference
is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t}. It makes it possible on 32 bit machines to address
files larger than @twoexp{31} bytes and up to @twoexp{63} bytes. The
file descriptor @code{filedes} must be opened using @code{open64} since
otherwise the large offsets possible with @code{off64_t} will lead to
errors with a descriptor in small file mode.
When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
32 bit machine this function is actually available under the name
@code{pwritev} and so transparently replaces the 32 bit interface.
@end deftypefun
@deftypefun ssize_t preadv2 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off_t @var{offset}, int @var{flags})
@standards{GNU, sys/uio.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux v4.6. The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls preadv.
This function is similar to the @code{preadv} function, with the difference
it adds an extra @var{flags} parameter of type @code{int}. The supported
@var{flags} are dependent of the underlying system. For Linux it supports:
@vtable @code
@item RWF_HIPRI
High priority request. This adds a flag that tells the file system that
this is a high priority request for which it is worth to poll the hardware.
The flag is purely advisory and can be ignored if not supported. The
@var{fd} must be opened using @code{O_DIRECT}.
@item RWF_DSYNC
Per-IO synchronization as if the file was opened with @code{O_DSYNC} flag.
@item RWF_SYNC
Per-IO synchronization as if the file was opened with @code{O_SYNC} flag.
@item RWF_NOWAIT
Use nonblocking mode for this operation; that is, this call to @code{preadv2}
will fail and set @code{errno} to @code{EAGAIN} if the operation would block.
@end vtable
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
@code{preadv2} function is in fact @code{preadv64v2} and the type
@code{off_t} has 64 bits, which makes it possible to handle files up to
@twoexp{63} bytes in length.
The return value is a count of bytes (@emph{not} buffers) read, @math{0}
indicating end-of-file, or @math{-1} indicating an error. The possible
errors are the same as in @code{preadv} with the addition of:
@table @code
@item EOPNOTSUPP
@c The default sysdeps/posix code will return it for any flags value
@c different than 0.
An unsupported @var{flags} was used.
@end table
@end deftypefun
@deftypefun ssize_t preadv64v2 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off64_t @var{offset}, int @var{flags})
@standards{GNU, unistd.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux v4.6. The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls preadv.
This function is similar to the @code{preadv2} function with the difference
is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t}. It makes it possible on 32 bit machines to address
files larger than @twoexp{31} bytes and up to @twoexp{63} bytes. The
file descriptor @code{filedes} must be opened using @code{open64} since
otherwise the large offsets possible with @code{off64_t} will lead to
errors with a descriptor in small file mode.
When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
32 bit machine this function is actually available under the name
@code{preadv2} and so transparently replaces the 32 bit interface.
@end deftypefun
@deftypefun ssize_t pwritev2 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off_t @var{offset}, int @var{flags})
@standards{GNU, sys/uio.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux v4.6. The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pwritev.
This function is similar to the @code{pwritev} function, with the difference
it adds an extra @var{flags} parameter of type @code{int}. The supported
@var{flags} are dependent of the underlying system and for Linux it supports
the same ones as for @code{preadv2}.
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
@code{pwritev2} function is in fact @code{pwritev64v2} and the type
@code{off_t} has 64 bits, which makes it possible to handle files up to
@twoexp{63} bytes in length.
The return value is a count of bytes (@emph{not} buffers) write, @math{0}
indicating end-of-file, or @math{-1} indicating an error. The possible
errors are the same as in @code{preadv2}.
@end deftypefun
@deftypefun ssize_t pwritev64v2 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off64_t @var{offset}, int @var{flags})
@standards{GNU, unistd.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux v4.6. The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pwritev.
This function is similar to the @code{pwritev2} function with the difference
is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t}. It makes it possible on 32 bit machines to address
files larger than @twoexp{31} bytes and up to @twoexp{63} bytes. The
file descriptor @code{filedes} must be opened using @code{open64} since
otherwise the large offsets possible with @code{off64_t} will lead to
errors with a descriptor in small file mode.
When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
32 bit machine this function is actually available under the name
@code{pwritev2} and so transparently replaces the 32 bit interface.
@end deftypefun
@node File Position Primitive
@section Setting the File Position of a Descriptor
@ -1354,14 +1150,208 @@ error. The possible errors are the same as in @code{write}.
@end deftypefun
@c Note - I haven't read this anywhere. I surmised it from my knowledge
@c of computer science. Thus, there could be subtleties I'm missing.
@deftypefun ssize_t preadv (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off_t @var{offset})
@standards{BSD, sys/uio.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux 3.2 for all architectures but microblaze
@c (which was added on 3.15). The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pread, and it is now a syscall on all
@c targets.
Note that if the buffers are small (under about 1kB), high-level streams
may be easier to use than these functions. However, @code{readv} and
@code{writev} are more efficient when the individual buffers themselves
(as opposed to the total output), are large. In that case, a high-level
stream would not be able to cache the data efficiently.
This function is similar to the @code{readv} function, with the difference
it adds an extra @var{offset} parameter of type @code{off_t} similar to
@code{pread}. The data is written to the file starting at position
@var{offset}. The position of the file descriptor itself is not affected
by the operation. The value is the same as before the call.
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
@code{preadv} function is in fact @code{preadv64} and the type
@code{off_t} has 64 bits, which makes it possible to handle files up to
@twoexp{63} bytes in length.
The return value is a count of bytes (@emph{not} buffers) read, @math{0}
indicating end-of-file, or @math{-1} indicating an error. The possible
errors are the same as in @code{readv} and @code{pread}.
@end deftypefun
@deftypefun ssize_t preadv64 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off64_t @var{offset})
@standards{BSD, unistd.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux 3.2 for all architectures but microblaze
@c (which was added on 3.15). The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pread64, and it is now a syscall on all
@c targets.
This function is similar to the @code{preadv} function with the difference
is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t}. It makes it possible on 32 bit machines to address
files larger than @twoexp{31} bytes and up to @twoexp{63} bytes. The
file descriptor @code{filedes} must be opened using @code{open64} since
otherwise the large offsets possible with @code{off64_t} will lead to
errors with a descriptor in small file mode.
When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
32 bit machine this function is actually available under the name
@code{preadv} and so transparently replaces the 32 bit interface.
@end deftypefun
@deftypefun ssize_t pwritev (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off_t @var{offset})
@standards{BSD, sys/uio.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux 3.2 for all architectures but microblaze
@c (which was added on 3.15). The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pwrite, and it is now a syscall on all
@c targets.
This function is similar to the @code{writev} function, with the difference
it adds an extra @var{offset} parameter of type @code{off_t} similar to
@code{pwrite}. The data is written to the file starting at position
@var{offset}. The position of the file descriptor itself is not affected
by the operation. The value is the same as before the call.
However, on Linux, if a file is opened with @code{O_APPEND}, @code{pwrite}
appends data to the end of the file, regardless of the value of
@code{offset}.
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
@code{pwritev} function is in fact @code{pwritev64} and the type
@code{off_t} has 64 bits, which makes it possible to handle files up to
@twoexp{63} bytes in length.
The return value is a count of bytes (@emph{not} buffers) written, @math{0}
indicating end-of-file, or @math{-1} indicating an error. The possible
errors are the same as in @code{writev} and @code{pwrite}.
@end deftypefun
@deftypefun ssize_t pwritev64 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off64_t @var{offset})
@standards{BSD, unistd.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux 3.2 for all architectures but microblaze
@c (which was added on 3.15). The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pwrite64, and it is now a syscall on all
@c targets.
This function is similar to the @code{pwritev} function with the difference
is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t}. It makes it possible on 32 bit machines to address
files larger than @twoexp{31} bytes and up to @twoexp{63} bytes. The
file descriptor @code{filedes} must be opened using @code{open64} since
otherwise the large offsets possible with @code{off64_t} will lead to
errors with a descriptor in small file mode.
When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
32 bit machine this function is actually available under the name
@code{pwritev} and so transparently replaces the 32 bit interface.
@end deftypefun
@deftypefun ssize_t preadv2 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off_t @var{offset}, int @var{flags})
@standards{GNU, sys/uio.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux v4.6. The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls preadv.
This function is similar to the @code{preadv} function, with the difference
it adds an extra @var{flags} parameter of type @code{int}. The supported
@var{flags} are dependent of the underlying system. For Linux it supports:
@vtable @code
@item RWF_HIPRI
High priority request. This adds a flag that tells the file system that
this is a high priority request for which it is worth to poll the hardware.
The flag is purely advisory and can be ignored if not supported. The
@var{fd} must be opened using @code{O_DIRECT}.
@item RWF_DSYNC
Per-IO synchronization as if the file was opened with @code{O_DSYNC} flag.
@item RWF_SYNC
Per-IO synchronization as if the file was opened with @code{O_SYNC} flag.
@item RWF_NOWAIT
Use nonblocking mode for this operation; that is, this call to @code{preadv2}
will fail and set @code{errno} to @code{EAGAIN} if the operation would block.
@end vtable
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
@code{preadv2} function is in fact @code{preadv64v2} and the type
@code{off_t} has 64 bits, which makes it possible to handle files up to
@twoexp{63} bytes in length.
The return value is a count of bytes (@emph{not} buffers) read, @math{0}
indicating end-of-file, or @math{-1} indicating an error. The possible
errors are the same as in @code{preadv} with the addition of:
@table @code
@item EOPNOTSUPP
@c The default sysdeps/posix code will return it for any flags value
@c different than 0.
An unsupported @var{flags} was used.
@end table
@end deftypefun
@deftypefun ssize_t preadv64v2 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off64_t @var{offset}, int @var{flags})
@standards{GNU, unistd.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux v4.6. The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls preadv.
This function is similar to the @code{preadv2} function with the difference
is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t}. It makes it possible on 32 bit machines to address
files larger than @twoexp{31} bytes and up to @twoexp{63} bytes. The
file descriptor @code{filedes} must be opened using @code{open64} since
otherwise the large offsets possible with @code{off64_t} will lead to
errors with a descriptor in small file mode.
When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
32 bit machine this function is actually available under the name
@code{preadv2} and so transparently replaces the 32 bit interface.
@end deftypefun
@deftypefun ssize_t pwritev2 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off_t @var{offset}, int @var{flags})
@standards{GNU, sys/uio.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux v4.6. The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pwritev.
This function is similar to the @code{pwritev} function, with the difference
it adds an extra @var{flags} parameter of type @code{int}. The supported
@var{flags} are dependent of the underlying system and for Linux it supports
the same ones as for @code{preadv2}.
When the source file is compiled with @code{_FILE_OFFSET_BITS == 64} the
@code{pwritev2} function is in fact @code{pwritev64v2} and the type
@code{off_t} has 64 bits, which makes it possible to handle files up to
@twoexp{63} bytes in length.
The return value is a count of bytes (@emph{not} buffers) write, @math{0}
indicating end-of-file, or @math{-1} indicating an error. The possible
errors are the same as in @code{preadv2}.
@end deftypefun
@deftypefun ssize_t pwritev64v2 (int @var{fd}, const struct iovec *@var{iov}, int @var{iovcnt}, off64_t @var{offset}, int @var{flags})
@standards{GNU, unistd.h}
@safety{@prelim{}@mtsafe{}@assafe{}@acsafe{}}
@c This is a syscall for Linux v4.6. The sysdeps/posix fallback emulation
@c is also MT-Safe since it calls pwritev.
This function is similar to the @code{pwritev2} function with the difference
is that the @var{offset} parameter is of type @code{off64_t} instead of
@code{off_t}. It makes it possible on 32 bit machines to address
files larger than @twoexp{31} bytes and up to @twoexp{63} bytes. The
file descriptor @code{filedes} must be opened using @code{open64} since
otherwise the large offsets possible with @code{off64_t} will lead to
errors with a descriptor in small file mode.
When the source file is compiled using @code{_FILE_OFFSET_BITS == 64} on a
32 bit machine this function is actually available under the name
@code{pwritev2} and so transparently replaces the 32 bit interface.
@end deftypefun
@node Memory-mapped I/O
@section Memory-mapped I/O