diff options
author | Peter Lieven <pl@kamp.de> | 2017-02-17 17:39:01 +0100 |
---|---|---|
committer | Jeff Cody <jcody@redhat.com> | 2017-02-24 12:38:35 -0500 |
commit | ef503a841743ec796af3418424dee7e86275b788 (patch) | |
tree | b75f7990341f0aabd5bae562b6c0095080e5ba81 | |
parent | 69785a229d5d46961cc7579027d7350018de1ca8 (diff) | |
download | qemu-ef503a841743ec796af3418424dee7e86275b788.zip qemu-ef503a841743ec796af3418424dee7e86275b788.tar.gz qemu-ef503a841743ec796af3418424dee7e86275b788.tar.bz2 |
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 <pl@kamp.de>
Reviewed-by: Jeff Cody <jcody@redhat.com>
Message-id: 1487349541-10201-3-git-send-email-pl@kamp.de
Signed-off-by: Jeff Cody <jcody@redhat.com>
-rw-r--r-- | block/nfs.c | 23 |
1 files changed, 16 insertions, 7 deletions
diff --git a/block/nfs.c b/block/nfs.c index c11c4c9..ffb54be 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; |