From 3feedc608f168479bde2f2e079cedd6852cb3b3b Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Sun, 28 May 2006 20:13:51 +0200 Subject: [PATCH] [PATCH] splice fixes --- fio-io.c | 18 +++++++++++++----- os-linux.h | 2 ++ 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/fio-io.c b/fio-io.c index f5d48fd2..7b1c1bd3 100644 --- a/fio-io.c +++ b/fio-io.c @@ -776,16 +776,25 @@ static int fio_splice_read(struct thread_data *td, struct io_u *io_u) { struct spliceio_data *sd = td->io_data; int ret, ret2, buflen; + off_t offset; void *p; + offset = io_u->offset; buflen = io_u->buflen; p = io_u->buf; while (buflen) { - off_t off = io_u->offset; + int this_len = buflen; + + if (this_len > SPLICE_DEF_SIZE) + this_len = SPLICE_DEF_SIZE; + + ret = splice(td->fd, &offset, sd->pipe[1], NULL, this_len, SPLICE_F_MORE); + if (ret < 0) { + if (errno == ENODATA || errno == EAGAIN) + continue; - ret = splice(td->fd, &off, sd->pipe[1], NULL, buflen, 0); - if (ret < 0) return errno; + } buflen -= ret; @@ -816,6 +825,7 @@ static int fio_splice_write(struct thread_data *td, struct io_u *io_u) } }; struct pollfd pfd = { .fd = sd->pipe[1], .events = POLLOUT, }; + off_t off = io_u->offset; int ret, ret2; while (iov[0].iov_len) { @@ -830,8 +840,6 @@ static int fio_splice_write(struct thread_data *td, struct io_u *io_u) iov[0].iov_base += ret; while (ret) { - off_t off = io_u->offset; - ret2 = splice(sd->pipe[0], NULL, td->fd, &off, ret, 0); if (ret2 < 0) return errno; diff --git a/os-linux.h b/os-linux.h index 865853ba..1f6a68da 100644 --- a/os-linux.h +++ b/os-linux.h @@ -62,6 +62,8 @@ static inline int vmsplice(int fd, const struct iovec *iov, #define SPLICE_F_MORE (0x04) /* expect more data */ #define SPLICE_F_GIFT (0x08) /* pages passed in are a gift */ +#define SPLICE_DEF_SIZE (64*1024) + enum { IOPRIO_WHO_PROCESS = 1, IOPRIO_WHO_PGRP, -- 2.25.1