Re: [PATCH v3 2/9] igvm: track memory regions
Ani Sinha <[email protected]> Sat, 1 Aug 2026 19:57:11 +0530
| Newsgroups | org.nongnu.qemu-devel |
|---|---|
| Message-ID | <CAK3XEhPmh0jtSK=zZ5SjBzT6c_P6J7JW2B42k5cJzOK-vyOkKg@mail.gmail.com> |
On Sat, Aug 1, 2026 at 5:58 PM Ani Sinha <[email protected]> wrote: > > > > > On 31 Jul 2026, at 3:28 PM, Alexander Graf <[email protected]> wrote: > > > > > > On 30.07.26 09:12, Ani Sinha wrote: > >> From: Gerd Hoffmann <[email protected]> > >> > >> 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 <[email protected]> > >> Signed-off-by: Gerd Hoffmann <[email protected]> > >> --- > >> backends/igvm-cfg.c | 1 + > >> backends/igvm.c | 20 ++++++++++++-------- > >> include/system/igvm-internal.h | 6 ++++++ > >> 3 files changed, 19 insertions(+), 8 deletions(-) > >> > >> diff --git a/backends/igvm-cfg.c b/backends/igvm-cfg.c > >> index e1f09855f6..38438a7b1e 100644 > >> --- a/backends/igvm-cfg.c > >> +++ b/backends/igvm-cfg.c > >> @@ -65,6 +65,7 @@ static void igvm_complete(UserCreatable *uc, Error **errp) > >> IgvmCfg *igvm = IGVM_CFG(uc); > >> igvm->file = qigvm_file_init(igvm->filename, errp); > >> + QTAILQ_INIT(&igvm->memory_regions); > >> } > >> OBJECT_DEFINE_TYPE_WITH_INTERFACES(IgvmCfg, igvm_cfg, IGVM_CFG, OBJECT, > >> diff --git a/backends/igvm.c b/backends/igvm.c > >> index 534032fed8..9e7c90d386 100644 > >> --- a/backends/igvm.c > >> +++ b/backends/igvm.c > >> @@ -220,7 +220,7 @@ static void *qigvm_prepare_memory(QIgvm *ctx, uint64_t addr, uint64_t size, > >> int region_identifier, Error **errp) > >> { > >> ERRP_GUARD(); > >> - MemoryRegion *igvm_pages = NULL; > >> + IgvmMemoryRegion *imr = NULL; > >> Int128 gpa_region_size; > >> MemoryRegionSection mrs = > >> 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, > >> */ > >> g_autofree char *region_name = > >> g_strdup_printf("igvm.%X", region_identifier); > >> - igvm_pages = g_new0(MemoryRegion, 1); > >> + imr = g_new0(IgvmMemoryRegion, 1); > >> + imr->mr = g_new0(MemoryRegion, 1); > >> if (ctx->machine_state->cgs && > >> ctx->machine_state->cgs->require_guest_memfd) { > >> - if (!memory_region_init_ram_guest_memfd(igvm_pages, NULL, > >> + if (!memory_region_init_ram_guest_memfd(imr->mr, NULL, > > > > > > Please make sure to track them with owner set to OBJECT(ctx->machine_state). > > This will not work as the owner will have to be of TYPE_DEVICE not of TYPE_MACHINE. Looking closer, these memory regions are subregions of system_mmeory. system_memory is initialized with owner as NULL in memory_map_init(). memory_region_finalize() says .,, Here it is possible that the MR has: mr->container set, which means this MR is a subregion of a container MR. In this case they must share the same owner as the container (otherwise the container should have kept a refcount of this MR's owner). And then there is this assertion: /* Must share the owner; see above comments */ assert(mr->container->owner == mr->owner); So i think the owner should be NULL. I think that means we should garbage collect system_memory and its sub-regions? > > Without owner, reference counting is disabled and we end up leaking memory regions on cleanup you introduce in patch 3 later. > > > > > > Alex > >