From ef503a841743ec796af3418424dee7e86275b788 Mon Sep 17 00:00:00 2001 From: Peter Lieven Date: Fri, 17 Feb 2017 17:39:01 +0100 Subject: [PATCH] block/nfs: try to avoid the bounce buffer in pwritev if the passed qiov contains exactly one iov we can pass the buffer directly. Signed-off-by: Peter Lieven Reviewed-by: Jeff Cody Message-id: 1487349541-10201-3-git-send-email-pl@kamp.de Signed-off-by: Jeff Cody --- block/nfs.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/block/nfs.c b/block/nfs.c index c11c4c96b5..ffb54be065 100644 --- a/block/nfs.c +++ b/block/nfs.c @@ -302,20 +302,27 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset, NFSClient *client = bs->opaque; NFSRPC task; char *buf = NULL; + bool my_buffer = false; nfs_co_init_task(bs, &task); - buf = g_try_malloc(bytes); - if (bytes && buf == NULL) { - return -ENOMEM; + if (iov->niov != 1) { + buf = g_try_malloc(bytes); + if (bytes && buf == NULL) { + return -ENOMEM; + } + qemu_iovec_to_buf(iov, 0, buf, bytes); + my_buffer = true; + } else { + buf = iov->iov[0].iov_base; } - qemu_iovec_to_buf(iov, 0, buf, bytes); - if (nfs_pwrite_async(client->context, client->fh, offset, bytes, buf, nfs_co_generic_cb, &task) != 0) { - g_free(buf); + if (my_buffer) { + g_free(buf); + } return -ENOMEM; } @@ -324,7 +331,9 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset, qemu_coroutine_yield(); } - g_free(buf); + if (my_buffer) { + g_free(buf); + } if (task.ret != bytes) { return task.ret < 0 ? task.ret : -EIO;