aboutsummaryrefslogtreecommitdiffstats
path: root/tools/libaio/man/io.3
diff options
context:
space:
mode:
Diffstat (limited to 'tools/libaio/man/io.3')
-rw-r--r--tools/libaio/man/io.3351
1 files changed, 0 insertions, 351 deletions
diff --git a/tools/libaio/man/io.3 b/tools/libaio/man/io.3
deleted file mode 100644
index d910a689f5..0000000000
--- a/tools/libaio/man/io.3
+++ /dev/null
@@ -1,351 +0,0 @@
-.TH io 3 2002-09-12 "Linux 2.4" Linux IO"
-.SH NAME
-io \- Asynchronous IO
-.SH SYNOPSYS
-.nf
-.B #include <errno.h>
-.sp
-.br
-.B #include <libio.h>
-.sp
-.fi
-.SH DESCRIPTION
-The libaio library defines a new set of I/O operations which can
-significantly reduce the time an application spends waiting at I/O. The
-new functions allow a program to initiate one or more I/O operations and
-then immediately resume normal work while the I/O operations are
-executed in parallel.
-
-These functions are part of the library with realtime functions named
-.IR "libaio"
-. They are not actually part of the
-.IR "libc"
-binary.
-The implementation of these functions can be done using support in the
-kernel.
-
-All IO operations operate on files which were opened previously. There
-might be arbitrarily many operations running for one file. The
-asynchronous I/O operations are controlled using a data structure named
-.IR "struct iocb"
-It is defined in
-.IR "libio.h"
-as follows.
-
-.nf
-
-typedef struct io_context *io_context_t;
-
-typedef enum io_iocb_cmd {
- IO_CMD_PREAD = 0,
- IO_CMD_PWRITE = 1,
-
- IO_CMD_FSYNC = 2,
- IO_CMD_FDSYNC = 3,
-
- IO_CMD_POLL = 5,
- IO_CMD_NOOP = 6,
-} io_iocb_cmd_t;
-
-struct io_iocb_common {
- void *buf;
- unsigned __pad1;
- long nbytes;
- unsigned __pad2;
- long long offset;
- long long __pad3, __pad4;
-}; /* result code is the amount read or -'ve errno */
-
-
-struct iocb {
- void *data;
- unsigned key;
- short aio_lio_opcode;
- short aio_reqprio;
- int aio_fildes;
- union {
- struct io_iocb_common c;
- struct io_iocb_vector v;
- struct io_iocb_poll poll;
- struct io_iocb_sockaddr saddr;
- } u;
-};
-
-
-.fi
-.TP
-.IR "int aio_fildes"
-This element specifies the file descriptor to be used for the
-operation. It must be a legal descriptor, otherwise the operation will
-fail.
-
-The device on which the file is opened must allow the seek operation.
-I.e., it is not possible to use any of the IO operations on devices
-like terminals where an
-.IR "lseek"
-call would lead to an error.
-.TP
-.IR "long u.c.offset"
-This element specifies the offset in the file at which the operation (input
-or output) is performed. Since the operations are carried out in arbitrary
-order and more than one operation for one file descriptor can be
-started, one cannot expect a current read/write position of the file
-descriptor.
-.TP
-.IR "void *buf"
-This is a pointer to the buffer with the data to be written or the place
-where the read data is stored.
-.TP
-.IR "long u.c.nbytes"
-This element specifies the length of the buffer pointed to by
-.IR "io_buf"
-.
-.TP
-.IR "int aio_reqprio"
-Is not currently used.
-.TP
-.B "IO_CMD_PREAD"
-Start a read operation. Read from the file at position
-.IR "u.c.offset"
-and store the next
-.IR "u.c.nbytes"
-bytes in the
-buffer pointed to by
-.IR "buf"
-.
-.TP
-.B "IO_CMD_PWRITE"
-Start a write operation. Write
-.IR "u.c.nbytes"
-bytes starting at
-.IR "buf"
-into the file starting at position
-.IR "u.c.offset"
-.
-.TP
-.B "IO_CMD_NOP"
-Do nothing for this control block. This value is useful sometimes when
-an array of
-.IR "struct iocb"
-values contains holes, i.e., some of the
-values must not be handled although the whole array is presented to the
-.IR "io_submit"
-function.
-.TP
-.B "IO_CMD_FSYNC"
-.TP
-.B "IO_CMD_POLL"
-This is experimental.
-.SH EXAMPLE
-.nf
-/*
- * Simplistic version of copy command using async i/o
- *
- * From: Stephen Hemminger <shemminger@osdl.org>
- * Copy file by using a async I/O state machine.
- * 1. Start read request
- * 2. When read completes turn it into a write request
- * 3. When write completes decrement counter and free resources
- *
- *
- * Usage: aiocp file(s) desination
- */
-
-#include <unistd.h>
-#include <stdio.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/param.h>
-#include <fcntl.h>
-#include <errno.h>
-
-#include <libaio.h>
-
-#define AIO_BLKSIZE (64*1024)
-#define AIO_MAXIO 32
-
-static int busy = 0; // # of I/O's in flight
-static int tocopy = 0; // # of blocks left to copy
-static int dstfd = -1; // destination file descriptor
-static const char *dstname = NULL;
-static const char *srcname = NULL;
-
-
-/* Fatal error handler */
-static void io_error(const char *func, int rc)
-{
- if (rc == -ENOSYS)
- fprintf(stderr, "AIO not in this kernel\n");
- else if (rc < 0 && -rc < sys_nerr)
- fprintf(stderr, "%s: %s\n", func, sys_errlist[-rc]);
- else
- fprintf(stderr, "%s: error %d\n", func, rc);
-
- if (dstfd > 0)
- close(dstfd);
- if (dstname)
- unlink(dstname);
- exit(1);
-}
-
-/*
- * Write complete callback.
- * Adjust counts and free resources
- */
-static void wr_done(io_context_t ctx, struct iocb *iocb, long res, long res2)
-{
- if (res2 != 0) {
- io_error("aio write", res2);
- }
- if (res != iocb->u.c.nbytes) {
- fprintf(stderr, "write missed bytes expect %d got %d\n", iocb->u.c.nbytes, res2);
- exit(1);
- }
- --tocopy;
- --busy;
- free(iocb->u.c.buf);
-
- memset(iocb, 0xff, sizeof(iocb)); // paranoia
- free(iocb);
- write(2, "w", 1);
-}
-
-/*
- * Read complete callback.
- * Change read iocb into a write iocb and start it.
- */
-static void rd_done(io_context_t ctx, struct iocb *iocb, long res, long res2)
-{
- /* library needs accessors to look at iocb? */
- int iosize = iocb->u.c.nbytes;
- char *buf = iocb->u.c.buf;
- off_t offset = iocb->u.c.offset;
-
- if (res2 != 0)
- io_error("aio read", res2);
- if (res != iosize) {
- fprintf(stderr, "read missing bytes expect %d got %d\n", iocb->u.c.nbytes, res);
- exit(1);
- }
-
-
- /* turn read into write */
- io_prep_pwrite(iocb, dstfd, buf, iosize, offset);
- io_set_callback(iocb, wr_done);
- if (1 != (res = io_submit(ctx, 1, &iocb)))
- io_error("io_submit write", res);
- write(2, "r", 1);
-}
-
-
-int main(int argc, char *const *argv)
-{
- int srcfd;
- struct stat st;
- off_t length = 0, offset = 0;
- io_context_t myctx;
-
- if (argc != 3 || argv[1][0] == '-') {
- fprintf(stderr, "Usage: aiocp SOURCE DEST");
- exit(1);
- }
- if ((srcfd = open(srcname = argv[1], O_RDONLY)) < 0) {
- perror(srcname);
- exit(1);
- }
- if (fstat(srcfd, &st) < 0) {
- perror("fstat");
- exit(1);
- }
- length = st.st_size;
-
- if ((dstfd = open(dstname = argv[2], O_WRONLY | O_CREAT, 0666)) < 0) {
- close(srcfd);
- perror(dstname);
- exit(1);
- }
-
- /* initialize state machine */
- memset(&myctx, 0, sizeof(myctx));
- io_queue_init(AIO_MAXIO, &myctx);
- tocopy = howmany(length, AIO_BLKSIZE);
-
- while (tocopy > 0) {
- int i, rc;
- /* Submit as many reads as once as possible upto AIO_MAXIO */
- int n = MIN(MIN(AIO_MAXIO - busy, AIO_MAXIO / 2),
- howmany(length - offset, AIO_BLKSIZE));
- if (n > 0) {
- struct iocb *ioq[n];
-
- for (i = 0; i < n; i++) {
- struct iocb *io = (struct iocb *) malloc(sizeof(struct iocb));
- int iosize = MIN(length - offset, AIO_BLKSIZE);
- char *buf = (char *) malloc(iosize);
-
- if (NULL == buf || NULL == io) {
- fprintf(stderr, "out of memory\n");
- exit(1);
- }
-
- io_prep_pread(io, srcfd, buf, iosize, offset);
- io_set_callback(io, rd_done);
- ioq[i] = io;
- offset += iosize;
- }
-
- rc = io_submit(myctx, n, ioq);
- if (rc < 0)
- io_error("io_submit", rc);
-
- busy += n;
- }
-
- // Handle IO's that have completed
- rc = io_queue_run(myctx);
- if (rc < 0)
- io_error("io_queue_run", rc);
-
- // if we have maximum number of i/o's in flight
- // then wait for one to complete
- if (busy == AIO_MAXIO) {
- rc = io_queue_wait(myctx, NULL);
- if (rc < 0)
- io_error("io_queue_wait", rc);
- }
-
- }
-
- close(srcfd);
- close(dstfd);
- exit(0);
-}
-
-/*
- * Results look like:
- * [alanm@toolbox ~/MOT3]$ ../taio kernel-source-2.4.8-0.4g.ppc.rpm abc
- * rrrrrrrrrrrrrrrwwwrwrrwwrrwrwwrrwrwrwwrrwrwrrrrwwrwwwrrwrrrwwwwwwwwwwwwwwwww
- * rrrrrrrrrrrrrrwwwrrwrwrwrwrrwwwwwwwwwwwwwwrrrrrrrrrrrrrrrrrrwwwwrwrwwrwrwrwr
- * wrrrrrrrwwwwwwwwwwwwwrrrwrrrwrrwrwwwwwwwwwwrrrrwwrwrrrrrrrrrrrwwwwwwwwwwwrww
- * wwwrrrrrrrrwwrrrwwrwrwrwwwrrrrrrrwwwrrwwwrrwrwwwwwwwwrrrrrrrwwwrrrrrrrwwwwww
- * wwwwwwwrwrrrrrrrrwrrwrrwrrwrwrrrwrrrwrrrwrwwwwwwwwwwwwwwwwwwrrrwwwrrrrrrrrrr
- * rrwrrrrrrwrrwwwwwwwwwwwwwwwwrwwwrrwrwwrrrrrrrrrrrrrrrrrrrwwwwwwwwwwwwwwwwwww
- * rrrrrwrrwrwrwrrwrrrwwwwwwwwrrrrwrrrwrwwrwrrrwrrwrrrrwwwwwwwrwrwwwwrwwrrrwrrr
- * rrrwwwwwwwrrrrwwrrrrrrrrrrrrwrwrrrrwwwwwwwwwwwwwwrwrrrrwwwwrwrrrrwrwwwrrrwww
- * rwwrrrrrrrwrrrrrrrrrrrrwwwwrrrwwwrwrrwwwwwwwwwwwwwwwwwwwwwrrrrrrrwwwwwwwrw
- */
-.fi
-.SH "SEE ALSO"
-.BR io_cancel(3),
-.BR io_fsync(3),
-.BR io_getevents(3),
-.BR io_prep_fsync(3),
-.BR io_prep_pread(3),
-.BR io_prep_pwrite(3),
-.BR io_queue_init(3),
-.BR io_queue_release(3),
-.BR io_queue_run(3),
-.BR io_queue_wait(3),
-.BR io_set_callback(3),
-.BR io_submit(3),
-.BR errno(3)