diff mbox

[V2] block/io: optimize bdrv_co_pwritev for small requests

Message ID 1464100220-21317-1-git-send-email-pl@kamp.de (mailing list archive)
State New, archived
Headers show

Commit Message

Peter Lieven May 24, 2016, 2:30 p.m. UTC
in a read-modify-write cycle a small request might cause
head and tail to fall into the same aligned block. Currently
QEMU reads the same block twice in this case which is
not necessary.

Signed-off-by: Peter Lieven <pl@kamp.de>
---
v1->v2: following Paolos suggestions to simplify the if condition and
        adjusting the comment

 block/io.c | 8 ++++++++
 1 file changed, 8 insertions(+)

Comments

Kevin Wolf May 24, 2016, 3:07 p.m. UTC | #1
Am 24.05.2016 um 16:30 hat Peter Lieven geschrieben:
> in a read-modify-write cycle a small request might cause
> head and tail to fall into the same aligned block. Currently
> QEMU reads the same block twice in this case which is
> not necessary.
> 
> Signed-off-by: Peter Lieven <pl@kamp.de>

Reviewed-by: Kevin Wolf <kwolf@redhat.com>
Fam Zheng May 26, 2016, 6:50 a.m. UTC | #2
On Tue, 05/24 16:30, Peter Lieven wrote:
> in a read-modify-write cycle a small request might cause
> head and tail to fall into the same aligned block. Currently
> QEMU reads the same block twice in this case which is
> not necessary.
> 
> Signed-off-by: Peter Lieven <pl@kamp.de>

Thanks, applied to my block branch:

https://github.com/famz/qemu/tree/block
diff mbox

Patch

diff --git a/block/io.c b/block/io.c
index 60a6bd8..7459dfb 100644
--- a/block/io.c
+++ b/block/io.c
@@ -1430,6 +1430,14 @@  int coroutine_fn bdrv_co_pwritev(BlockDriverState *bs,
 
         bytes += offset & (align - 1);
         offset = offset & ~(align - 1);
+
+        /* We have read the tail already if the request is smaller
+         * than one aligned block.
+         */
+        if (bytes < align) {
+            qemu_iovec_add(&local_qiov, head_buf + bytes, align - bytes);
+            bytes = align;
+        }
     }
 
     if ((offset + bytes) & (align - 1)) {