[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-block] [PULL 2/3] block/nfs: try to avoid the bounce buffer in pwr
From: |
Jeff Cody |
Subject: |
[Qemu-block] [PULL 2/3] block/nfs: try to avoid the bounce buffer in pwritev |
Date: |
Fri, 24 Feb 2017 12:46:59 -0500 |
From: Peter Lieven <address@hidden>
if the passed qiov contains exactly one iov we can
pass the buffer directly.
Signed-off-by: Peter Lieven <address@hidden>
Reviewed-by: Jeff Cody <address@hidden>
Message-id: address@hidden
Signed-off-by: Jeff Cody <address@hidden>
---
block/nfs.c | 35 ++++++++++++++++++++++-------------
1 file changed, 22 insertions(+), 13 deletions(-)
diff --git a/block/nfs.c b/block/nfs.c
index c11c4c9..ffb54be 100644
--- a/block/nfs.c
+++ b/block/nfs.c
@@ -302,30 +302,39 @@ 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) {
+ if (my_buffer) {
+ g_free(buf);
+ }
+ return -ENOMEM;
+ }
+
+ nfs_set_events(client);
+ while (!task.complete) {
+ qemu_coroutine_yield();
+ }
+
+ if (my_buffer) {
g_free(buf);
- return -ENOMEM;
}
- nfs_set_events(client);
- while (!task.complete) {
- qemu_coroutine_yield();
- }
-
- g_free(buf);
-
if (task.ret != bytes) {
return task.ret < 0 ? task.ret : -EIO;
}
--
2.9.3