All of lore.kernel.org
 help / color / mirror / Atom feed
From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, armbru@redhat.com, eblake@redhat.com,
	crosa@redhat.com, ehabkost@redhat.com, berrange@redhat.com,
	pbonzini@redhat.com, vsementsov@virtuozzo.com, jsnow@redhat.com,
	mreitz@redhat.com, kwolf@redhat.com
Subject: [PATCH v6 07/33] block/block-copy: introduce block_copy_set_copy_opts()
Date: Wed, 21 Jul 2021 13:05:29 +0300	[thread overview]
Message-ID: <20210721100555.45594-8-vsementsov@virtuozzo.com> (raw)
In-Reply-To: <20210721100555.45594-1-vsementsov@virtuozzo.com>

We'll need a possibility to set compress and use_copy_range options
after initialization of the state. So make corresponding part of
block_copy_state_new() separate and public.

Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
 include/block/block-copy.h |  2 ++
 block/block-copy.c         | 50 +++++++++++++++++++++++---------------
 2 files changed, 32 insertions(+), 20 deletions(-)

diff --git a/include/block/block-copy.h b/include/block/block-copy.h
index 734389d32a..f0ba7bc828 100644
--- a/include/block/block-copy.h
+++ b/include/block/block-copy.h
@@ -28,6 +28,8 @@ BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
                                      int64_t cluster_size, bool use_copy_range,
                                      bool compress, Error **errp);
 
+void block_copy_set_copy_opts(BlockCopyState *s, bool use_copy_range,
+                              bool compress);
 void block_copy_set_progress_meter(BlockCopyState *s, ProgressMeter *pm);
 
 void block_copy_state_free(BlockCopyState *s);
diff --git a/block/block-copy.c b/block/block-copy.c
index 7ce5e3d657..469f992c0e 100644
--- a/block/block-copy.c
+++ b/block/block-copy.c
@@ -315,6 +315,34 @@ static uint32_t block_copy_max_transfer(BdrvChild *source, BdrvChild *target)
                                      target->bs->bl.max_transfer));
 }
 
+/* Function should be called prior any actual copy request */
+void block_copy_set_copy_opts(BlockCopyState *s, bool use_copy_range,
+                              bool compress)
+{
+    if (compress) {
+        s->write_flags |= BDRV_REQ_WRITE_COMPRESSED;
+    }
+
+    if (s->max_transfer < s->cluster_size) {
+        /*
+         * copy_range does not respect max_transfer. We don't want to bother
+         * with requests smaller than block-copy cluster size, so fallback to
+         * buffered copying (read and write respect max_transfer on their
+         * behalf).
+         */
+        s->method = COPY_READ_WRITE_CLUSTER;
+    } else if (compress) {
+        /* Compression supports only cluster-size writes and no copy-range. */
+        s->method = COPY_READ_WRITE_CLUSTER;
+    } else {
+        /*
+         * If copy range enabled, start with COPY_RANGE_SMALL, until first
+         * successful copy_range (look at block_copy_do_copy).
+         */
+        s->method = use_copy_range ? COPY_RANGE_SMALL : COPY_READ_WRITE;
+    }
+}
+
 BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
                                      int64_t cluster_size, bool use_copy_range,
                                      bool compress, Error **errp)
@@ -358,32 +386,14 @@ BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
         .copy_bitmap = copy_bitmap,
         .cluster_size = cluster_size,
         .len = bdrv_dirty_bitmap_size(copy_bitmap),
-        .write_flags = BDRV_REQ_SERIALISING |
-            (compress ? BDRV_REQ_WRITE_COMPRESSED : 0),
+        .write_flags = BDRV_REQ_SERIALISING,
         .mem = shres_create(BLOCK_COPY_MAX_MEM),
         .max_transfer = QEMU_ALIGN_DOWN(
                                     block_copy_max_transfer(source, target),
                                     cluster_size),
     };
 
-    if (s->max_transfer < cluster_size) {
-        /*
-         * copy_range does not respect max_transfer. We don't want to bother
-         * with requests smaller than block-copy cluster size, so fallback to
-         * buffered copying (read and write respect max_transfer on their
-         * behalf).
-         */
-        s->method = COPY_READ_WRITE_CLUSTER;
-    } else if (compress) {
-        /* Compression supports only cluster-size writes and no copy-range. */
-        s->method = COPY_READ_WRITE_CLUSTER;
-    } else {
-        /*
-         * If copy range enabled, start with COPY_RANGE_SMALL, until first
-         * successful copy_range (look at block_copy_do_copy).
-         */
-        s->method = use_copy_range ? COPY_RANGE_SMALL : COPY_READ_WRITE;
-    }
+    block_copy_set_copy_opts(s, use_copy_range, compress);
 
     ratelimit_init(&s->rate_limit);
     qemu_co_mutex_init(&s->lock);
-- 
2.29.2



  parent reply	other threads:[~2021-07-21 10:13 UTC|newest]

Thread overview: 34+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-07-21 10:05 [PATCH v6 00/33] block: publish backup-top filter Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 01/33] block: introduce bdrv_replace_child_bs() Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 02/33] block: introduce blk_replace_bs Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 03/33] qdev-properties: PropertyInfo: add realized_set_allowed field Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 04/33] qdev: allow setting drive property for realized device Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 05/33] block: rename backup-top to copy-before-write Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 06/33] block-copy: always set BDRV_REQ_SERIALISING flag Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` Vladimir Sementsov-Ogievskiy [this message]
2021-07-21 10:05 ` [PATCH v6 08/33] block/backup: set copy_range and compress after filter insertion Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 09/33] block/backup: move cluster size calculation to block-copy Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 10/33] block/copy-before-write: relax permission requirements when no parents Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 11/33] block/copy-before-write: drop extra bdrv_unref on failure path Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 12/33] block/copy-before-write: use file child instead of backing Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 13/33] block/copy-before-write: bdrv_cbw_append(): replace child at last Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 14/33] block/copy-before-write: introduce cbw_init() Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 15/33] block/copy-before-write: cbw_init(): rename variables Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 16/33] block/copy-before-write: cbw_init(): use file child after attaching Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 17/33] block/copy-before-write: bdrv_cbw_append(): drop unused compress arg Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 18/33] block/copy-before-write: cbw_init(): use options Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 19/33] block/copy-before-write: initialize block-copy bitmap Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 20/33] block/block-copy: make setting progress optional Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 21/33] block/copy-before-write: make public block driver Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 22/33] qapi: publish copy-before-write filter Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 23/33] python/qemu/machine.py: refactor _qemu_args() Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 24/33] python/qemu/machine: QEMUMachine: improve qmp() method Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 25/33] iotests.py: VM: add own __enter__ method Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 26/33] iotests/222: fix pylint and mypy complains Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 27/33] iotests/222: constantly use single quotes for strings Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 28/33] iotests: move 222 to tests/image-fleecing Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 29/33] iotests.py: hmp_qemu_io: support qdev Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 30/33] iotests/image-fleecing: proper source device Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 31/33] iotests/image-fleecing: rename tgt_node Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 32/33] iotests/image-fleecing: prepare for adding new test-case Vladimir Sementsov-Ogievskiy
2021-07-21 10:05 ` [PATCH v6 33/33] iotests/image-fleecing: add test-case for copy-before-write filter Vladimir Sementsov-Ogievskiy

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=20210721100555.45594-8-vsementsov@virtuozzo.com \
    --to=vsementsov@virtuozzo.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=crosa@redhat.com \
    --cc=eblake@redhat.com \
    --cc=ehabkost@redhat.com \
    --cc=jsnow@redhat.com \
    --cc=kwolf@redhat.com \
    --cc=mreitz@redhat.com \
    --cc=pbonzini@redhat.com \
    --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.