qemu-block
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]