return -1 instead. Now user can add objects memory-backend-ram on-the-fly, fail it if cannot allocate memory rather than quit qemu.
Signed-off-by: Hu Tao <hu...@cn.fujitsu.com> --- backends/hostmem-ram.c | 3 +++ exec.c | 6 +++++- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/backends/hostmem-ram.c b/backends/hostmem-ram.c index d9a8290..afb305d 100644 --- a/backends/hostmem-ram.c +++ b/backends/hostmem-ram.c @@ -28,6 +28,9 @@ ram_backend_memory_alloc(HostMemoryBackend *backend, Error **errp) path = object_get_canonical_path_component(OBJECT(backend)); memory_region_init_ram(&backend->mr, OBJECT(backend), path, backend->size); + if (backend->mr.ram_addr == -1) { + error_setg(errp, "can't allocate memory"); + } g_free(path); } diff --git a/exec.c b/exec.c index 8705cc5..74560e5 100644 --- a/exec.c +++ b/exec.c @@ -1228,7 +1228,7 @@ static ram_addr_t ram_block_add(RAMBlock *new_block) if (!new_block->host) { fprintf(stderr, "Cannot set up guest memory '%s': %s\n", new_block->mr->name, strerror(errno)); - exit(1); + return -1; } memory_try_enable_merging(new_block->host, new_block->length); } @@ -1356,6 +1356,10 @@ void qemu_ram_free(ram_addr_t addr) { RAMBlock *block; + if (addr == -1) { + return; + } + /* This assumes the iothread lock is taken here too. */ qemu_mutex_lock_ramlist(); QTAILQ_FOREACH(block, &ram_list.blocks, next) { -- 1.9.3