From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([140.186.70.92]:38041) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QGo2Y-0005fN-37 for qemu-devel@nongnu.org; Mon, 02 May 2011 03:59:35 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QGo2W-0004aG-T5 for qemu-devel@nongnu.org; Mon, 02 May 2011 03:59:34 -0400 Received: from mail-gx0-f173.google.com ([209.85.161.173]:42679) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QGo2W-0004a9-OZ for qemu-devel@nongnu.org; Mon, 02 May 2011 03:59:32 -0400 Received: by gxk26 with SMTP id 26so2292291gxk.4 for ; Mon, 02 May 2011 00:59:32 -0700 (PDT) Sender: Paolo Bonzini From: Paolo Bonzini Date: Mon, 2 May 2011 09:59:21 +0200 Message-Id: <1304323162-24702-2-git-send-email-pbonzini@redhat.com> In-Reply-To: <1304323162-24702-1-git-send-email-pbonzini@redhat.com> References: <1304323162-24702-1-git-send-email-pbonzini@redhat.com> Subject: [Qemu-devel] [PATCH 1/2] malloc: move memalign/vmalloc to qemu-malloc.c List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org This splits qemu_memalign and qemu_vfree in two: a part that does just the allocation in oslib, and a part that includes the tracing in qemu-malloc.c. Signed-off-by: Paolo Bonzini --- osdep.h | 5 ++--- oslib-posix.c | 32 +++++++------------------------- oslib-win32.c | 31 ++----------------------------- qemu-common.h | 7 +++++-- qemu-malloc.c | 33 +++++++++++++++++++++++++++++++++ trace-events | 1 - 6 files changed, 49 insertions(+), 60 deletions(-) diff --git a/osdep.h b/osdep.h index 970d767..4ca7c9e 100644 --- a/osdep.h +++ b/osdep.h @@ -88,9 +88,8 @@ # define QEMU_GNUC_PREREQ(maj, min) 0 #endif -void *qemu_memalign(size_t alignment, size_t size); -void *qemu_vmalloc(size_t size); -void qemu_vfree(void *ptr); +void *os_memalign(size_t alignment, size_t size); +void os_vfree(void *ptr); #define QEMU_MADV_INVALID -1 diff --git a/oslib-posix.c b/oslib-posix.c index 7bc5f7c..1566f18 100644 --- a/oslib-posix.c +++ b/oslib-posix.c @@ -28,47 +28,29 @@ #include "config-host.h" #include "sysemu.h" -#include "trace.h" #include "qemu_socket.h" -void *qemu_oom_check(void *ptr) -{ - if (ptr == NULL) { - fprintf(stderr, "Failed to allocate memory: %s\n", strerror(errno)); - abort(); - } - return ptr; -} - -void *qemu_memalign(size_t alignment, size_t size) +void *os_memalign(size_t alignment, size_t size) { void *ptr; + assert(alignment > sizeof(void *)); + assert((alignment & (alignment - 1)) == 0); #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(); + 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; } -/* alloc shared memory pages */ -void *qemu_vmalloc(size_t size) -{ - return qemu_memalign(getpagesize(), size); -} - -void qemu_vfree(void *ptr) +void os_vfree(void *ptr) { - trace_qemu_vfree(ptr); free(ptr); } diff --git a/oslib-win32.c b/oslib-win32.c index 5f0759f..a32451e 100644 --- a/oslib-win32.c +++ b/oslib-win32.c @@ -28,48 +28,21 @@ #include #include "config-host.h" #include "sysemu.h" -#include "trace.h" #include "qemu_socket.h" -void *qemu_oom_check(void *ptr) +void *os_memalign(size_t alignment, size_t size) { - if (ptr == NULL) { - fprintf(stderr, "Failed to allocate memory: %lu\n", GetLastError()); - abort(); - } - return ptr; -} - -void *qemu_memalign(size_t alignment, size_t size) -{ - void *ptr; - - if (!size) { - abort(); - } - ptr = qemu_oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE)); - trace_qemu_memalign(alignment, size, ptr); - return ptr; -} - -void *qemu_vmalloc(size_t size) -{ - void *ptr; - /* 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)); - trace_qemu_vmalloc(size, ptr); - return ptr; + return VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE); } void qemu_vfree(void *ptr) { - trace_qemu_vfree(ptr); VirtualFree(ptr, 0, MEM_RELEASE); } diff --git a/qemu-common.h b/qemu-common.h index f9f705d..1382e7e 100644 --- a/qemu-common.h +++ b/qemu-common.h @@ -206,13 +206,16 @@ const char *path(const char *pathname); int ffs(int i); #endif -void *qemu_oom_check(void *ptr); void *qemu_malloc(size_t size); void *qemu_realloc(void *ptr, size_t size); void *qemu_mallocz(size_t size); -void qemu_free(void *ptr); char *qemu_strdup(const char *str); char *qemu_strndup(const char *str, size_t size); +void *qemu_memalign(size_t alignment, size_t size); +void *qemu_vmalloc(size_t size); + +void qemu_free(void *ptr); +void qemu_vfree(void *ptr); void qemu_mutex_lock_iothread(void); void qemu_mutex_unlock_iothread(void); diff --git a/qemu-malloc.c b/qemu-malloc.c index b9b3851..cc1305c 100644 --- a/qemu-malloc.c +++ b/qemu-malloc.c @@ -31,6 +31,15 @@ void qemu_free(void *ptr) free(ptr); } +static void *qemu_oom_check(void *ptr) +{ + if (ptr == NULL) { + fprintf(stderr, "Failed to allocate memory: %s\n", strerror(errno)); + abort(); + } + return ptr; +} + static int allow_zero_malloc(void) { #if defined(CONFIG_ZERO_MALLOC) @@ -96,3 +105,27 @@ char *qemu_strndup(const char *str, size_t size) return memcpy(new, str, size); } + +void *qemu_memalign(size_t alignment, size_t size) +{ + char *ptr; + assert(size <= LONG_MAX); + if (!size && !allow_zero_malloc()) { + abort(); + } + ptr = qemu_oom_check(os_memalign(alignment, size ? size : 1)); + trace_qemu_memalign(alignment, size, (char *)ptr); + return ptr; +} + +/* alloc shared memory pages */ +void *qemu_vmalloc(size_t size) +{ + return qemu_memalign(getpagesize(), size); +} + +void qemu_vfree(void *ptr) +{ + trace_qemu_vfree(ptr); + os_vfree(ptr); +} diff --git a/trace-events b/trace-events index 77c96a5..bd2f74e 100644 --- a/trace-events +++ b/trace-events @@ -35,7 +35,6 @@ disable qemu_free(void *ptr) "ptr %p" # osdep.c disable qemu_memalign(size_t alignment, size_t size, void *ptr) "alignment %zu size %zu ptr %p" -disable qemu_vmalloc(size_t size, void *ptr) "size %zu ptr %p" disable qemu_vfree(void *ptr) "ptr %p" # hw/virtio.c -- 1.7.4.4