Message ID | 1401801062-9154-2-git-send-email-kwolf@redhat.com |
---|---|
State | New |
Headers | show |
On 06/03/2014 07:10 AM, Kevin Wolf wrote: > This function returns NULL instead of aborting when an allocation fails. > > Signed-off-by: Kevin Wolf <kwolf@redhat.com> > --- > block.c | 13 +++++++++++++ > include/block/block.h | 1 + > include/qemu/osdep.h | 1 + > util/oslib-posix.c | 16 ++++++++++------ > util/oslib-win32.c | 9 +++++++-- > 5 files changed, 32 insertions(+), 8 deletions(-) Reviewed-by: Eric Blake <eblake@redhat.com>
The Tuesday 03 Jun 2014 à 15:10:42 (+0200), Kevin Wolf wrote : > This function returns NULL instead of aborting when an allocation fails. > > Signed-off-by: Kevin Wolf <kwolf@redhat.com> > --- > block.c | 13 +++++++++++++ > include/block/block.h | 1 + > include/qemu/osdep.h | 1 + > util/oslib-posix.c | 16 ++++++++++------ > util/oslib-win32.c | 9 +++++++-- > 5 files changed, 32 insertions(+), 8 deletions(-) > > diff --git a/block.c b/block.c > index 310ea89..6179796 100644 > --- a/block.c > +++ b/block.c > @@ -5223,6 +5223,19 @@ void *qemu_blockalign(BlockDriverState *bs, size_t size) > return qemu_memalign(bdrv_opt_mem_align(bs), size); > } > > +void *qemu_try_blockalign(BlockDriverState *bs, size_t size) > +{ > + size_t align = bdrv_opt_mem_align(bs); > + > + /* 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/include/block/block.h b/include/block/block.h > index faee3aa..c895e92 100644 > --- a/include/block/block.h > +++ b/include/block/block.h > @@ -453,6 +453,7 @@ void bdrv_img_create(const char *filename, const char *fmt, > size_t bdrv_opt_mem_align(BlockDriverState *bs); > void bdrv_set_guest_block_size(BlockDriverState *bs, int align); > void *qemu_blockalign(BlockDriverState *bs, size_t size); > +void *qemu_try_blockalign(BlockDriverState *bs, size_t size); > bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov); > > struct HBitmapIter; > diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h > index ffb2966..b0e3053 100644 > --- a/include/qemu/osdep.h > +++ b/include/qemu/osdep.h > @@ -95,6 +95,7 @@ typedef signed int int_fast16_t; > #define qemu_printf printf > > int qemu_daemon(int nochdir, int noclose); > +void *qemu_try_memalign(size_t alignment, size_t size); > void *qemu_memalign(size_t alignment, size_t size); > void *qemu_anon_ram_alloc(size_t size); > void qemu_vfree(void *ptr); > diff --git a/util/oslib-posix.c b/util/oslib-posix.c > index 8e9c770..16e6200 100644 > --- a/util/oslib-posix.c > +++ b/util/oslib-posix.c > @@ -90,7 +90,7 @@ void *qemu_oom_check(void *ptr) > return ptr; > } > > -void *qemu_memalign(size_t alignment, size_t size) > +void *qemu_try_memalign(size_t alignment, size_t size) > { > void *ptr; > > @@ -102,19 +102,23 @@ void *qemu_memalign(size_t alignment, size_t size) > 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 = qemu_oom_check(valloc(size)); > + ptr = valloc(size); > #else > - ptr = qemu_oom_check(memalign(alignment, size)); > + ptr = memalign(alignment, size); > #endif > trace_qemu_memalign(alignment, size, ptr); > return ptr; > } > > +void *qemu_memalign(size_t alignment, size_t size) > +{ > + return qemu_oom_check(qemu_try_memalign(alignment, size)); > +} > + > /* alloc shared memory pages */ > void *qemu_anon_ram_alloc(size_t size) > { > diff --git a/util/oslib-win32.c b/util/oslib-win32.c > index 69552f7..ddc823e 100644 > --- a/util/oslib-win32.c > +++ b/util/oslib-win32.c > @@ -46,18 +46,23 @@ void *qemu_oom_check(void *ptr) > return ptr; > } > > -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 = qemu_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; > } > > +void *qemu_memalign(size_t alignment, size_t size) > +{ > + return qemu_oom_check(qemu_try_memalign(alignment, size)); > +} > + > void *qemu_anon_ram_alloc(size_t size) > { > void *ptr; > -- > 1.8.3.1 > Definitively simpler to use. Reviewed-by: Benoit Canet <benoit@irqsave.net>
diff --git a/block.c b/block.c index 310ea89..6179796 100644 --- a/block.c +++ b/block.c @@ -5223,6 +5223,19 @@ void *qemu_blockalign(BlockDriverState *bs, size_t size) return qemu_memalign(bdrv_opt_mem_align(bs), size); } +void *qemu_try_blockalign(BlockDriverState *bs, size_t size) +{ + size_t align = bdrv_opt_mem_align(bs); + + /* 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/include/block/block.h b/include/block/block.h index faee3aa..c895e92 100644 --- a/include/block/block.h +++ b/include/block/block.h @@ -453,6 +453,7 @@ void bdrv_img_create(const char *filename, const char *fmt, size_t bdrv_opt_mem_align(BlockDriverState *bs); void bdrv_set_guest_block_size(BlockDriverState *bs, int align); void *qemu_blockalign(BlockDriverState *bs, size_t size); +void *qemu_try_blockalign(BlockDriverState *bs, size_t size); bool bdrv_qiov_is_aligned(BlockDriverState *bs, QEMUIOVector *qiov); struct HBitmapIter; diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h index ffb2966..b0e3053 100644 --- a/include/qemu/osdep.h +++ b/include/qemu/osdep.h @@ -95,6 +95,7 @@ typedef signed int int_fast16_t; #define qemu_printf printf int qemu_daemon(int nochdir, int noclose); +void *qemu_try_memalign(size_t alignment, size_t size); void *qemu_memalign(size_t alignment, size_t size); void *qemu_anon_ram_alloc(size_t size); void qemu_vfree(void *ptr); diff --git a/util/oslib-posix.c b/util/oslib-posix.c index 8e9c770..16e6200 100644 --- a/util/oslib-posix.c +++ b/util/oslib-posix.c @@ -90,7 +90,7 @@ void *qemu_oom_check(void *ptr) return ptr; } -void *qemu_memalign(size_t alignment, size_t size) +void *qemu_try_memalign(size_t alignment, size_t size) { void *ptr; @@ -102,19 +102,23 @@ void *qemu_memalign(size_t alignment, size_t size) 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 = qemu_oom_check(valloc(size)); + ptr = valloc(size); #else - ptr = qemu_oom_check(memalign(alignment, size)); + ptr = memalign(alignment, size); #endif trace_qemu_memalign(alignment, size, ptr); return ptr; } +void *qemu_memalign(size_t alignment, size_t size) +{ + return qemu_oom_check(qemu_try_memalign(alignment, size)); +} + /* alloc shared memory pages */ void *qemu_anon_ram_alloc(size_t size) { diff --git a/util/oslib-win32.c b/util/oslib-win32.c index 69552f7..ddc823e 100644 --- a/util/oslib-win32.c +++ b/util/oslib-win32.c @@ -46,18 +46,23 @@ void *qemu_oom_check(void *ptr) return ptr; } -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 = qemu_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; } +void *qemu_memalign(size_t alignment, size_t size) +{ + return qemu_oom_check(qemu_try_memalign(alignment, size)); +} + void *qemu_anon_ram_alloc(size_t size) { void *ptr;
This function returns NULL instead of aborting when an allocation fails. Signed-off-by: Kevin Wolf <kwolf@redhat.com> --- block.c | 13 +++++++++++++ include/block/block.h | 1 + include/qemu/osdep.h | 1 + util/oslib-posix.c | 16 ++++++++++------ util/oslib-win32.c | 9 +++++++-- 5 files changed, 32 insertions(+), 8 deletions(-)