From 39994f0bf9333497746f1eff13683ade03dcc09f Mon Sep 17 00:00:00 2001 Message-Id: <39994f0bf9333497746f1eff13683ade03dcc09f.1429902956.git.jen@redhat.com> In-Reply-To: <67968bc615637394c3ef7dfefa360dab90f33d5d.1429902956.git.jen@redhat.com> References: <67968bc615637394c3ef7dfefa360dab90f33d5d.1429902956.git.jen@redhat.com> From: Max Reitz Date: Wed, 18 Mar 2015 19:21:53 -0500 Subject: [CHANGE 10/42] block: Introduce qemu_try_blockalign() To: rhvirt-patches@redhat.com, jen@redhat.com RH-Author: Max Reitz Message-id: <1426706542-30384-11-git-send-email-mreitz@redhat.com> Patchwork-id: 64474 O-Subject: [RHEL-6.7 qemu-kvm PATCH v2 10/39] block: Introduce qemu_try_blockalign() Bugzilla: 1129892 RH-Acked-by: Jeffrey Cody RH-Acked-by: Kevin Wolf RH-Acked-by: Stefan Hajnoczi From: Kevin Wolf BZ: 1129892 This function returns NULL instead of aborting when an allocation fails. Signed-off-by: Kevin Wolf Reviewed-by: Benoit Canet (cherry picked from commit 7d2a35cc921ea4832083a7e8598461868bb538ce) Signed-off-by: Jeff E. Nelson Conflicts: include/block/block.h block_int.h include/qemu/osdep.h osdep.h util/oslib-posix.c util/oslib-win32.c osdep.c Different files upstream and downstream; dropped the #ifdef around the definition of oom_check() (because after this patch there is no case where it would be unused). Signed-off-by: Max Reitz Signed-off-by: Jeff E. Nelson --- block.c | 13 +++++++++++++ block_int.h | 1 + osdep.c | 22 ++++++++++++---------- osdep.h | 1 + 4 files changed, 27 insertions(+), 10 deletions(-) diff --git a/block.c b/block.c index 6c14a9d..dcc6d26 100644 --- a/block.c +++ b/block.c @@ -4360,6 +4360,19 @@ void *qemu_blockalign(BlockDriverState *bs, size_t size) return qemu_memalign((bs && bs->buffer_alignment) ? bs->buffer_alignment : 512, size); } +void *qemu_try_blockalign(BlockDriverState *bs, size_t size) +{ + size_t align = (bs && bs->buffer_alignment) ? bs->buffer_alignment : 512; + + /* Ensure that NULL is never returned on success */ + assert(align > 0); + if (size == 0) { + size = align; + } + + return qemu_try_memalign(align, size); +} + /* * Check if all memory in this vector is sector aligned. */ diff --git a/block_int.h b/block_int.h index 6b650d5..7587bb8 100644 --- a/block_int.h +++ b/block_int.h @@ -309,6 +309,7 @@ struct BlockDriverState { int get_tmp_filename(char *filename, int size); void *qemu_blockalign(BlockDriverState *bs, size_t size); +void *qemu_try_blockalign(BlockDriverState *bs, size_t size); void bdrv_set_io_limits(BlockDriverState *bs, ThrottleConfig *cfg); diff --git a/osdep.c b/osdep.c index afab41e..6cfdcfe 100644 --- a/osdep.c +++ b/osdep.c @@ -57,7 +57,6 @@ static bool fips_enabled = false; -#if !defined(_POSIX_C_SOURCE) || defined(_WIN32) || defined(__sun__) static void *oom_check(void *ptr) { if (ptr == NULL) { @@ -70,17 +69,16 @@ static void *oom_check(void *ptr) } return ptr; } -#endif #if defined(_WIN32) -void *qemu_memalign(size_t alignment, size_t size) +void *qemu_try_memalign(size_t alignment, size_t size) { void *ptr; if (!size) { abort(); } - ptr = oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE)); + ptr = VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); trace_qemu_memalign(alignment, size, ptr); return ptr; } @@ -108,21 +106,20 @@ void qemu_vfree(void *ptr) #else -void *qemu_memalign(size_t alignment, size_t size) +void *qemu_try_memalign(size_t alignment, size_t size) { void *ptr; #if defined(_POSIX_C_SOURCE) && !defined(__sun__) int ret; ret = posix_memalign(&ptr, alignment, size); if (ret != 0) { - fprintf(stderr, "Failed to allocate %zu B: %s\n", - size, strerror(ret)); - abort(); + errno = ret; + ptr = NULL; } #elif defined(CONFIG_BSD) - ptr = oom_check(valloc(size)); + ptr = valloc(size); #else - ptr = oom_check(memalign(alignment, size)); + ptr = memalign(alignment, size); #endif trace_qemu_memalign(alignment, size, ptr); return ptr; @@ -149,6 +146,11 @@ void qemu_vfree(void *ptr) #endif +void *qemu_memalign(size_t alignment, size_t size) +{ + return oom_check(qemu_try_memalign(alignment, size)); +} + int qemu_create_pidfile(const char *filename) { char buffer[128]; diff --git a/osdep.h b/osdep.h index 3122134..33fae6c 100644 --- a/osdep.h +++ b/osdep.h @@ -99,6 +99,7 @@ #define MADV_DONTDUMP 16 #endif +void *qemu_try_memalign(size_t alignment, size_t size); void *qemu_memalign(size_t alignment, size_t size); void *qemu_vmalloc(size_t size); void qemu_vfree(void *ptr); -- 2.1.0