exec: Don't abort when we can't allocate guest memory
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 <borntraeger@de.ibm.com> Signed-off-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Andreas Färber <afaerber@suse.de> Acked-by: Laszlo Ersek <lersek@redhat.com> Acked-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com> Acked-by: Christian Borntraeger <borntraeger@de.ibm.com> Message-id: 1375276272-15988-8-git-send-email-armbru@redhat.com Signed-off-by: Anthony Liguori <anthony@codemonkey.ws>
This commit is contained in:
parent
e1e84ba050
commit
39228250ce
5
exec.c
5
exec.c
@ -1150,6 +1150,11 @@ ram_addr_t qemu_ram_alloc_from_ptr(ram_addr_t size, void *host,
|
|||||||
}
|
}
|
||||||
if (!new_block->host) {
|
if (!new_block->host) {
|
||||||
new_block->host = phys_mem_alloc(size);
|
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);
|
memory_try_enable_merging(new_block->host, size);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -332,11 +332,7 @@ static void *legacy_s390_alloc(ram_addr_t size)
|
|||||||
mem = mmap((void *) 0x800000000ULL, size,
|
mem = mmap((void *) 0x800000000ULL, size,
|
||||||
PROT_EXEC|PROT_READ|PROT_WRITE,
|
PROT_EXEC|PROT_READ|PROT_WRITE,
|
||||||
MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
|
MAP_SHARED | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
|
||||||
if (mem == MAP_FAILED) {
|
return mem == MAP_FAILED ? NULL : mem;
|
||||||
fprintf(stderr, "Allocating RAM failed\n");
|
|
||||||
abort();
|
|
||||||
}
|
|
||||||
return mem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
|
int kvm_arch_insert_sw_breakpoint(CPUState *cs, struct kvm_sw_breakpoint *bp)
|
||||||
|
@ -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;
|
size_t offset = QEMU_ALIGN_UP((uintptr_t)ptr, align) - (uintptr_t)ptr;
|
||||||
|
|
||||||
if (ptr == MAP_FAILED) {
|
if (ptr == MAP_FAILED) {
|
||||||
fprintf(stderr, "Failed to allocate %zu B: %s\n",
|
return NULL;
|
||||||
size, strerror(errno));
|
|
||||||
abort();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr += offset;
|
ptr += offset;
|
||||||
|
@ -65,10 +65,7 @@ void *qemu_anon_ram_alloc(size_t size)
|
|||||||
/* FIXME: this is not exactly optimal solution since VirtualAlloc
|
/* FIXME: this is not exactly optimal solution since VirtualAlloc
|
||||||
has 64Kb granularity, but at least it guarantees us that the
|
has 64Kb granularity, but at least it guarantees us that the
|
||||||
memory is page aligned. */
|
memory is page aligned. */
|
||||||
if (!size) {
|
ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE);
|
||||||
abort();
|
|
||||||
}
|
|
||||||
ptr = qemu_oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE));
|
|
||||||
trace_qemu_anon_ram_alloc(size, ptr);
|
trace_qemu_anon_ram_alloc(size, ptr);
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user