168 lines
5.8 KiB
Diff
168 lines
5.8 KiB
Diff
From 039775f93548382ec1b98f5a6004c3eee02fbd28 Mon Sep 17 00:00:00 2001
|
|
From: Peter Krempa <pkrempa@redhat.com>
|
|
Date: Mon, 22 Feb 2021 13:35:05 -0500
|
|
Subject: [PATCH 22/54] migration: dirty-bitmap: Allow control of bitmap
|
|
persistence
|
|
|
|
RH-Author: Peter Krempa <pkrempa@redhat.com>
|
|
Message-id: <aab968e05bbfb581697573b8e42768af502f46db.1614000630.git.pkrempa@redhat.com>
|
|
Patchwork-id: 101171
|
|
O-Subject: [RHEL-AV-8.4.0 qemu-kvm PATCH 2/3] migration: dirty-bitmap: Allow control of bitmap persistence
|
|
Bugzilla: 1930757
|
|
RH-Acked-by: John Snow <jsnow@redhat.com>
|
|
RH-Acked-by: Kevin Wolf <kwolf@redhat.com>
|
|
RH-Acked-by: Eric Blake <eblake@redhat.com>
|
|
|
|
Bitmap's source persistence is transported over the migration stream and
|
|
the destination mirrors it. In some cases the destination might want to
|
|
persist bitmaps which are not persistent on the source (e.g. the result
|
|
of merging bitmaps from a number of layers on the source when migrating
|
|
into a squashed image) but currently it would need to create another set
|
|
of persistent bitmaps and merge them.
|
|
|
|
This patch adds a 'transform' property to the alias map which allows
|
|
overriding the persistence of migrated bitmaps both on the source and
|
|
destination sides.
|
|
|
|
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
|
|
Message-Id: <b20afb675917b86f6359ac3591166ac6d4233573.1613150869.git.pkrempa@redhat.com>
|
|
Reviewed-by: Eric Blake <eblake@redhat.com>
|
|
[eblake: grammar tweaks, drop dead conditional]
|
|
Signed-off-by: Eric Blake <eblake@redhat.com>
|
|
(cherry picked from commit 6e9f21a2aa8a78bc9a512a836a40c79fe50dd2b4)
|
|
|
|
https://bugzilla.redhat.com/show_bug.cgi?id=1930757
|
|
Signed-off-by: Danilo C. L. de Paula <ddepaula@redhat.com>
|
|
---
|
|
migration/block-dirty-bitmap.c | 29 ++++++++++++++++++++++++++---
|
|
qapi/migration.json | 19 ++++++++++++++++++-
|
|
2 files changed, 44 insertions(+), 4 deletions(-)
|
|
|
|
diff --git a/migration/block-dirty-bitmap.c b/migration/block-dirty-bitmap.c
|
|
index b39c13ce4e..975093610a 100644
|
|
--- a/migration/block-dirty-bitmap.c
|
|
+++ b/migration/block-dirty-bitmap.c
|
|
@@ -150,6 +150,7 @@ typedef struct DBMLoadState {
|
|
BdrvDirtyBitmap *bitmap;
|
|
|
|
bool before_vm_start_handled; /* set in dirty_bitmap_mig_before_vm_start */
|
|
+ BitmapMigrationBitmapAlias *bmap_inner;
|
|
|
|
/*
|
|
* cancelled
|
|
@@ -529,6 +530,7 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
|
|
}
|
|
|
|
FOR_EACH_DIRTY_BITMAP(bs, bitmap) {
|
|
+ BitmapMigrationBitmapAliasTransform *bitmap_transform = NULL;
|
|
bitmap_name = bdrv_dirty_bitmap_name(bitmap);
|
|
if (!bitmap_name) {
|
|
continue;
|
|
@@ -549,6 +551,9 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
|
|
}
|
|
|
|
bitmap_alias = bmap_inner->alias;
|
|
+ if (bmap_inner->has_transform) {
|
|
+ bitmap_transform = bmap_inner->transform;
|
|
+ }
|
|
} else {
|
|
if (strlen(bitmap_name) > UINT8_MAX) {
|
|
error_report("Cannot migrate bitmap '%s' on node '%s': "
|
|
@@ -574,8 +579,15 @@ static int add_bitmaps_to_list(DBMSaveState *s, BlockDriverState *bs,
|
|
if (bdrv_dirty_bitmap_enabled(bitmap)) {
|
|
dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_ENABLED;
|
|
}
|
|
- if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
|
|
- dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
|
|
+ if (bitmap_transform &&
|
|
+ bitmap_transform->has_persistent) {
|
|
+ if (bitmap_transform->persistent) {
|
|
+ dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
|
|
+ }
|
|
+ } else {
|
|
+ if (bdrv_dirty_bitmap_get_persistence(bitmap)) {
|
|
+ dbms->flags |= DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
|
|
+ }
|
|
}
|
|
|
|
QSIMPLEQ_INSERT_TAIL(&s->dbms_list, dbms, entry);
|
|
@@ -783,6 +795,7 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
|
|
uint32_t granularity = qemu_get_be32(f);
|
|
uint8_t flags = qemu_get_byte(f);
|
|
LoadBitmapState *b;
|
|
+ bool persistent;
|
|
|
|
if (s->cancelled) {
|
|
return 0;
|
|
@@ -807,7 +820,15 @@ static int dirty_bitmap_load_start(QEMUFile *f, DBMLoadState *s)
|
|
return -EINVAL;
|
|
}
|
|
|
|
- if (flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT) {
|
|
+ if (s->bmap_inner &&
|
|
+ s->bmap_inner->has_transform &&
|
|
+ s->bmap_inner->transform->has_persistent) {
|
|
+ persistent = s->bmap_inner->transform->persistent;
|
|
+ } else {
|
|
+ persistent = flags & DIRTY_BITMAP_MIG_START_FLAG_PERSISTENT;
|
|
+ }
|
|
+
|
|
+ if (persistent) {
|
|
bdrv_dirty_bitmap_set_persistence(s->bitmap, true);
|
|
}
|
|
|
|
@@ -1091,6 +1112,8 @@ static int dirty_bitmap_load_header(QEMUFile *f, DBMLoadState *s,
|
|
} else {
|
|
bitmap_name = bmap_inner->name;
|
|
}
|
|
+
|
|
+ s->bmap_inner = bmap_inner;
|
|
}
|
|
|
|
if (!s->cancelled) {
|
|
diff --git a/qapi/migration.json b/qapi/migration.json
|
|
index 3c75820527..19b796ab47 100644
|
|
--- a/qapi/migration.json
|
|
+++ b/qapi/migration.json
|
|
@@ -525,6 +525,19 @@
|
|
'data': [ 'none', 'zlib',
|
|
{ 'name': 'zstd', 'if': 'defined(CONFIG_ZSTD)' } ] }
|
|
|
|
+##
|
|
+# @BitmapMigrationBitmapAliasTransform:
|
|
+#
|
|
+# @persistent: If present, the bitmap will be made persistent
|
|
+# or transient depending on this parameter.
|
|
+#
|
|
+# Since: 6.0
|
|
+##
|
|
+{ 'struct': 'BitmapMigrationBitmapAliasTransform',
|
|
+ 'data': {
|
|
+ '*persistent': 'bool'
|
|
+ } }
|
|
+
|
|
##
|
|
# @BitmapMigrationBitmapAlias:
|
|
#
|
|
@@ -533,12 +546,16 @@
|
|
# @alias: An alias name for migration (for example the bitmap name on
|
|
# the opposite site).
|
|
#
|
|
+# @transform: Allows the modification of the migrated bitmap.
|
|
+# (since 6.0)
|
|
+#
|
|
# Since: 5.2
|
|
##
|
|
{ 'struct': 'BitmapMigrationBitmapAlias',
|
|
'data': {
|
|
'name': 'str',
|
|
- 'alias': 'str'
|
|
+ 'alias': 'str',
|
|
+ '*transform': 'BitmapMigrationBitmapAliasTransform'
|
|
} }
|
|
|
|
##
|
|
--
|
|
2.27.0
|
|
|