From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, fam@euphon.net, stefanha@redhat.com,
eblake@redhat.com, vsementsov@virtuozzo.com, jsnow@redhat.com,
hreitz@redhat.com, kwolf@redhat.com
Subject: [PATCH 3/4] block: improve block_dirty_bitmap_merge(): don't allocate extra bitmap
Date: Tue, 15 Feb 2022 18:53:09 +0100 [thread overview]
Message-ID: <20220215175310.68058-4-vsementsov@virtuozzo.com> (raw)
In-Reply-To: <20220215175310.68058-1-vsementsov@virtuozzo.com>
We don't need extra bitmap. All we need is to backup the original
bitmap when we do first merge. So, drop extra temporary bitmap and work
directly with target and backup.
Note that block_dirty_bitmap_merge() semantics changed: on failure
target may be modified now, and caller should call
block_dirty_bitmap_restore() if needed. The only caller is
qmp_transaction() and ->abort() is called for failed action. So, we are
OK.
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
---
block/monitor/bitmap-qmp-cmds.c | 31 +++++++++----------------------
1 file changed, 9 insertions(+), 22 deletions(-)
diff --git a/block/monitor/bitmap-qmp-cmds.c b/block/monitor/bitmap-qmp-cmds.c
index a94aaa9fb3..2ce1b4e455 100644
--- a/block/monitor/bitmap-qmp-cmds.c
+++ b/block/monitor/bitmap-qmp-cmds.c
@@ -252,12 +252,15 @@ void qmp_block_dirty_bitmap_disable(const char *node, const char *name,
bdrv_disable_dirty_bitmap(bitmap);
}
+/*
+ * On failure target may be modified. In this case @backup is set.
+ */
BdrvDirtyBitmap *block_dirty_bitmap_merge(const char *node, const char *target,
BlockDirtyBitmapMergeSourceList *bms,
HBitmap **backup, Error **errp)
{
BlockDriverState *bs;
- BdrvDirtyBitmap *dst, *src, *anon;
+ BdrvDirtyBitmap *dst, *src;
BlockDirtyBitmapMergeSourceList *lst;
dst = block_dirty_bitmap_lookup(node, target, &bs, errp);
@@ -265,12 +268,6 @@ BdrvDirtyBitmap *block_dirty_bitmap_merge(const char *node, const char *target,
return NULL;
}
- anon = bdrv_create_dirty_bitmap(bs, bdrv_dirty_bitmap_granularity(dst),
- NULL, errp);
- if (!anon) {
- return NULL;
- }
-
for (lst = bms; lst; lst = lst->next) {
switch (lst->value->type) {
const char *name, *node;
@@ -279,8 +276,7 @@ BdrvDirtyBitmap *block_dirty_bitmap_merge(const char *node, const char *target,
src = bdrv_find_dirty_bitmap(bs, name);
if (!src) {
error_setg(errp, "Dirty bitmap '%s' not found", name);
- dst = NULL;
- goto out;
+ return NULL;
}
break;
case QTYPE_QDICT:
@@ -288,28 +284,19 @@ BdrvDirtyBitmap *block_dirty_bitmap_merge(const char *node, const char *target,
name = lst->value->u.external.name;
src = block_dirty_bitmap_lookup(node, name, NULL, errp);
if (!src) {
- dst = NULL;
- goto out;
+ return NULL;
}
break;
default:
abort();
}
- if (!bdrv_merge_dirty_bitmap(anon, src, NULL, errp)) {
- dst = NULL;
- goto out;
+ if (!bdrv_merge_dirty_bitmap(dst, src, backup, errp)) {
+ return NULL;
}
+ backup = NULL; /* Set once by first bdrv_merge_dirty_bitmap() call */
}
- /* Merge into dst; dst is unchanged on failure. */
- if (!bdrv_merge_dirty_bitmap(dst, anon, backup, errp)) {
- dst = NULL;
- goto out;
- }
-
- out:
- bdrv_release_dirty_bitmap(anon);
return dst;
}
--
2.31.1
next prev parent reply other threads:[~2022-02-15 17:58 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-02-15 17:53 [PATCH 0/4] block/dirty-bitmaps: fix and improve bitmap merge Vladimir Sementsov-Ogievskiy
2022-02-15 17:53 ` [PATCH 1/4] block: bdrv_merge_dirty_bitmap: add return value Vladimir Sementsov-Ogievskiy
2022-02-16 8:50 ` Vladimir Sementsov-Ogievskiy
2022-02-15 17:53 ` [PATCH 2/4] block: block_dirty_bitmap_merge(): fix error path Vladimir Sementsov-Ogievskiy
2022-02-19 10:26 ` Nikta Lapshin
2022-02-15 17:53 ` Vladimir Sementsov-Ogievskiy [this message]
2022-02-19 10:29 ` [PATCH 3/4] block: improve block_dirty_bitmap_merge(): don't allocate extra bitmap Nikta Lapshin
2022-02-21 15:59 ` Vladimir Sementsov-Ogievskiy
2022-02-15 17:53 ` [PATCH 4/4] block: simplify handling of try to merge different sized bitmaps Vladimir Sementsov-Ogievskiy
2022-02-19 11:04 ` Nikta Lapshin
2022-02-19 14:07 ` Vladimir Sementsov-Ogievskiy via
2022-02-22 16:15 ` 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=20220215175310.68058-4-vsementsov@virtuozzo.com \
--to=vsementsov@virtuozzo.com \
--cc=eblake@redhat.com \
--cc=fam@euphon.net \
--cc=hreitz@redhat.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=stefanha@redhat.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).