igvm: cleanup memory regions
This change cleans up existing memory regions that were created by the current IGVM. The cleanup would be necessary when a new IGVM is loaded. This cleanup function is called in a subsequent patch. Reviewed-by: Alexander Graf <graf@amazon.com> Tested-by: Ani Sinha <anisinha@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-ID: <20260817142010.80693-4-anisinha@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Gerd Hoffmann committed
Aug 17, 2026 at 19:49 UTC
94cfb5afe77858536265c957f47d10d85d75908c
3 files changed
+22
backends/igvm-cfg.c
+2
@@ -52,6 +52,8 @@ static void igvm_reset_hold(Object *obj, ResetType type)
52
53
trace_igvm_reset_hold(type);
54
55
+ /* cleanup existing memory regions first */
56
+ qigvm_cleanup_memory(igvm);
57
qigvm_process_file(igvm, ms, false, &error_fatal);
58
}
59
backends/igvm.c
+19
@@ -14,6 +14,7 @@
14
#include "qapi/error.h"
15
#include "qemu/error-report.h"
16
#include "qemu/target-info-qapi.h"
17
+#include "migration/vmstate.h"
18
#include "system/igvm.h"
19
#include "system/igvm-cfg.h"
20
#include "system/igvm-internal.h"
@@ -1109,3 +1110,21 @@ cleanup_parameters:
1110
cleanup:
1111
return retval;
1112
}
1113
+
1114
+/*
1115
+ * cleanup any memory regions created by qigvm_prepare_memory()
1116
+ */
1117
+void qigvm_cleanup_memory(IgvmCfg *cfg)
1118
+{
1119
+ IgvmMemoryRegion *imr, *tmp;
1120
+
1121
+ QTAILQ_FOREACH_SAFE(imr, &cfg->memory_regions, next, tmp)
1122
+ {
1123
+ memory_region_del_subregion(get_system_memory(), imr->mr);
1124
+ vmstate_unregister_ram(imr->mr, NULL);
1125
+ QTAILQ_REMOVE(&cfg->memory_regions, imr, next);
1126
+ /* this triggers MemoryRegion cleanup */
1127
+ object_unparent(OBJECT(imr->mr));
1128
+ g_free(imr);
1129
+ }
1130
+}
include/system/igvm.h
+1
@@ -20,6 +20,7 @@ typedef struct QIgvm QIgvm;
20
21
int qigvm_process_file(IgvmCfg *igvm, MachineState *machine_state,
22
bool onlyVpContext, Error **errp);
23
+void qigvm_cleanup_memory(IgvmCfg *igvm);
24
25
/* x86 native */
26
int qigvm_x86_get_mem_map_entry(int index,