All of lore.kernel.org
 help / color / mirror / Atom feed
From: Hanna Reitz <hreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
	Peter Maydell <peter.maydell@linaro.org>,
	Hanna Reitz <hreitz@redhat.com>,
	qemu-devel@nongnu.org
Subject: [PULL 20/32] qcow2: handle_dependencies(): relax conflict detection
Date: Wed, 15 Sep 2021 19:53:06 +0200	[thread overview]
Message-ID: <20210915175318.853225-21-hreitz@redhat.com> (raw)
In-Reply-To: <20210915175318.853225-1-hreitz@redhat.com>

From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>

There is no conflict and no dependency if we have parallel writes to
different subclusters of one cluster when the cluster itself is already
allocated. So, relax extra dependency.

Measure performance:
First, prepare build/qemu-img-old and build/qemu-img-new images.

cd scripts/simplebench
./img_bench_templater.py

Paste the following to stdin of running script:

qemu_img=../../build/qemu-img-{old|new}
$qemu_img create -f qcow2 -o extended_l2=on /ssd/x.qcow2 1G
$qemu_img bench -c 100000 -d 8 [-s 2K|-s 2K -o 512|-s $((1024*2+512))] \
        -w -t none -n /ssd/x.qcow2

The result:

All results are in seconds

------------------  ---------  ---------
                    old        new
-s 2K               6.7 ± 15%  6.2 ± 12%
                                 -7%
-s 2K -o 512        13 ± 3%    11 ± 5%
                                 -16%
-s $((1024*2+512))  9.5 ± 4%   8.4
                                 -12%
------------------  ---------  ---------

So small writes are more independent now and that helps to keep deeper
io queue which improves performance.

271 iotest output becomes racy for three allocation in one cluster.
Second and third writes may finish in different order. Second and
third requests don't depend on each other any more. Still they both
depend on first request anyway. Filter out second and third write
offsets to cover both possible outputs.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Message-Id: <20210824101517.59802-4-vsementsov@virtuozzo.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
Reviewed-by: Hanna Reitz <hreitz@redhat.com>
[hreitz: s/ an / and /]
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
---
 block/qcow2-cluster.c      | 11 +++++++++++
 tests/qemu-iotests/271     |  5 ++++-
 tests/qemu-iotests/271.out |  4 ++--
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/block/qcow2-cluster.c b/block/qcow2-cluster.c
index 9917e5c28c..c1c43a891b 100644
--- a/block/qcow2-cluster.c
+++ b/block/qcow2-cluster.c
@@ -1403,6 +1403,17 @@ static int handle_dependencies(BlockDriverState *bs, uint64_t guest_offset,
             continue;
         }
 
+        if (old_alloc->keep_old_clusters &&
+            (end <= l2meta_cow_start(old_alloc) ||
+             start >= l2meta_cow_end(old_alloc)))
+        {
+            /*
+             * Clusters intersect but COW areas don't. And cluster itself is
+             * already allocated. So, there is no actual conflict.
+             */
+            continue;
+        }
+
         /* Conflict */
 
         if (start < old_start) {
diff --git a/tests/qemu-iotests/271 b/tests/qemu-iotests/271
index 599b849cc6..2775b4d130 100755
--- a/tests/qemu-iotests/271
+++ b/tests/qemu-iotests/271
@@ -893,7 +893,10 @@ EOF
 }
 
 _make_test_img -o extended_l2=on 1M
-_concurrent_io     | $QEMU_IO | _filter_qemu_io
+# Second and third writes in _concurrent_io() are independent and may finish in
+# different order. So, filter offset out to match both possible variants.
+_concurrent_io     | $QEMU_IO | _filter_qemu_io | \
+    $SED -e 's/\(20480\|40960\)/OFFSET/'
 _concurrent_verify | $QEMU_IO | _filter_qemu_io
 
 # success, all done
diff --git a/tests/qemu-iotests/271.out b/tests/qemu-iotests/271.out
index 81043ba4d7..5be780de76 100644
--- a/tests/qemu-iotests/271.out
+++ b/tests/qemu-iotests/271.out
@@ -719,8 +719,8 @@ blkdebug: Suspended request 'A'
 blkdebug: Resuming request 'A'
 wrote 2048/2048 bytes at offset 30720
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 2048/2048 bytes at offset 20480
+wrote 2048/2048 bytes at offset OFFSET
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
-wrote 2048/2048 bytes at offset 40960
+wrote 2048/2048 bytes at offset OFFSET
 2 KiB, X ops; XX:XX:XX.X (XXX YYY/sec and XXX ops/sec)
 *** done
-- 
2.31.1



  parent reply	other threads:[~2021-09-15 18:16 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-15 17:52 [PULL 00/32] Block patches Hanna Reitz
2021-09-15 17:52 ` [PULL 01/32] gluster: Align block-status tail Hanna Reitz
2021-09-15 17:52 ` [PULL 02/32] block: Drop BDS comment regarding bdrv_append() Hanna Reitz
2021-09-15 17:52 ` [PULL 03/32] block: block-status cache for data regions Hanna Reitz
2021-09-15 17:52 ` [PULL 04/32] block: Clarify that @bytes is no limit on *pnum Hanna Reitz
2021-09-15 17:52 ` [PULL 05/32] block/file-posix: Do not force-cap *pnum Hanna Reitz
2021-09-15 17:52 ` [PULL 06/32] block/gluster: " Hanna Reitz
2021-09-15 17:52 ` [PULL 07/32] block/iscsi: " Hanna Reitz
2021-09-15 17:52 ` [PULL 08/32] iotests: Fix unspecified-encoding pylint warnings Hanna Reitz
2021-09-15 17:52 ` [PULL 09/32] iotests: Fix use-{list,dict}-literal warnings Hanna Reitz
2021-09-15 17:52 ` [PULL 10/32] iotests/297: Drop 169 and 199 from the skip list Hanna Reitz
2021-09-15 17:52 ` [PULL 11/32] migrate-bitmaps-postcopy-test: Fix pylint warnings Hanna Reitz
2021-09-15 17:52 ` [PULL 12/32] migrate-bitmaps-test: " Hanna Reitz
2021-09-15 17:52 ` [PULL 13/32] mirror-top-perms: Fix AbnormalShutdown path Hanna Reitz
2021-09-15 17:53 ` [PULL 14/32] iotests/297: Cover tests/ Hanna Reitz
2021-09-15 17:53 ` [PULL 15/32] block/mirror: fix NULL pointer dereference in mirror_wait_on_conflicts() Hanna Reitz
2021-09-15 17:53 ` [PULL 16/32] tests: add migrate-during-backup Hanna Reitz
2021-09-15 17:53 ` [PULL 17/32] block: bdrv_inactivate_recurse(): check for permissions and fix crash Hanna Reitz
2021-09-15 17:53 ` [PULL 18/32] simplebench: add img_bench_templater.py Hanna Reitz
2021-09-15 17:53 ` [PULL 19/32] qcow2: refactor handle_dependencies() loop body Hanna Reitz
2021-09-15 17:53 ` Hanna Reitz [this message]
2021-09-15 17:53 ` [PULL 21/32] qemu-img: Allow target be aligned to sector size Hanna Reitz
2021-09-15 17:53 ` [PULL 22/32] qcow2-refcount: improve style of check_refcounts_l2() Hanna Reitz
2021-09-15 17:53 ` [PULL 23/32] qcow2: compressed read: simplify cluster descriptor passing Hanna Reitz
2021-09-15 17:53 ` [PULL 24/32] qcow2: introduce qcow2_parse_compressed_l2_entry() helper Hanna Reitz
2021-09-15 17:53 ` [PULL 25/32] qcow2-refcount: introduce fix_l2_entry_by_zero() Hanna Reitz
2021-09-15 17:53 ` [PULL 26/32] qcow2-refcount: fix_l2_entry_by_zero(): also zero L2 entry bitmap Hanna Reitz
2021-09-15 17:53 ` [PULL 27/32] qcow2-refcount: check_refcounts_l2(): check l2_bitmap Hanna Reitz
2021-09-15 17:53 ` [PULL 28/32] qcow2-refcount: check_refcounts_l2(): check reserved bits Hanna Reitz
2021-09-15 17:53 ` [PULL 29/32] qcow2-refcount: improve style of check_refcounts_l1() Hanna Reitz
2021-09-15 17:53 ` [PULL 30/32] qcow2-refcount: check_refcounts_l1(): check reserved bits Hanna Reitz
2021-09-15 17:53 ` [PULL 31/32] qcow2-refcount: check_refblocks(): add separate message for reserved Hanna Reitz
2021-09-15 17:53 ` [PULL 32/32] qemu-img: Add -F shorthand to convert Hanna Reitz
2021-09-16 10:18 ` [PULL 00/32] Block patches Peter Maydell

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210915175318.853225-21-hreitz@redhat.com \
    --to=hreitz@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=peter.maydell@linaro.org \
    --cc=qemu-block@nongnu.org \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.