aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Lieven <pl@kamp.de>2017-02-17 17:39:01 +0100
committerJeff Cody <jcody@redhat.com>2017-02-24 12:38:35 -0500
commitef503a841743ec796af3418424dee7e86275b788 (patch)
treeb75f7990341f0aabd5bae562b6c0095080e5ba81
parent69785a229d5d46961cc7579027d7350018de1ca8 (diff)
downloadqemu-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.c23
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;