Commit 0b183fc8 authored by Paolo Bonzini's avatar Paolo Bonzini Committed by Michael S. Tsirkin

memory: move mem_path handling to memory_region_allocate_system_memory

Like the previous patch did in exec.c, split memory_region_init_ram and
memory_region_init_ram_from_file, and push mem_path one step further up.
Other RAM regions than system memory will now be backed by regular RAM.

Also, boards that do not use memory_region_allocate_system_memory will
not support -mem-path anymore.  This can be changed before the patches
are merged by migrating boards to use the function.
Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Signed-off-by: default avatarHu Tao <hutao@cn.fujitsu.com>
Acked-by: default avatarMichael S. Tsirkin <mst@redhat.com>
Signed-off-by: default avatarMichael S. Tsirkin <mst@redhat.com>
parent 7febe36f
...@@ -1090,14 +1090,6 @@ error: ...@@ -1090,14 +1090,6 @@ error:
} }
return NULL; return NULL;
} }
#else
static void *file_ram_alloc(RAMBlock *block,
ram_addr_t memory,
const char *path)
{
fprintf(stderr, "-mem-path not supported on this host\n");
exit(1);
}
#endif #endif
static ram_addr_t find_ram_offset(ram_addr_t size) static ram_addr_t find_ram_offset(ram_addr_t size)
...@@ -1287,6 +1279,7 @@ static ram_addr_t ram_block_add(RAMBlock *new_block) ...@@ -1287,6 +1279,7 @@ static ram_addr_t ram_block_add(RAMBlock *new_block)
return new_block->offset; return new_block->offset;
} }
#ifdef __linux__
ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr, ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
const char *mem_path) const char *mem_path)
{ {
...@@ -1315,6 +1308,7 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr, ...@@ -1315,6 +1308,7 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
new_block->host = file_ram_alloc(new_block, size, mem_path); new_block->host = file_ram_alloc(new_block, size, mem_path);
return ram_block_add(new_block); return ram_block_add(new_block);
} }
#endif
ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
MemoryRegion *mr) MemoryRegion *mr)
......
...@@ -311,6 +311,24 @@ void memory_region_init_ram(MemoryRegion *mr, ...@@ -311,6 +311,24 @@ void memory_region_init_ram(MemoryRegion *mr,
const char *name, const char *name,
uint64_t size); uint64_t size);
#ifdef __linux__
/**
* memory_region_init_ram_from_file: Initialize RAM memory region with a
* mmap-ed backend.
*
* @mr: the #MemoryRegion to be initialized.
* @owner: the object that tracks the region's reference count
* @name: the name of the region.
* @size: size of the region.
* @path: the path in which to allocate the RAM.
*/
void memory_region_init_ram_from_file(MemoryRegion *mr,
struct Object *owner,
const char *name,
uint64_t size,
const char *path);
#endif
/** /**
* memory_region_init_ram_ptr: Initialize RAM memory region from a * memory_region_init_ram_ptr: Initialize RAM memory region from a
* user-provided pointer. Accesses into the * user-provided pointer. Accesses into the
......
...@@ -1030,13 +1030,24 @@ void memory_region_init_ram(MemoryRegion *mr, ...@@ -1030,13 +1030,24 @@ void memory_region_init_ram(MemoryRegion *mr,
mr->ram = true; mr->ram = true;
mr->terminates = true; mr->terminates = true;
mr->destructor = memory_region_destructor_ram; mr->destructor = memory_region_destructor_ram;
if (mem_path) { mr->ram_addr = qemu_ram_alloc(size, mr);
mr->ram_addr = qemu_ram_alloc_from_file(size, mr, mem_path);
} else {
mr->ram_addr = qemu_ram_alloc(size, mr);
}
} }
#ifdef __linux__
void memory_region_init_ram_from_file(MemoryRegion *mr,
struct Object *owner,
const char *name,
uint64_t size,
const char *path)
{
memory_region_init(mr, owner, name, size);
mr->ram = true;
mr->terminates = true;
mr->destructor = memory_region_destructor_ram;
mr->ram_addr = qemu_ram_alloc_from_file(size, mr, path);
}
#endif
void memory_region_init_ram_ptr(MemoryRegion *mr, void memory_region_init_ram_ptr(MemoryRegion *mr,
Object *owner, Object *owner,
const char *name, const char *name,
......
...@@ -228,7 +228,16 @@ static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner, ...@@ -228,7 +228,16 @@ static void allocate_system_memory_nonnuma(MemoryRegion *mr, Object *owner,
const char *name, const char *name,
uint64_t ram_size) uint64_t ram_size)
{ {
memory_region_init_ram(mr, owner, name, ram_size); if (mem_path) {
#ifdef __linux__
memory_region_init_ram_from_file(mr, owner, name, ram_size, mem_path);
#else
fprintf(stderr, "-mem-path not supported on this host\n");
exit(1);
#endif
} else {
memory_region_init_ram(mr, owner, name, ram_size);
}
vmstate_register_ram_global(mr); vmstate_register_ram_global(mr);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment