From 436885758c1b859392b80c616c338f9cfe9a9dfb Mon Sep 17 00:00:00 2001 From: Jens Axboe Date: Tue, 14 Aug 2007 13:43:05 +0200 Subject: splice: automatically detect whether vmsplice-to-user works Signed-off-by: Jens Axboe --- engines/splice.c | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) (limited to 'engines') diff --git a/engines/splice.c b/engines/splice.c index f54b4414..9386983c 100644 --- a/engines/splice.c +++ b/engines/splice.c @@ -116,7 +116,6 @@ static int fio_splice_read(struct thread_data *td, struct io_u *io_u) return io_u->xfer_buflen; } - /* * For splice writing, we can vmsplice our data buffer directly into a * pipe and then splice that to a file. @@ -162,9 +161,17 @@ static int fio_spliceio_queue(struct thread_data *td, struct io_u *io_u) int ret; if (io_u->ddir == DDIR_READ) { - if (sd->vmsplice_to_user) + if (sd->vmsplice_to_user) { ret = fio_splice_read(td, io_u); - else + /* + * This kernel doesn't support vmsplice to user + * space. Reset the vmsplice_to_user flag, so that + * we retry below and don't hit this path again. + */ + if (ret == -EBADF) + sd->vmsplice_to_user = 0; + } + if (!sd->vmsplice_to_user) ret = fio_splice_read_old(td, io_u); } else if (io_u->ddir == DDIR_WRITE) ret = fio_splice_write(td, io_u); @@ -209,9 +216,9 @@ static int fio_spliceio_init(struct thread_data *td) } /* - * need some check for enabling this, for now just leave it disabled + * Assume this work, we'll reset this if it doesn't */ - sd->vmsplice_to_user = 0; + sd->vmsplice_to_user = 1; td->io_ops->data = sd; return 0; -- cgit v1.2.3