mirror of
https://github.com/qemu/qemu.git
synced 2026-04-05 22:00:58 +00:00
memory: Set mr->ram before RAM Block allocation
Commit2fb627ef2f("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 <farrah.chen@intel.com> Link: https://lore.kernel.org/r/df63fdf0-05ea-4de0-8009-c52703e4b052@amd.com Reported-by: Kim Phillips <kim.phillips@amd.com> Fixes:2fb627ef2f("memory: Factor out common ram region initialization") Signed-off-by: Xiaoyao Li <xiaoyao.li@intel.com> Tested-by: Kim Phillips <kim.phillips@amd.com> Link: https://lore.kernel.org/r/20260312063420.973637-1-xiaoyao.li@intel.com Signed-off-by: Peter Xu <peterx@redhat.com>
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user