From: Jeff Cody <jcody@redhat.com>
To: qemu-block@nongnu.org
Cc: peter.maydell@linaro.org, jcody@redhat.com, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PULL 2/3] block/nfs: try to avoid the bounce buffer in pwritev
Date: Fri, 24 Feb 2017 12:46:59 -0500 [thread overview]
Message-ID: <20170224174700.30816-3-jcody@redhat.com> (raw)
In-Reply-To: <20170224174700.30816-1-jcody@redhat.com>
From: Peter Lieven <pl@kamp.de>
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>
---
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
next prev parent reply other threads:[~2017-02-24 17:47 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-02-24 17:46 [Qemu-devel] [PULL 0/3] Block patches Jeff Cody
2017-02-24 17:46 ` [Qemu-devel] [PULL 1/3] block/nfs: convert to preadv / pwritev Jeff Cody
2017-02-24 17:46 ` Jeff Cody [this message]
2017-02-24 17:47 ` [Qemu-devel] [PULL 3/3] RBD: Add support readv,writev for rbd Jeff Cody
2017-02-26 12:26 ` [Qemu-devel] [PULL 0/3] Block patches Peter Maydell
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20170224174700.30816-3-jcody@redhat.com \
--to=jcody@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.