|
|
218e99 |
From 37bd9dc61bdc4d1a295403360cb0dcab7fbb8936 Mon Sep 17 00:00:00 2001
|
|
|
218e99 |
From: Markus Armbruster <armbru@redhat.com>
|
|
|
218e99 |
Date: Wed, 18 Sep 2013 09:31:08 +0200
|
|
|
218e99 |
Subject: [PATCH 24/29] exec: Don't abort when we can't allocate guest memory
|
|
|
218e99 |
MIME-Version: 1.0
|
|
|
218e99 |
Content-Type: text/plain; charset=UTF-8
|
|
|
218e99 |
Content-Transfer-Encoding: 8bit
|
|
|
218e99 |
|
|
|
218e99 |
RH-Author: Markus Armbruster <armbru@redhat.com>
|
|
|
218e99 |
Message-id: <1379496669-22778-8-git-send-email-armbru@redhat.com>
|
|
|
218e99 |
Patchwork-id: 54425
|
|
|
218e99 |
O-Subject: [PATCH 7.0 qemu-kvm 7/8] exec: Don't abort when we can't allocate guest memory
|
|
|
218e99 |
Bugzilla: 1009328
|
|
|
218e99 |
RH-Acked-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
|
218e99 |
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
218e99 |
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
218e99 |
|
|
|
218e99 |
From: Markus Armbruster <armbru@redhat.com>
|
|
|
218e99 |
|
|
|
218e99 |
We abort() on memory allocation failure. abort() is appropriate for
|
|
|
218e99 |
programming errors. Maybe most memory allocation failures are
|
|
|
218e99 |
programming errors, maybe not. But guest memory allocation failure
|
|
|
218e99 |
isn't, and aborting when the user asks for more memory than we can
|
|
|
218e99 |
provide is not nice. exit(1) instead, and do it in just one place, so
|
|
|
218e99 |
the error message is consistent.
|
|
|
218e99 |
|
|
|
218e99 |
Tested-by: Christian Borntraeger <borntraeger@de.ibm.com>
|
|
|
218e99 |
Signed-off-by: Markus Armbruster <armbru@redhat.com>
|
|
|
218e99 |
Reviewed-by: Andreas Färber <afaerber@suse.de>
|
|
|
218e99 |
Acked-by: Laszlo Ersek <lersek@redhat.com>
|
|
|
218e99 |
Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
|
|
|
218e99 |
Acked-by: Christian Borntraeger <borntraeger@de.ibm.com>
|
|
|
218e99 |
Message-id: 1375276272-15988-8-git-send-email-armbru@redhat.com
|
|
|
218e99 |
Signed-off-by: Anthony Liguori <anthony@codemonkey.ws>
|
|
|
218e99 |
(cherry picked from commit 39228250ce6cf67eb1c3799791d271f53c5c6347)
|
|
|
218e99 |
---
|
|
|
218e99 |
exec.c | 5 +++++
|
|
|
218e99 |
target-s390x/kvm.c | 6 +-----
|
|
|
218e99 |
util/oslib-posix.c | 4 +---
|
|
|
218e99 |
util/oslib-win32.c | 5 +----
|
|
|
218e99 |
4 files changed, 8 insertions(+), 12 deletions(-)
|
|
|
218e99 |
|
|
|
218e99 |
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
|
|
|
218e99 |
---
|
|
|
218e99 |
exec.c | 5 +++++
|
|
|
218e99 |
target-s390x/kvm.c | 6 +-----
|
|
|
218e99 |
util/oslib-posix.c | 4 +---
|
|
|
218e99 |
util/oslib-win32.c | 5 +----
|
|
|
218e99 |
4 files changed, 8 insertions(+), 12 deletions(-)
|
|
|
218e99 |
|
|
|
218e99 |
diff --git a/exec.c b/exec.c
|
|
|
218e99 |
index a75c200..9117a59 100644
|
|
|
218e99 |
--- a/exec.c
|
|
|
218e99 |
+++ b/exec.c
|
|
|
218e99 |
@@ -1097,6 +1097,11 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
|
|
|
218e99 |
}
|
|
|
218e99 |
if (!new_block->host) {
|
|
|
218e99 |
new_block->host = phys_mem_alloc(size);
|
|
|
218e99 |
+ if (!new_block->host) {
|
|
|
218e99 |
+ fprintf(stderr, "Cannot set up guest memory '%s': %s\n",
|
|
|
218e99 |
+ new_block->mr->name, strerror(errno));
|
|
|
218e99 |
+ exit(1);
|
|
|
218e99 |
+ }
|
|
|
218e99 |
memory_try_enable_merging(new_block->host, size);
|
|
|
218e99 |
}
|
|
|
218e99 |
}
|
|
|
218e99 |
diff --git a/target-s390x/kvm.c b/target-s390x/kvm.c
|
|
|
218e99 |
index 0b18db4..a106e62 100644
|
|
|
218e99 |
--- a/target-s390x/kvm.c
|
|
|
218e99 |
+++ b/target-s390x/kvm.c
|
|
|
218e99 |
@@ -331,11 +331,7 @@ static void *legacy_s390_alloc(ram_addr_t size)
|
|
|
218e99 |
mem = mmap((void *) 0x800000000ULL, size,
|
|
|
218e99 |
PROT_EXEC|PROT_READ|PROT_WRITE,
|
|
|
218e99 |
MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
|
|
|
218e99 |
- if (mem == MAP_FAILED) {
|
|
|
218e99 |
- fprintf(stderr, "Allocating RAM failed\n");
|
|
|
218e99 |
- abort();
|
|
|
218e99 |
- }
|
|
|
218e99 |
- return mem;
|
|
|
218e99 |
+ return mem == MAP_FAILED ? NULL : mem;
|
|
|
218e99 |
}
|
|
|
218e99 |
|
|
|
218e99 |
int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
|
|
|
218e99 |
diff --git a/util/oslib-posix.c b/util/oslib-posix.c
|
|
|
218e99 |
index 3dc8b1b..253bc3d 100644
|
|
|
218e99 |
--- a/util/oslib-posix.c
|
|
|
218e99 |
+++ b/util/oslib-posix.c
|
|
|
218e99 |
@@ -112,9 +112,7 @@ void *qemu_anon_ram_alloc(size_t size)
|
|
|
218e99 |
size_t offset = QEMU_ALIGN_UP((uintptr_t)ptr, align) - (uintptr_t)ptr;
|
|
|
218e99 |
|
|
|
218e99 |
if (ptr == MAP_FAILED) {
|
|
|
218e99 |
- fprintf(stderr, "Failed to allocate %zu B: %s\n",
|
|
|
218e99 |
- size, strerror(errno));
|
|
|
218e99 |
- abort();
|
|
|
218e99 |
+ return NULL;
|
|
|
218e99 |
}
|
|
|
218e99 |
|
|
|
218e99 |
ptr += offset;
|
|
|
218e99 |
diff --git a/util/oslib-win32.c b/util/oslib-win32.c
|
|
|
218e99 |
index 961fbf5..983b7a2 100644
|
|
|
218e99 |
--- a/util/oslib-win32.c
|
|
|
218e99 |
+++ b/util/oslib-win32.c
|
|
|
218e99 |
@@ -65,10 +65,7 @@ void *qemu_anon_ram_alloc(size_t size)
|
|
|
218e99 |
/* FIXME: this is not exactly optimal solution since VirtualAlloc
|
|
|
218e99 |
has 64Kb granularity, but at least it guarantees us that the
|
|
|
218e99 |
memory is page aligned. */
|
|
|
218e99 |
- if (!size) {
|
|
|
218e99 |
- abort();
|
|
|
218e99 |
- }
|
|
|
218e99 |
- ptr = qemu_oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE));
|
|
|
218e99 |
+ ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
|
|
|
218e99 |
trace_qemu_anon_ram_alloc(size, ptr);
|
|
|
218e99 |
return ptr;
|
|
|
218e99 |
}
|
|
|
218e99 |
--
|
|
|
218e99 |
1.7.1
|
|
|
218e99 |
|