Skip to content

Commit

Permalink
block/nfs: try to avoid the bounce buffer in pwritev
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
plieven authored and codyprime committed Feb 24, 2017
1 parent 69785a2 commit ef503a8
Showing 1 changed file with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions block/nfs.c
Expand Up @@ -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;
}

Expand All @@ -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;
Expand Down

0 comments on commit ef503a8

Please sign in to comment.