From 39228250ce6cf67eb1c3799791d271f53c5c6347 Mon Sep 17 00:00:00 2001 From: Markus Armbruster Date: Wed, 31 Jul 2013 15:11:11 +0200 Subject: [PATCH] exec: Don't abort when we can't allocate guest memory MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit We abort() on memory allocation failure. abort() is appropriate for programming errors. Maybe most memory allocation failures are programming errors, maybe not. But guest memory allocation failure isn't, and aborting when the user asks for more memory than we can provide is not nice. exit(1) instead, and do it in just one place, so the error message is consistent. Tested-by: Christian Borntraeger Signed-off-by: Markus Armbruster Reviewed-by: Andreas Färber Acked-by: Laszlo Ersek Acked-by: Stefano Stabellini Acked-by: Christian Borntraeger Message-id: 1375276272-15988-8-git-send-email-armbru@redhat.com Signed-off-by: Anthony Liguori --- exec.c | 5 +++++ target-s390x/kvm.c | 6 +----- util/oslib-posix.c | 4 +--- util/oslib-win32.c | 5 +---- 4 files changed, 8 insertions(+), 12 deletions(-) diff --git a/exec.c b/exec.c index 59debc9cd8..26469120d9 100644 --- a/exec.c +++ b/exec.c @@ -1150,6 +1150,11 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host, } if (!new_block->host) { new_block->host = phys_mem_alloc(size); + if (!new_block->host) { + fprintf(stderr, "Cannot set up guest memory '%s': %s\n", + new_block->mr->name, strerror(errno)); + exit(1); + } memory_try_enable_merging(new_block->host, size); } } diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c index 0b75164ddb..4923e0a717 100644 --- a/target-s390x/kvm.c +++ b/target-s390x/kvm.c @@ -332,11 +332,7 @@ static void *legacy_s390_alloc(ram_addr_t size) mem = mmap((void *) 0x800000000ULL, size, PROT_EXEC|PROT_READ|PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0); - if (mem == MAP_FAILED) { - fprintf(stderr, "Allocating RAM failed\n"); - abort(); - } - return mem; + return mem == MAP_FAILED ? NULL : mem; } int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp) diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 3dc8b1b074..253bc3df2e 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -112,9 +112,7 @@ void *qemu_anon_ram_alloc(size_t size) size_t offset = QEMU_ALIGN_UP((uintptr_t)ptr, align) - (uintptr_t)ptr; if (ptr == MAP_FAILED) { - fprintf(stderr, "Failed to allocate %zu B: %s\n", - size, strerror(errno)); - abort(); + return NULL; } ptr += offset; diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 961fbf5e3d..983b7a2375 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -65,10 +65,7 @@ void *qemu_anon_ram_alloc(size_t size) /* FIXME: this is not exactly optimal solution since VirtualAlloc has 64Kb granularity, but at least it guarantees us that the memory is page aligned. */ - if (!size) { - abort(); - } - ptr = qemu_oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE)); + ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); trace_qemu_anon_ram_alloc(size, ptr); return ptr; }