@samitouri / QOSamiQemu / commits / 14eb43761d

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 {