mirror of https://github.com/ipxe/ipxe.git
[malloc] Track maximum heap usage
Track the current and maximum heap usage, and display the maximum during shutdown when DEBUG=malloc is enabled. Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/58/merge
parent
65a3518013
commit
c90b4d82b7
|
@ -93,6 +93,12 @@ static LIST_HEAD ( free_blocks );
|
||||||
/** Total amount of free memory */
|
/** Total amount of free memory */
|
||||||
size_t freemem;
|
size_t freemem;
|
||||||
|
|
||||||
|
/** Total amount of used memory */
|
||||||
|
size_t usedmem;
|
||||||
|
|
||||||
|
/** Maximum amount of used memory */
|
||||||
|
size_t maxusedmem;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Heap size
|
* Heap size
|
||||||
*
|
*
|
||||||
|
@ -351,8 +357,11 @@ void * alloc_memblock ( size_t size, size_t align, size_t offset ) {
|
||||||
VALGRIND_MAKE_MEM_NOACCESS ( pre,
|
VALGRIND_MAKE_MEM_NOACCESS ( pre,
|
||||||
sizeof ( *pre ) );
|
sizeof ( *pre ) );
|
||||||
}
|
}
|
||||||
/* Update total free memory */
|
/* Update memory usage statistics */
|
||||||
freemem -= actual_size;
|
freemem -= actual_size;
|
||||||
|
usedmem += actual_size;
|
||||||
|
if ( usedmem > maxusedmem )
|
||||||
|
maxusedmem = usedmem;
|
||||||
/* Return allocated block */
|
/* Return allocated block */
|
||||||
DBGC2 ( &heap, "Allocated [%p,%p)\n", block,
|
DBGC2 ( &heap, "Allocated [%p,%p)\n", block,
|
||||||
( ( ( void * ) block ) + size ) );
|
( ( ( void * ) block ) + size ) );
|
||||||
|
@ -474,8 +483,9 @@ void free_memblock ( void *ptr, size_t size ) {
|
||||||
VALGRIND_MAKE_MEM_NOACCESS ( block, sizeof ( *block ) );
|
VALGRIND_MAKE_MEM_NOACCESS ( block, sizeof ( *block ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update free memory counter */
|
/* Update memory usage statistics */
|
||||||
freemem += actual_size;
|
freemem += actual_size;
|
||||||
|
usedmem -= actual_size;
|
||||||
|
|
||||||
check_blocks();
|
check_blocks();
|
||||||
valgrind_make_blocks_noaccess();
|
valgrind_make_blocks_noaccess();
|
||||||
|
@ -629,10 +639,17 @@ void * zalloc ( size_t size ) {
|
||||||
* @c start must be aligned to at least a multiple of sizeof(void*).
|
* @c start must be aligned to at least a multiple of sizeof(void*).
|
||||||
*/
|
*/
|
||||||
void mpopulate ( void *start, size_t len ) {
|
void mpopulate ( void *start, size_t len ) {
|
||||||
|
|
||||||
/* Prevent free_memblock() from rounding up len beyond the end
|
/* Prevent free_memblock() from rounding up len beyond the end
|
||||||
* of what we were actually given...
|
* of what we were actually given...
|
||||||
*/
|
*/
|
||||||
free_memblock ( start, ( len & ~( MIN_MEMBLOCK_SIZE - 1 ) ) );
|
len &= ~( MIN_MEMBLOCK_SIZE - 1 );
|
||||||
|
|
||||||
|
/* Add to allocation pool */
|
||||||
|
free_memblock ( start, len );
|
||||||
|
|
||||||
|
/* Fix up memory usage statistics */
|
||||||
|
usedmem += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -656,6 +673,7 @@ struct init_fn heap_init_fn __init_fn ( INIT_EARLY ) = {
|
||||||
*/
|
*/
|
||||||
static void shutdown_cache ( int booting __unused ) {
|
static void shutdown_cache ( int booting __unused ) {
|
||||||
discard_all_cache();
|
discard_all_cache();
|
||||||
|
DBGC ( &heap, "Maximum heap usage %zdkB\n", ( maxusedmem >> 10 ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Memory allocator shutdown function */
|
/** Memory allocator shutdown function */
|
||||||
|
|
|
@ -22,6 +22,8 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
#include <valgrind/memcheck.h>
|
#include <valgrind/memcheck.h>
|
||||||
|
|
||||||
extern size_t freemem;
|
extern size_t freemem;
|
||||||
|
extern size_t usedmem;
|
||||||
|
extern size_t maxusedmem;
|
||||||
|
|
||||||
extern void * __malloc alloc_memblock ( size_t size, size_t align,
|
extern void * __malloc alloc_memblock ( size_t size, size_t align,
|
||||||
size_t offset );
|
size_t offset );
|
||||||
|
|
Loading…
Reference in New Issue