Add pipe creation man page

Signed-off-by: Jens Axboe <axboe@kernel.dk>
diff --git a/man/io_uring_prep_pipe.3 b/man/io_uring_prep_pipe.3
new file mode 100644
index 0000000..948f345
--- /dev/null
+++ b/man/io_uring_prep_pipe.3
@@ -0,0 +1,91 @@
+.\" Copyright (C) 2022 Jens Axboe <axboe@kernel.dk>
+.\"
+.\" SPDX-License-Identifier: LGPL-2.0-or-later
+.\"
+.TH io_uring_prep_pipe 3 "April 8, 2025" "liburing-2.10" "liburing Manual"
+.SH NAME
+io_uring_prep_pipe \- prepare a pipe creation request
+.SH SYNOPSIS
+.nf
+.B #include <liburing.h>
+.PP
+.BI "void io_uring_prep_pipe(struct io_uring_sqe *" sqe ","
+.BI "                        int *" fds ","
+.BI "                        int " pipe_flags ");"
+.BI "
+.BI "void io_uring_prep_pipe_direct(struct io_uring_sqe *" sqe ","
+.BI "                               int *" fds ","
+.BI "                               int " pipe_flags ","
+.BI "                               unsigned int " file_index ");"
+.PP
+.fi
+.SH DESCRIPTION
+.PP
+The
+.BR io_uring_prep_pipe (3)
+function prepares a pipe creation request. The submission queue entry
+.I sqe
+is setup to create a pipe with the created descriptors being copied to the
+array indicated by 
+.I fds
+and using
+.I pipe_flags
+as the pipe creation flags. See
+.BR pipe2(2)
+for details on the flags accepted.
+
+The
+.BR io_uring_prep_pipe_direct (3)
+function works in the same way, however it uses fixed/registered file
+descriptors rather than normal file descriptors. This helper takes an
+additional
+.I file_index
+argument, which can set to either an explicit direct descriptor offset to create
+the two pipe file descriptors at, or it can be set to
+.B IORING_FILE_INDEX_ALLOC
+to let io_uring pick any available descriptors for the read and write side
+of the pipe. If a specific index is given, the read side of the pipe will
+be created at that offset, if free, and the write side will be created at
+the next (+1) index. Both of these must be currently unused, or the
+operation will fail. Also see
+.BR io_uring_prep_accept_direct (3)
+or
+.BR io_uring_prep_socket_direct (3)
+for details on the
+.I file_index
+parameter.
+
+For both the direct and normal file descriptor pipe request, the resulting
+input/read side of the pipe will be stored in
+.I fds[0]
+and the output/write side of the pipe will be stored in
+.I fds[1]
+upon successful completion of this request.
+
+This function prepares an async
+.BR pipe2 (2)
+request. See that man page for details.
+
+.SH RETURN VALUE
+None
+.SH ERRORS
+The CQE
+.I res
+field will contain the result of the operation. See the related man page for
+details on possible values. Note that where synchronous system calls will return
+.B -1
+on failure and set
+.I errno
+to the actual error value, io_uring never uses
+.IR errno .
+Instead it returns the negated
+.I errno
+directly in the CQE
+.I res
+field.
+.SH SEE ALSO
+.BR io_uring_get_sqe (3),
+.BR io_uring_submit (3),
+.BR pipe2 (2),
+.BR io_uring_prep_accept_direct (3),
+.BR io_uring_prep_socket_direct (3)