Commit ef503a84 authored by Peter Lieven's avatar Peter Lieven Committed by Jeff Cody
Browse files

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: default avatarPeter Lieven <pl@kamp.de>
Reviewed-by: default avatarJeff Cody <jcody@redhat.com>
Message-id: 1487349541-10201-3-git-send-email-pl@kamp.de
Signed-off-by: default avatarJeff Cody <jcody@redhat.com>
parent 69785a22
Loading
Loading
Loading
Loading
+16 −7
Original line number Diff line number Diff line
@@ -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);

    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;
    }

    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;
    }

@@ -324,7 +331,9 @@ static int coroutine_fn nfs_co_pwritev(BlockDriverState *bs, uint64_t offset,
        qemu_coroutine_yield();
    }

    if (my_buffer) {
        g_free(buf);
    }

    if (task.ret != bytes) {
        return task.ret < 0 ? task.ret : -EIO;