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>
This commit is contained in:
parent
69785a229d
commit
ef503a8417
23
block/nfs.c
23
block/nfs.c
@ -302,20 +302,27 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
|
|||||||
NFSClient *client = bs->opaque;
|
NFSClient *client = bs->opaque;
|
||||||
NFSRPC task;
|
NFSRPC task;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
|
bool my_buffer = false;
|
||||||
|
|
||||||
nfs_co_init_task(bs, &task);
|
nfs_co_init_task(bs, &task);
|
||||||
|
|
||||||
buf = g_try_malloc(bytes);
|
if (iov->niov != 1) {
|
||||||
if (bytes && buf == NULL) {
|
buf = g_try_malloc(bytes);
|
||||||
return -ENOMEM;
|
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,
|
if (nfs_pwrite_async(client->context, client->fh,
|
||||||
offset, bytes, buf,
|
offset, bytes, buf,
|
||||||
nfs_co_generic_cb, &task) != 0) {
|
nfs_co_generic_cb, &task) != 0) {
|
||||||
g_free(buf);
|
if (my_buffer) {
|
||||||
|
g_free(buf);
|
||||||
|
}
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -324,7 +331,9 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
|
|||||||
qemu_coroutine_yield();
|
qemu_coroutine_yield();
|
||||||
}
|
}
|
||||||
|
|
||||||
g_free(buf);
|
if (my_buffer) {
|
||||||
|
g_free(buf);
|
||||||
|
}
|
||||||
|
|
||||||
if (task.ret != bytes) {
|
if (task.ret != bytes) {
|
||||||
return task.ret < 0 ? task.ret : -EIO;
|
return task.ret < 0 ? task.ret : -EIO;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user