On 26.09.2023 20:57, David Hildenbrand wrote:
> 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.
>
> Signed-off-by: David Hildenbrand <david@redhat.com>
> ---
> hw/virtio/virtio-mem.c | 26 +++++++++++++++++++++-----
> 1 file changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/hw/virtio/virtio-mem.c b/hw/virtio/virtio-mem.c
> index 0b0e6c5090..0cf47df9cf 100644
> --- a/hw/virtio/virtio-mem.c
> +++ b/hw/virtio/virtio-mem.c
> @@ -984,9 +984,8 @@ static int virtio_mem_restore_unplugged(VirtIOMEM *vmem)
> 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;
> int ret;
>
> @@ -1001,6 +1000,20 @@ static int virtio_mem_post_load(void *opaque, int version_id)
> 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,
> @@ -1043,7 +1056,7 @@ static int virtio_mem_post_load_early(void *opaque, int version_id)
> int ret;
>
> 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.
> */
> 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 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 {
Reviewed-by: Maciej S. Szmigiero <maciej.szmigiero@oracle.com>
Thanks,
Maciej