virtio-mem: Update state to match bitmap as soon as it's been migrated

It's cleaner and future-proof to just have other state that depends on the
bitmap state to be updated as soon as possible when restoring the bitmap.

So factor out informing RamDiscardListener into a functon and call it in
case of early migration right after we restored the bitmap.

Message-ID: <20230926185738.277351-16-david@redhat.com>
Reviewed-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Reviewed-by: Michael S. Tsirkin <mst@redhat.com>
Signed-off-by: David Hildenbrand <david@redhat.com>
This commit is contained in:
David Hildenbrand 2023-09-26 20:57:35 +02:00
parent a45171dba7
commit 884a0c20e6
1 changed files with 21 additions and 5 deletions

View File

@ -984,9 +984,8 @@ static int virtio_mem_restore_unplugged(VirtIOMEM *vmem)
virtio_mem_discard_range_cb); virtio_mem_discard_range_cb);
} }
static int virtio_mem_post_load(void *opaque, int version_id) static int virtio_mem_post_load_bitmap(VirtIOMEM *vmem)
{ {
VirtIOMEM *vmem = VIRTIO_MEM(opaque);
RamDiscardListener *rdl; RamDiscardListener *rdl;
int ret; int ret;
@ -1001,6 +1000,20 @@ static int virtio_mem_post_load(void *opaque, int version_id)
return ret; return ret;
} }
} }
return 0;
}
static int virtio_mem_post_load(void *opaque, int version_id)
{
VirtIOMEM *vmem = VIRTIO_MEM(opaque);
int ret;
if (!vmem->early_migration) {
ret = virtio_mem_post_load_bitmap(vmem);
if (ret) {
return ret;
}
}
/* /*
* If shared RAM is migrated using the file content and not using QEMU, * If shared RAM is migrated using the file content and not using QEMU,
@ -1043,7 +1056,7 @@ static int virtio_mem_post_load_early(void *opaque, int version_id)
int ret; int ret;
if (!vmem->prealloc) { if (!vmem->prealloc) {
return 0; goto post_load_bitmap;
} }
/* /*
@ -1051,7 +1064,7 @@ static int virtio_mem_post_load_early(void *opaque, int version_id)
* don't mess with preallocation and postcopy. * don't mess with preallocation and postcopy.
*/ */
if (migrate_ram_is_ignored(rb)) { if (migrate_ram_is_ignored(rb)) {
return 0; goto post_load_bitmap;
} }
/* /*
@ -1084,7 +1097,10 @@ static int virtio_mem_post_load_early(void *opaque, int version_id)
return -EBUSY; return -EBUSY;
} }
} }
return 0;
post_load_bitmap:
/* Finally, update any other state to be consistent with the new bitmap. */
return virtio_mem_post_load_bitmap(vmem);
} }
typedef struct VirtIOMEMMigSanityChecks { typedef struct VirtIOMEMMigSanityChecks {