Commit 2fb627ef2f48 ("memory: Factor out common ram region initialization")
introduced a helper function memory_region_set_ram_block(), which causes
mr->ram to be set to true after the RAM Block allocation by
qemu_ram_alloc_*().It leads to the assertion g_assert(memory_region_is_ram(mr)); in memory_region_set_ram_discard_manager() being triggered when creating RAM Block with the RAM_GUEST_MEMFD flag. Fix this by restoring the original behavior of setting mr->ram before RAM Block allocation. Closes: https://gitlab.com/qemu-project/qemu/-/work_items/3330 Reported-by: Farrah Chen <[email protected]> Fixes: 2fb627ef2f48 ("memory: Factor out common ram region initialization") Signed-off-by: Xiaoyao Li <[email protected]> --- system/memory.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/system/memory.c b/system/memory.c index 17a7bcd9af7c..56f3225b21ad 100644 --- a/system/memory.c +++ b/system/memory.c @@ -1578,7 +1578,6 @@ void memory_region_init_io(MemoryRegion *mr, Object *owner, static bool memory_region_set_ram_block(MemoryRegion *mr, RAMBlock *rb) { - mr->ram = true; mr->terminates = true; mr->destructor = memory_region_destructor_ram; mr->ram_block = rb; @@ -1597,6 +1596,7 @@ bool memory_region_init_ram_flags_nomigrate(MemoryRegion *mr, Object *owner, RAMBlock *rb; memory_region_init(mr, owner, name, size); + mr->ram = true; rb = qemu_ram_alloc(size, ram_flags, mr, errp); return memory_region_set_ram_block(mr, rb); } @@ -1614,6 +1614,7 @@ bool memory_region_init_resizeable_ram(MemoryRegion *mr, RAMBlock *rb; memory_region_init(mr, owner, name, size); + mr->ram = true; rb = qemu_ram_alloc_resizeable(size, max_size, resized, mr, errp); return memory_region_set_ram_block(mr, rb); } @@ -1628,6 +1629,7 @@ bool memory_region_init_ram_from_file(MemoryRegion *mr, Object *owner, RAMBlock *rb; memory_region_init(mr, owner, name, size); + mr->ram = true; mr->readonly = !!(ram_flags & RAM_READONLY); mr->align = align; rb = qemu_ram_alloc_from_file(size, mr, ram_flags, path, offset, errp); @@ -1642,6 +1644,7 @@ bool memory_region_init_ram_from_fd(MemoryRegion *mr, Object *owner, RAMBlock *rb; memory_region_init(mr, owner, name, size); + mr->ram = true; mr->readonly = !!(ram_flags & RAM_READONLY); rb = qemu_ram_alloc_from_fd(size, size, NULL, mr, ram_flags, fd, offset, false, errp); @@ -1663,6 +1666,7 @@ void memory_region_init_ram_ptr(MemoryRegion *mr, Object *owner, void *ptr) { memory_region_init(mr, owner, name, size); + mr->ram = true; memory_region_set_ram_ptr(mr, size, ptr); } @@ -1671,6 +1675,7 @@ void memory_region_init_ram_device_ptr(MemoryRegion *mr, Object *owner, void *ptr) { memory_region_init_io(mr, owner, &ram_device_mem_ops, mr, name, size); + mr->ram = true; mr->ram_device = true; memory_region_set_ram_ptr(mr, size, ptr); } @@ -3699,7 +3704,6 @@ bool memory_region_init_rom_device(MemoryRegion *mr, Object *owner, memory_region_init_io(mr, owner, ops, opaque, name, size); rb = qemu_ram_alloc(size, 0, mr, errp); if (memory_region_set_ram_block(mr, rb)) { - mr->ram = false; mr->rom_device = true; memory_region_register_ram(mr, owner); return true; -- 2.43.0
