The vmsplice() system call maps nr_segs ranges of user memory
described by iov into a pipe. The file descriptor fd must refer to a
pipe.
The pointer iov points to an array of iovec structures as defined in
<sys/uio.h>:
struct iovec {
void *iov_base; /* Starting address */
size_t iov_len; /* Number of bytes */
};
The flags argument is a bit mask that is composed by ORing together
zero or more of the following values:
SPLICE_F_MOVE Unused for vmsplice(); see splice(2).
SPLICE_F_NONBLOCK Do not block on I/O; see splice(2) for fur‐
ther details.
SPLICE_F_MORE Currently has no effect for vmsplice(), but
may be implemented in the future; see
splice(2).
SPLICE_F_GIFT The user pages are a gift to the kernel.
The application may not modify this memory
ever, otherwise the page cache and on-disk
data may differ. Gifting pages to the ker‐
nel means that a subsequent splice(2)SPLICE_F_MOVE can successfully move the
pages; if this flag is not specified, then
a subsequent splice(2)SPLICE_F_MOVE must
copy the pages. Data must also be properly
page aligned, both in memory and length.

EAGAIN SPLICE_F_NONBLOCK was specified in flags, and the operation
would block.
EBADF fd either not valid, or doesn't refer to a pipe.
EINVAL nr_segs is greater than IOV_MAX; or memory not aligned if
SPLICE_F_GIFT set.
ENOMEM Out of memory.

vmsplice() follows the other vectorized read/write type functions
when it comes to limitations on the number of segments being passed
in. This limit is IOV_MAX as defined in <limits.h>. Currently, this
limit is 1024.

This page is part of release 4.13 of the Linux man-pages project. A
description of the project, information about reporting bugs, and the
latest version of this page, can be found at
https://www.kernel.org/doc/man-pages/.
Linux 2017-09-15 VMSPLICE(2)