diff options
author | Peter Lieven <pl@kamp.de> | 2016-05-30 13:31:13 +0200 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@redhat.com> | 2016-06-07 14:40:51 +0100 |
commit | 117bc3fa22d359db6c4f0c10f34c8c9e00ed64af (patch) | |
tree | daebd01e11358993b50f6bef3406aab2461d2cd0 | |
parent | e3a4f91b4dda92666379e4865ea9847644f3bc19 (diff) |
block/io: optimize bdrv_co_pwritev for small requests
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>
Message-id: 1464607873-28206-1-git-send-email-pl@kamp.de
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
-rw-r--r-- | block/io.c | 8 | ||||
-rwxr-xr-x | tests/qemu-iotests/077 | 12 | ||||
-rw-r--r-- | tests/qemu-iotests/077.out | 26 |
3 files changed, 9 insertions, 37 deletions
diff --git a/block/io.c b/block/io.c index 7ac9897559..e12f303df5 100644 --- a/block/io.c +++ b/block/io.c @@ -1427,6 +1427,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)) { diff --git a/tests/qemu-iotests/077 b/tests/qemu-iotests/077 index 4dc680b7fc..d2d2a2d687 100755 --- a/tests/qemu-iotests/077 +++ b/tests/qemu-iotests/077 @@ -60,7 +60,7 @@ EOF # Sequential RMW requests on the same physical sector off=0x1000 -for ev in "head" "after_head" "tail" "after_tail"; do +for ev in "head" "after_head"; do cat <<EOF break pwritev_rmw_$ev A aio_write -P 10 $((off + 0x200)) 0x200 @@ -211,16 +211,6 @@ function verify_io() echo read -P 11 0x2400 0x200 echo read -P 0 0x2600 0xa00 - echo read -P 0 0x3000 0x200 - echo read -P 10 0x3200 0x200 - echo read -P 11 0x3400 0x200 - echo read -P 0 0x3600 0xa00 - - echo read -P 0 0x4000 0x200 - echo read -P 10 0x4200 0x200 - echo read -P 11 0x4400 0x200 - echo read -P 0 0x4600 0xa00 - # Chained dependencies echo read -P 10 0x5000 0x200 echo read -P 11 0x5200 0x200 diff --git a/tests/qemu-iotests/077.out b/tests/qemu-iotests/077.out index eab14ae2e1..16f951fd3d 100644 --- a/tests/qemu-iotests/077.out +++ b/tests/qemu-iotests/077.out @@ -19,16 +19,6 @@ wrote XXX/XXX bytes at offset XXX XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote XXX/XXX bytes at offset XXX XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -blkdebug: Resuming request 'A' -wrote XXX/XXX bytes at offset XXX -XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -wrote XXX/XXX bytes at offset XXX -XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -blkdebug: Resuming request 'A' -wrote XXX/XXX bytes at offset XXX -XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -wrote XXX/XXX bytes at offset XXX -XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote XXX/XXX bytes at offset XXX XXX bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) wrote XXX/XXX bytes at offset XXX @@ -114,22 +104,6 @@ read 512/512 bytes at offset 9216 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 2560/2560 bytes at offset 9728 2.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 512/512 bytes at offset 12288 -512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 512/512 bytes at offset 12800 -512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 512/512 bytes at offset 13312 -512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 2560/2560 bytes at offset 13824 -2.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 512/512 bytes at offset 16384 -512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 512/512 bytes at offset 16896 -512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 512/512 bytes at offset 17408 -512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) -read 2560/2560 bytes at offset 17920 -2.500 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 512/512 bytes at offset 20480 512 bytes, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec) read 512/512 bytes at offset 20992 |