mirror of https://github.com/xqemu/xqemu.git
exec: add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr
Add parameter errp to qemu_ram_alloc and qemu_ram_alloc_from_ptr so that we can handle errors. Signed-off-by: Hu Tao <hutao@cn.fujitsu.com> Reviewed-by: Peter Crosthwaite <peter.crosthwaite@xilinx.com> [Assert ptr != NULL in memory_region_init_ram_ptr. - Paolo] Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
c261d774fb
commit
ef701d7b6f
36
exec.c
36
exec.c
|
@ -1259,7 +1259,7 @@ static int memory_try_enable_merging(void *addr, size_t len)
|
||||||
return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);
|
return qemu_madvise(addr, len, QEMU_MADV_MERGEABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ram_addr_t ram_block_add(RAMBlock *new_block)
|
static ram_addr_t ram_block_add(RAMBlock *new_block, Error **errp)
|
||||||
{
|
{
|
||||||
RAMBlock *block;
|
RAMBlock *block;
|
||||||
ram_addr_t old_ram_size, new_ram_size;
|
ram_addr_t old_ram_size, new_ram_size;
|
||||||
|
@ -1276,9 +1276,11 @@ static ram_addr_t ram_block_add(RAMBlock *new_block)
|
||||||
} else {
|
} else {
|
||||||
new_block->host = phys_mem_alloc(new_block->length);
|
new_block->host = phys_mem_alloc(new_block->length);
|
||||||
if (!new_block->host) {
|
if (!new_block->host) {
|
||||||
fprintf(stderr, "Cannot set up guest memory '%s': %s\n",
|
error_setg_errno(errp, errno,
|
||||||
memory_region_name(new_block->mr), strerror(errno));
|
"cannot set up guest memory '%s'",
|
||||||
exit(1);
|
memory_region_name(new_block->mr));
|
||||||
|
qemu_mutex_unlock_ramlist();
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
memory_try_enable_merging(new_block->host, new_block->length);
|
memory_try_enable_merging(new_block->host, new_block->length);
|
||||||
}
|
}
|
||||||
|
@ -1329,6 +1331,8 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
|
||||||
Error **errp)
|
Error **errp)
|
||||||
{
|
{
|
||||||
RAMBlock *new_block;
|
RAMBlock *new_block;
|
||||||
|
ram_addr_t addr;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
if (xen_enabled()) {
|
if (xen_enabled()) {
|
||||||
error_setg(errp, "-mem-path not supported with Xen");
|
error_setg(errp, "-mem-path not supported with Xen");
|
||||||
|
@ -1358,14 +1362,22 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return ram_block_add(new_block);
|
addr = ram_block_add(new_block, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
g_free(new_block);
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return addr;
|
||||||
}
|
}
|
||||||
#endif
|
#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, Error **errp)
|
||||||
{
|
{
|
||||||
RAMBlock *new_block;
|
RAMBlock *new_block;
|
||||||
|
ram_addr_t addr;
|
||||||
|
Error *local_err = NULL;
|
||||||
|
|
||||||
size = TARGET_PAGE_ALIGN(size);
|
size = TARGET_PAGE_ALIGN(size);
|
||||||
new_block = g_malloc0(sizeof(*new_block));
|
new_block = g_malloc0(sizeof(*new_block));
|
||||||
|
@ -1376,12 +1388,18 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
|
||||||
if (host) {
|
if (host) {
|
||||||
new_block->flags |= RAM_PREALLOC;
|
new_block->flags |= RAM_PREALLOC;
|
||||||
}
|
}
|
||||||
return ram_block_add(new_block);
|
addr = ram_block_add(new_block, &local_err);
|
||||||
|
if (local_err) {
|
||||||
|
g_free(new_block);
|
||||||
|
error_propagate(errp, local_err);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr)
|
ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp)
|
||||||
{
|
{
|
||||||
return qemu_ram_alloc_from_ptr(size, NULL, mr);
|
return qemu_ram_alloc_from_ptr(size, NULL, mr, errp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qemu_ram_free_from_ptr(ram_addr_t addr)
|
void qemu_ram_free_from_ptr(ram_addr_t addr)
|
||||||
|
|
|
@ -26,8 +26,8 @@ ram_addr_t qemu_ram_alloc_from_file(ram_addr_t size, MemoryRegion *mr,
|
||||||
bool share, const char *mem_path,
|
bool share, const char *mem_path,
|
||||||
Error **errp);
|
Error **errp);
|
||||||
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, Error **errp);
|
||||||
ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr);
|
ram_addr_t qemu_ram_alloc(ram_addr_t size, MemoryRegion *mr, Error **errp);
|
||||||
int qemu_get_ram_fd(ram_addr_t addr);
|
int qemu_get_ram_fd(ram_addr_t addr);
|
||||||
void *qemu_get_ram_block_host_ptr(ram_addr_t addr);
|
void *qemu_get_ram_block_host_ptr(ram_addr_t addr);
|
||||||
void *qemu_get_ram_ptr(ram_addr_t addr);
|
void *qemu_get_ram_ptr(ram_addr_t addr);
|
||||||
|
|
9
memory.c
9
memory.c
|
@ -1148,7 +1148,7 @@ 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;
|
||||||
mr->ram_addr = qemu_ram_alloc(size, mr);
|
mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __linux__
|
#ifdef __linux__
|
||||||
|
@ -1178,7 +1178,10 @@ void memory_region_init_ram_ptr(MemoryRegion *mr,
|
||||||
mr->ram = true;
|
mr->ram = true;
|
||||||
mr->terminates = true;
|
mr->terminates = true;
|
||||||
mr->destructor = memory_region_destructor_ram_from_ptr;
|
mr->destructor = memory_region_destructor_ram_from_ptr;
|
||||||
mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr);
|
|
||||||
|
/* qemu_ram_alloc_from_ptr cannot fail with ptr != NULL. */
|
||||||
|
assert(ptr != NULL);
|
||||||
|
mr->ram_addr = qemu_ram_alloc_from_ptr(size, ptr, mr, &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
void memory_region_init_alias(MemoryRegion *mr,
|
void memory_region_init_alias(MemoryRegion *mr,
|
||||||
|
@ -1208,7 +1211,7 @@ void memory_region_init_rom_device(MemoryRegion *mr,
|
||||||
mr->terminates = true;
|
mr->terminates = true;
|
||||||
mr->rom_device = true;
|
mr->rom_device = true;
|
||||||
mr->destructor = memory_region_destructor_rom_device;
|
mr->destructor = memory_region_destructor_rom_device;
|
||||||
mr->ram_addr = qemu_ram_alloc(size, mr);
|
mr->ram_addr = qemu_ram_alloc(size, mr, &error_abort);
|
||||||
}
|
}
|
||||||
|
|
||||||
void memory_region_init_iommu(MemoryRegion *mr,
|
void memory_region_init_iommu(MemoryRegion *mr,
|
||||||
|
|
Loading…
Reference in New Issue