igvm: track memory regions
Memory regions added by the current IGVM needs to be tracked so that they can be freed when a new IGVM is loaded. Reviewed-by: Ani Sinha <anisinha@redhat.com> Reviewed-by: Alexander Graf <graf@amazon.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com> Message-ID: <20260817142010.80693-3-anisinha@redhat.com> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Gerd Hoffmann committed
Aug 17, 2026 at 19:49 UTC
14eb43761dc2d732f8f86b051f31323f1cf1fd80
3 files changed
+19
-8
backends/igvm-cfg.c
+1
@@ -65,6 +65,7 @@ static void igvm_complete(UserCreatable *uc, Error **errp)
65
IgvmCfg *igvm = IGVM_CFG(uc);
66
67
igvm->file = qigvm_file_init(igvm->filename, errp);
68
+ QTAILQ_INIT(&igvm->memory_regions);
69
}
70
71
OBJECT_DEFINE_TYPE_WITH_INTERFACES(IgvmCfg, igvm_cfg, IGVM_CFG, OBJECT,
backends/igvm.c
+12
-8
@@ -220,7 +220,7 @@ static void *qigvm_prepare_memory(QIgvm *ctx, uint64_t addr, uint64_t size,
220
int region_identifier, Error **errp)
221
{
222
ERRP_GUARD();
223
- MemoryRegion *igvm_pages = NULL;
223
+ IgvmMemoryRegion *imr = NULL;
224
Int128 gpa_region_size;
225
MemoryRegionSection mrs =
226
memory_region_find(get_system_memory(), addr, size);
@@ -254,23 +254,27 @@ static void *qigvm_prepare_memory(QIgvm *ctx, uint64_t addr, uint64_t size,
254
*/
255
g_autofree char *region_name =
256
g_strdup_printf("igvm.%X", region_identifier);
257
- igvm_pages = g_new0(MemoryRegion, 1);
257
+ imr = g_new0(IgvmMemoryRegion, 1);
258
+ imr->mr = g_new0(MemoryRegion, 1);
259
if (ctx->machine_state->cgs &&
260
ctx->machine_state->cgs->require_guest_memfd) {
260
- if (!memory_region_init_ram_guest_memfd(igvm_pages, NULL,
261
+ if (!memory_region_init_ram_guest_memfd(imr->mr, NULL,
262
region_name, size, errp)) {
262
- g_free(igvm_pages);
263
+ g_free(imr->mr);
264
+ g_free(imr);
265
return NULL;
266
}
267
} else {
266
- if (!memory_region_init_ram(igvm_pages, NULL, region_name, size,
268
+ if (!memory_region_init_ram(imr->mr, NULL, region_name, size,
269
errp)) {
268
- g_free(igvm_pages);
270
+ g_free(imr->mr);
271
+ g_free(imr);
272
return NULL;
273
}
274
}
272
- memory_region_add_subregion(get_system_memory(), addr, igvm_pages);
273
- return memory_region_get_ram_ptr(igvm_pages);
275
+ memory_region_add_subregion(get_system_memory(), addr, imr->mr);
276
+ QTAILQ_INSERT_TAIL(&ctx->cfg->memory_regions, imr, next);
277
+ return memory_region_get_ram_ptr(imr->mr);
278
}
279
}
280
include/system/igvm-internal.h
+6
@@ -18,6 +18,11 @@
18
#include "system/confidential-guest-support.h"
19
#include <igvm/igvm.h>
20
21
+typedef struct IgvmMemoryRegion {
22
+ QTAILQ_ENTRY(IgvmMemoryRegion) next;
23
+ MemoryRegion *mr;
24
+} IgvmMemoryRegion;
25
+
26
struct IgvmCfg {
27
Object parent_obj;
28
@@ -29,6 +34,7 @@ struct IgvmCfg {
34
char *filename;
35
IgvmHandle file;
36
ResettableState reset_state;
37
+ QTAILQ_HEAD(, IgvmMemoryRegion) memory_regions;
38
};
39
40
typedef struct QIgvmParameterData {