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:
Hu Tao 2014-09-09 13:27:54 +08:00 committed by Paolo Bonzini
parent c261d774fb
commit ef701d7b6f
3 changed files with 35 additions and 14 deletions

36
exec.c
View file

@ -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)

View file

@ -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);

View file

@ -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,