trace: Trace qemu_malloc() and qemu_vmalloc()
It is often useful to instrument memory management functions in order to find leaks or performance problems. This patch adds trace events for the memory allocation primitives. Signed-off-by: Stefan Hajnoczi <stefanha@linux.vnet.ibm.com>
This commit is contained in:
		
							parent
							
								
									81a97d9d97
								
							
						
					
					
						commit
						cd245a1932
					
				
							
								
								
									
										24
									
								
								osdep.c
								
								
								
								
							
							
						
						
									
										24
									
								
								osdep.c
								
								
								
								
							| 
						 | 
				
			
			@ -50,6 +50,7 @@
 | 
			
		|||
#endif
 | 
			
		||||
 | 
			
		||||
#include "qemu-common.h"
 | 
			
		||||
#include "trace.h"
 | 
			
		||||
#include "sysemu.h"
 | 
			
		||||
#include "qemu_socket.h"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -71,25 +72,34 @@ static void *oom_check(void *ptr)
 | 
			
		|||
#if defined(_WIN32)
 | 
			
		||||
void *qemu_memalign(size_t alignment, size_t size)
 | 
			
		||||
{
 | 
			
		||||
    void *ptr;
 | 
			
		||||
 | 
			
		||||
    if (!size) {
 | 
			
		||||
        abort();
 | 
			
		||||
    }
 | 
			
		||||
    return oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE));
 | 
			
		||||
    ptr = 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();
 | 
			
		||||
    }
 | 
			
		||||
    return oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE));
 | 
			
		||||
    ptr = oom_check(VirtualAlloc(NULL, size, MEM_COMMIT, PAGE_READWRITE));
 | 
			
		||||
    trace_qemu_vmalloc(size, ptr);
 | 
			
		||||
    return ptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void qemu_vfree(void *ptr)
 | 
			
		||||
{
 | 
			
		||||
    trace_qemu_vfree(ptr);
 | 
			
		||||
    VirtualFree(ptr, 0, MEM_RELEASE);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -97,21 +107,22 @@ void qemu_vfree(void *ptr)
 | 
			
		|||
 | 
			
		||||
void *qemu_memalign(size_t alignment, size_t size)
 | 
			
		||||
{
 | 
			
		||||
    void *ptr;
 | 
			
		||||
#if defined(_POSIX_C_SOURCE) && !defined(__sun__)
 | 
			
		||||
    int ret;
 | 
			
		||||
    void *ptr;
 | 
			
		||||
    ret = posix_memalign(&ptr, alignment, size);
 | 
			
		||||
    if (ret != 0) {
 | 
			
		||||
        fprintf(stderr, "Failed to allocate %zu B: %s\n",
 | 
			
		||||
                size, strerror(ret));
 | 
			
		||||
        abort();
 | 
			
		||||
    }
 | 
			
		||||
    return ptr;
 | 
			
		||||
#elif defined(CONFIG_BSD)
 | 
			
		||||
    return oom_check(valloc(size));
 | 
			
		||||
    ptr = oom_check(valloc(size));
 | 
			
		||||
#else
 | 
			
		||||
    return oom_check(memalign(alignment, size));
 | 
			
		||||
    ptr = oom_check(memalign(alignment, size));
 | 
			
		||||
#endif
 | 
			
		||||
    trace_qemu_memalign(alignment, size, ptr);
 | 
			
		||||
    return ptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* alloc shared memory pages */
 | 
			
		||||
| 
						 | 
				
			
			@ -122,6 +133,7 @@ void *qemu_vmalloc(size_t size)
 | 
			
		|||
 | 
			
		||||
void qemu_vfree(void *ptr)
 | 
			
		||||
{
 | 
			
		||||
    trace_qemu_vfree(ptr);
 | 
			
		||||
    free(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,6 +22,7 @@
 | 
			
		|||
 * THE SOFTWARE.
 | 
			
		||||
 */
 | 
			
		||||
#include "qemu-common.h"
 | 
			
		||||
#include "trace.h"
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
static void *oom_check(void *ptr)
 | 
			
		||||
| 
						 | 
				
			
			@ -34,6 +35,7 @@ static void *oom_check(void *ptr)
 | 
			
		|||
 | 
			
		||||
void qemu_free(void *ptr)
 | 
			
		||||
{
 | 
			
		||||
    trace_qemu_free(ptr);
 | 
			
		||||
    free(ptr);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -48,18 +50,24 @@ static int allow_zero_malloc(void)
 | 
			
		|||
 | 
			
		||||
void *qemu_malloc(size_t size)
 | 
			
		||||
{
 | 
			
		||||
    void *ptr;
 | 
			
		||||
    if (!size && !allow_zero_malloc()) {
 | 
			
		||||
        abort();
 | 
			
		||||
    }
 | 
			
		||||
    return oom_check(malloc(size ? size : 1));
 | 
			
		||||
    ptr = oom_check(malloc(size ? size : 1));
 | 
			
		||||
    trace_qemu_malloc(size, ptr);
 | 
			
		||||
    return ptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *qemu_realloc(void *ptr, size_t size)
 | 
			
		||||
{
 | 
			
		||||
    void *newptr;
 | 
			
		||||
    if (!size && !allow_zero_malloc()) {
 | 
			
		||||
        abort();
 | 
			
		||||
    }
 | 
			
		||||
    return oom_check(realloc(ptr, size ? size : 1));
 | 
			
		||||
    newptr = oom_check(realloc(ptr, size ? size : 1));
 | 
			
		||||
    trace_qemu_realloc(ptr, size, newptr);
 | 
			
		||||
    return newptr;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void *qemu_mallocz(size_t size)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										10
									
								
								trace-events
								
								
								
								
							
							
						
						
									
										10
									
								
								trace-events
								
								
								
								
							| 
						 | 
				
			
			@ -27,3 +27,13 @@
 | 
			
		|||
# system may not have the necessary headers included.
 | 
			
		||||
#
 | 
			
		||||
# The <format-string> should be a sprintf()-compatible format string.
 | 
			
		||||
 | 
			
		||||
# qemu-malloc.c
 | 
			
		||||
disable qemu_malloc(size_t size, void *ptr) "size %zu ptr %p"
 | 
			
		||||
disable qemu_realloc(void *ptr, size_t size, void *newptr) "ptr %p size %zu newptr %p"
 | 
			
		||||
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_valloc(size_t size, void *ptr) "size %zu ptr %p"
 | 
			
		||||
disable qemu_vfree(void *ptr) "ptr %p"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue