[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 04/18] block: improve block_dirty_bitmap_merge(): don't allocate e
From: |
Kevin Wolf |
Subject: |
[PULL 04/18] block: improve block_dirty_bitmap_merge(): don't allocate extra bitmap |
Date: |
Thu, 9 Jun 2022 19:21:35 +0200 |
From: Vladimir Sementsov-Ogievskiy <vsementsov@openvz.org>
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.
Still to keep old semantics, that on failure target is unchanged and
user don't need to restore, we need a local_backup variable and do
restore ourselves on failure path.
Signed-off-by: Vladimir Sementsov-Ogievskiy <v.sementsov-og@mail.ru>
Message-Id: <20220517111206.23585-3-v.sementsov-og@mail.ru>
Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: Kevin Wolf <kwolf@redhat.com>
---
block/monitor/bitmap-qmp-cmds.c | 41 +++++++++++++++++----------------
1 file changed, 21 insertions(+), 20 deletions(-)
diff --git a/block/monitor/bitmap-qmp-cmds.c b/block/monitor/bitmap-qmp-cmds.c
index bd10468596..282363606f 100644
--- a/block/monitor/bitmap-qmp-cmds.c
+++ b/block/monitor/bitmap-qmp-cmds.c
@@ -261,8 +261,9 @@ BdrvDirtyBitmap *block_dirty_bitmap_merge(const char *node,
const char *target,
HBitmap **backup, Error **errp)
{
BlockDriverState *bs;
- BdrvDirtyBitmap *dst, *src, *anon;
+ BdrvDirtyBitmap *dst, *src;
BlockDirtyBitmapOrStrList *lst;
+ HBitmap *local_backup = NULL;
GLOBAL_STATE_CODE();
@@ -271,12 +272,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;
@@ -285,8 +280,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;
+ goto fail;
}
break;
case QTYPE_QDICT:
@@ -294,29 +288,36 @@ 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;
+ goto fail;
}
break;
default:
abort();
}
- if (!bdrv_merge_dirty_bitmap(anon, src, NULL, errp)) {
- dst = NULL;
- goto out;
+ /* We do backup only for first merge operation */
+ if (!bdrv_merge_dirty_bitmap(dst, src,
+ local_backup ? NULL : &local_backup,
+ errp))
+ {
+ goto fail;
}
}
- /* Merge into dst; dst is unchanged on failure. */
- if (!bdrv_merge_dirty_bitmap(dst, anon, backup, errp)) {
- dst = NULL;
- goto out;
+ if (backup) {
+ *backup = local_backup;
+ } else {
+ hbitmap_free(local_backup);
}
- out:
- bdrv_release_dirty_bitmap(anon);
return dst;
+
+fail:
+ if (local_backup) {
+ bdrv_restore_dirty_bitmap(dst, local_backup);
+ }
+
+ return NULL;
}
void qmp_block_dirty_bitmap_merge(const char *node, const char *target,
--
2.35.3
- [PULL 12/18] vduse-blk: Add vduse-blk resize support, (continued)
- [PULL 12/18] vduse-blk: Add vduse-blk resize support, Kevin Wolf, 2022/06/09
- [PULL 08/18] block/export: Abstract out the logic of virtio-blk I/O process, Kevin Wolf, 2022/06/09
- [PULL 18/18] nbd: Drop dead code spotted by Coverity, Kevin Wolf, 2022/06/09
- [PULL 03/18] block: block_dirty_bitmap_merge(): fix error path, Kevin Wolf, 2022/06/09
- [PULL 13/18] libvduse: Add support for reconnecting, Kevin Wolf, 2022/06/09
- [PULL 11/18] vduse-blk: Implement vduse-blk export, Kevin Wolf, 2022/06/09
- [PULL 16/18] block/gluster: correctly set max_pdiscard, Kevin Wolf, 2022/06/09
- [PULL 17/18] aio_wait_kick: add missing memory barrier, Kevin Wolf, 2022/06/09
- [PULL 09/18] linux-headers: Add vduse.h, Kevin Wolf, 2022/06/09
- [PULL 06/18] block: Support passing NULL ops to blk_set_dev_ops(), Kevin Wolf, 2022/06/09
- [PULL 04/18] block: improve block_dirty_bitmap_merge(): don't allocate extra bitmap,
Kevin Wolf <=
- [PULL 07/18] block/export: Fix incorrect length passed to vu_queue_push(), Kevin Wolf, 2022/06/09
- [PULL 10/18] libvduse: Add VDUSE (vDPA Device in Userspace) library, Kevin Wolf, 2022/06/09
- [PULL 02/18] block: get rid of blk->guest_block_size, Kevin Wolf, 2022/06/09
- [PULL 05/18] block: simplify handling of try to merge different sized bitmaps, Kevin Wolf, 2022/06/09
- [PULL 14/18] qsd: document vduse-blk exports, Kevin Wolf, 2022/06/09
- [PULL 15/18] block/rbd: report a better error when namespace does not exist, Kevin Wolf, 2022/06/09
- [PULL 01/18] block: drop unused bdrv_co_drain() API, Kevin Wolf, 2022/06/09
- Re: [PULL 00/18] Block layer patches, Richard Henderson, 2022/06/09