|  | @@ -93,6 +93,12 @@ static LIST_HEAD ( free_blocks );
 | 
		
	
		
			
			| 93 | 93 |  /** Total amount of free memory */
 | 
		
	
		
			
			| 94 | 94 |  size_t freemem;
 | 
		
	
		
			
			| 95 | 95 |  
 | 
		
	
		
			
			|  | 96 | +/** Total amount of used memory */
 | 
		
	
		
			
			|  | 97 | +size_t usedmem;
 | 
		
	
		
			
			|  | 98 | +
 | 
		
	
		
			
			|  | 99 | +/** Maximum amount of used memory */
 | 
		
	
		
			
			|  | 100 | +size_t maxusedmem;
 | 
		
	
		
			
			|  | 101 | +
 | 
		
	
		
			
			| 96 | 102 |  /**
 | 
		
	
		
			
			| 97 | 103 |   * Heap size
 | 
		
	
		
			
			| 98 | 104 |   *
 | 
		
	
	
		
			
			|  | @@ -351,8 +357,11 @@ void * alloc_memblock ( size_t size, size_t align, size_t offset ) {
 | 
		
	
		
			
			| 351 | 357 |  				VALGRIND_MAKE_MEM_NOACCESS ( pre,
 | 
		
	
		
			
			| 352 | 358 |  							     sizeof ( *pre ) );
 | 
		
	
		
			
			| 353 | 359 |  			}
 | 
		
	
		
			
			| 354 |  | -			/* Update total free memory */
 | 
		
	
		
			
			|  | 360 | +			/* Update memory usage statistics */
 | 
		
	
		
			
			| 355 | 361 |  			freemem -= actual_size;
 | 
		
	
		
			
			|  | 362 | +			usedmem += actual_size;
 | 
		
	
		
			
			|  | 363 | +			if ( usedmem > maxusedmem )
 | 
		
	
		
			
			|  | 364 | +				maxusedmem = usedmem;
 | 
		
	
		
			
			| 356 | 365 |  			/* Return allocated block */
 | 
		
	
		
			
			| 357 | 366 |  			DBGC2 ( &heap, "Allocated [%p,%p)\n", block,
 | 
		
	
		
			
			| 358 | 367 |  				( ( ( void * ) block ) + size ) );
 | 
		
	
	
		
			
			|  | @@ -474,8 +483,9 @@ void free_memblock ( void *ptr, size_t size ) {
 | 
		
	
		
			
			| 474 | 483 |  		VALGRIND_MAKE_MEM_NOACCESS ( block, sizeof ( *block ) );
 | 
		
	
		
			
			| 475 | 484 |  	}
 | 
		
	
		
			
			| 476 | 485 |  
 | 
		
	
		
			
			| 477 |  | -	/* Update free memory counter */
 | 
		
	
		
			
			|  | 486 | +	/* Update memory usage statistics */
 | 
		
	
		
			
			| 478 | 487 |  	freemem += actual_size;
 | 
		
	
		
			
			|  | 488 | +	usedmem -= actual_size;
 | 
		
	
		
			
			| 479 | 489 |  
 | 
		
	
		
			
			| 480 | 490 |  	check_blocks();
 | 
		
	
		
			
			| 481 | 491 |  	valgrind_make_blocks_noaccess();
 | 
		
	
	
		
			
			|  | @@ -629,10 +639,17 @@ void * zalloc ( size_t size ) {
 | 
		
	
		
			
			| 629 | 639 |   * @c start must be aligned to at least a multiple of sizeof(void*).
 | 
		
	
		
			
			| 630 | 640 |   */
 | 
		
	
		
			
			| 631 | 641 |  void mpopulate ( void *start, size_t len ) {
 | 
		
	
		
			
			|  | 642 | +
 | 
		
	
		
			
			| 632 | 643 |  	/* Prevent free_memblock() from rounding up len beyond the end
 | 
		
	
		
			
			| 633 | 644 |  	 * of what we were actually given...
 | 
		
	
		
			
			| 634 | 645 |  	 */
 | 
		
	
		
			
			| 635 |  | -	free_memblock ( start, ( len & ~( MIN_MEMBLOCK_SIZE - 1 ) ) );
 | 
		
	
		
			
			|  | 646 | +	len &= ~( MIN_MEMBLOCK_SIZE - 1 );
 | 
		
	
		
			
			|  | 647 | +
 | 
		
	
		
			
			|  | 648 | +	/* Add to allocation pool */
 | 
		
	
		
			
			|  | 649 | +	free_memblock ( start, len );
 | 
		
	
		
			
			|  | 650 | +
 | 
		
	
		
			
			|  | 651 | +	/* Fix up memory usage statistics */
 | 
		
	
		
			
			|  | 652 | +	usedmem += len;
 | 
		
	
		
			
			| 636 | 653 |  }
 | 
		
	
		
			
			| 637 | 654 |  
 | 
		
	
		
			
			| 638 | 655 |  /**
 | 
		
	
	
		
			
			|  | @@ -656,6 +673,7 @@ struct init_fn heap_init_fn __init_fn ( INIT_EARLY ) = {
 | 
		
	
		
			
			| 656 | 673 |   */
 | 
		
	
		
			
			| 657 | 674 |  static void shutdown_cache ( int booting __unused ) {
 | 
		
	
		
			
			| 658 | 675 |  	discard_all_cache();
 | 
		
	
		
			
			|  | 676 | +	DBGC ( &heap, "Maximum heap usage %zdkB\n", ( maxusedmem >> 10 ) );
 | 
		
	
		
			
			| 659 | 677 |  }
 | 
		
	
		
			
			| 660 | 678 |  
 | 
		
	
		
			
			| 661 | 679 |  /** Memory allocator shutdown function */
 |