Hi Peter, On 3/12/21 7:28 PM, Philippe Mathieu-Daudé wrote: > From: Peter Xu <pet...@redhat.com> > > Add a bool for MR to mark whether this MR is a root MR of an AS. We bail out > asap if this MR is added as a subregion of another MR. > > Signed-off-by: Peter Xu <pet...@redhat.com> > --- > include/exec/memory.h | 1 + > softmmu/memory.c | 2 ++ > 2 files changed, 3 insertions(+) > > diff --git a/include/exec/memory.h b/include/exec/memory.h > index 54ccf1a5f09..8137ad3a9f6 100644 > --- a/include/exec/memory.h > +++ b/include/exec/memory.h > @@ -477,6 +477,7 @@ struct MemoryRegion { > bool ram_device; > bool enabled; > bool warning_printed; /* For reservations */ > + bool is_root_mr; > uint8_t vga_logging_count; > MemoryRegion *alias; > hwaddr alias_offset; > diff --git a/softmmu/memory.c b/softmmu/memory.c > index 9db47b7db6b..ce322ff3d6e 100644 > --- a/softmmu/memory.c > +++ b/softmmu/memory.c > @@ -2442,6 +2442,7 @@ static void > memory_region_add_subregion_common(MemoryRegion *mr, > MemoryRegion *subregion) > { > assert(!subregion->container); > + assert(!subregion->is_root_mr);
Not all containers have to be backed by AddressSpace. This check is too strict IMO. > subregion->container = mr; > subregion->addr = offset; > memory_region_update_container_subregions(subregion); > @@ -2819,6 +2820,7 @@ void address_space_init(AddressSpace *as, MemoryRegion > *root, const char *name) > { > memory_region_ref(root); > as->root = root; > + root->is_root_mr = true; > as->current_map = NULL; > as->ioeventfd_nb = 0; > as->ioeventfds = NULL; >