iPXE
Data Structures | Macros | Functions | Variables
malloc.c File Reference

Dynamic memory allocation. More...

#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <ipxe/io.h>
#include <ipxe/list.h>
#include <ipxe/init.h>
#include <ipxe/refcnt.h>
#include <ipxe/malloc.h>
#include <valgrind/memcheck.h>

Go to the source code of this file.

Data Structures

struct  memory_block
 A free block of memory. More...
 
struct  autosized_block
 A block of allocated memory complete with size information. More...
 

Macros

#define MIN_MEMBLOCK_ALIGN   ( 4 * sizeof ( void * ) )
 Physical address alignment maintained for free blocks of memory. More...
 
#define HEAP_SIZE   ( 512 * 1024 )
 Heap area size. More...
 
#define HEAP_ALIGN   MIN_MEMBLOCK_ALIGN
 Heap area alignment. More...
 

Functions

 FILE_LICENCE (GPL2_OR_LATER_OR_UBDL)
 
static void valgrind_make_blocks_defined (struct heap *heap)
 Mark all blocks in free list as defined. More...
 
static void valgrind_make_blocks_noaccess (struct heap *heap)
 Mark all blocks in free list as inaccessible. More...
 
static void check_blocks (struct heap *heap)
 Check integrity of the blocks in the free list. More...
 
static unsigned int discard_cache (size_t size __unused)
 Discard some cached data. More...
 
static void discard_all_cache (void)
 Discard all cached data. More...
 
static void * heap_alloc_block (struct heap *heap, size_t size, size_t align, size_t offset)
 Allocate a memory block. More...
 
static void heap_free_block (struct heap *heap, void *ptr, size_t size)
 Free a memory block. More...
 
void * heap_realloc (struct heap *heap, void *old_ptr, size_t new_size)
 Reallocate memory. More...
 
void * realloc (void *old_ptr, size_t new_size)
 Reallocate memory. More...
 
void * malloc (size_t size)
 Allocate memory. More...
 
void free (void *ptr)
 Free memory. More...
 
void * zalloc (size_t size)
 Allocate cleared memory. More...
 
void * malloc_phys_offset (size_t size, size_t phys_align, size_t offset)
 Allocate memory with specified physical alignment and offset. More...
 
void * malloc_phys (size_t size, size_t phys_align)
 Allocate memory with specified physical alignment. More...
 
void free_phys (void *ptr, size_t size)
 Free memory allocated with malloc_phys() More...
 
void heap_populate (struct heap *heap, void *start, size_t len)
 Add memory to allocation pool. More...
 
static void init_heap (void)
 Initialise the heap. More...
 
struct init_fn heap_init_fn __init_fn (INIT_EARLY)
 Memory allocator initialisation function. More...
 
static void shutdown_cache (int booting __unused)
 Discard all cached data on shutdown. More...
 
struct startup_fn heap_startup_fn __startup_fn (STARTUP_EARLY)
 Memory allocator shutdown function. More...
 
void heap_dump (struct heap *heap)
 Dump free block list (for debugging) More...
 

Variables

static char heap_area [HEAP_SIZE]
 The heap area. More...
 
static struct heap heap
 The global heap. More...
 

Detailed Description

Dynamic memory allocation.

Definition in file malloc.c.

Macro Definition Documentation

◆ MIN_MEMBLOCK_ALIGN

#define MIN_MEMBLOCK_ALIGN   ( 4 * sizeof ( void * ) )

Physical address alignment maintained for free blocks of memory.

We keep memory blocks aligned on a power of two that is at least large enough to hold a struct memory_block.

Definition at line 66 of file malloc.c.

◆ HEAP_SIZE

#define HEAP_SIZE   ( 512 * 1024 )

Heap area size.

Currently fixed at 512kB.

Definition at line 81 of file malloc.c.

◆ HEAP_ALIGN

#define HEAP_ALIGN   MIN_MEMBLOCK_ALIGN

Heap area alignment.

Definition at line 84 of file malloc.c.

Function Documentation

◆ FILE_LICENCE()

FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL  )

◆ valgrind_make_blocks_defined()

static void valgrind_make_blocks_defined ( struct heap heap)
inlinestatic

Mark all blocks in free list as defined.

Parameters
heapHeap

Definition at line 94 of file malloc.c.

94  {
95  struct memory_block *block;
96 
97  /* Do nothing unless running under Valgrind */
98  if ( RUNNING_ON_VALGRIND <= 0 )
99  return;
100 
101  /* Traverse free block list, marking each block structure as
102  * defined. Some contortions are necessary to avoid errors
103  * from list_check().
104  */
105 
106  /* Mark block list itself as defined */
107  VALGRIND_MAKE_MEM_DEFINED ( &heap->blocks, sizeof ( heap->blocks ) );
108 
109  /* Mark areas accessed by list_check() as defined */
111  sizeof ( heap->blocks.prev->next ) );
113  sizeof ( *heap->blocks.next ) );
115  sizeof ( heap->blocks.next->next->prev ) );
116 
117  /* Mark each block in list as defined */
119 
120  /* Mark block as defined */
121  VALGRIND_MAKE_MEM_DEFINED ( block, sizeof ( *block ) );
122 
123  /* Mark areas accessed by list_check() as defined */
124  VALGRIND_MAKE_MEM_DEFINED ( block->list.next,
125  sizeof ( *block->list.next ) );
126  VALGRIND_MAKE_MEM_DEFINED ( &block->list.next->next->prev,
127  sizeof ( block->list.next->next->prev ) );
128  }
129 }
struct list_head * next
Next list entry.
Definition: list.h:20
#define VALGRIND_MAKE_MEM_DEFINED(_qzz_addr, _qzz_len)
Definition: memcheck.h:131
#define RUNNING_ON_VALGRIND
Definition: valgrind.h:4175
struct list_head list
List of free blocks.
Definition: malloc.c:58
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
A free block of memory.
Definition: malloc.c:43
struct list_head blocks
List of free memory blocks.
Definition: malloc.h:46
struct list_head * prev
Previous list entry.
Definition: list.h:22
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
A heap.
Definition: malloc.h:44

References block, heap::blocks, memory_block::list, list_for_each_entry, list_head::next, list_head::prev, RUNNING_ON_VALGRIND, and VALGRIND_MAKE_MEM_DEFINED.

Referenced by heap_alloc_block(), and heap_free_block().

◆ valgrind_make_blocks_noaccess()

static void valgrind_make_blocks_noaccess ( struct heap heap)
inlinestatic

Mark all blocks in free list as inaccessible.

Parameters
heapHeap

Definition at line 136 of file malloc.c.

136  {
137  struct memory_block *block;
138  struct memory_block *prev = NULL;
139 
140  /* Do nothing unless running under Valgrind */
141  if ( RUNNING_ON_VALGRIND <= 0 )
142  return;
143 
144  /* Traverse free block list, marking each block structure as
145  * inaccessible. Some contortions are necessary to avoid
146  * errors from list_check().
147  */
148 
149  /* Mark each block in list as inaccessible */
151 
152  /* Mark previous block (if any) as inaccessible. (Current
153  * block will be accessed by list_check().)
154  */
155  if ( prev )
156  VALGRIND_MAKE_MEM_NOACCESS ( prev, sizeof ( *prev ) );
157  prev = block;
158 
159  /* At the end of the list, list_check() will end up
160  * accessing the first list item. Temporarily mark
161  * this area as defined.
162  */
164  sizeof ( heap->blocks.next->prev ));
165  }
166  /* Mark last block (if any) as inaccessible */
167  if ( prev )
168  VALGRIND_MAKE_MEM_NOACCESS ( prev, sizeof ( *prev ) );
169 
170  /* Mark as inaccessible the area that was temporarily marked
171  * as defined to avoid errors from list_check().
172  */
174  sizeof ( heap->blocks.next->prev ) );
175 
176  /* Mark block list itself as inaccessible */
177  VALGRIND_MAKE_MEM_NOACCESS ( &heap->blocks, sizeof ( heap->blocks ) );
178 }
struct list_head * next
Next list entry.
Definition: list.h:20
#define VALGRIND_MAKE_MEM_DEFINED(_qzz_addr, _qzz_len)
Definition: memcheck.h:131
#define RUNNING_ON_VALGRIND
Definition: valgrind.h:4175
struct list_head list
List of free blocks.
Definition: malloc.c:58
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
#define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr, _qzz_len)
Definition: memcheck.h:111
A free block of memory.
Definition: malloc.c:43
struct list_head blocks
List of free memory blocks.
Definition: malloc.h:46
struct list_head * prev
Previous list entry.
Definition: list.h:22
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
A heap.
Definition: malloc.h:44
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References block, heap::blocks, memory_block::list, list_for_each_entry, list_head::next, NULL, list_head::prev, RUNNING_ON_VALGRIND, VALGRIND_MAKE_MEM_DEFINED, and VALGRIND_MAKE_MEM_NOACCESS.

Referenced by heap_alloc_block(), and heap_free_block().

◆ check_blocks()

static void check_blocks ( struct heap heap)
inlinestatic

Check integrity of the blocks in the free list.

Parameters
heapHeap

Definition at line 185 of file malloc.c.

185  {
186  struct memory_block *block;
187  struct memory_block *prev = NULL;
188 
189  if ( ! ASSERTING )
190  return;
191 
193 
194  /* Check alignment */
195  assert ( ( virt_to_phys ( block ) &
196  ( heap->align - 1 ) ) == 0 );
197 
198  /* Check that list structure is intact */
199  list_check ( &block->list );
200 
201  /* Check that block size is not too small */
202  assert ( block->size >= sizeof ( *block ) );
203  assert ( block->size >= heap->align );
204 
205  /* Check that block does not wrap beyond end of address space */
206  assert ( ( ( void * ) block + block->size ) >
207  ( ( void * ) block ) );
208 
209  /* Check that blocks remain in ascending order, and
210  * that adjacent blocks have been merged.
211  */
212  if ( prev ) {
213  assert ( ( ( void * ) block ) > ( ( void * ) prev ) );
214  assert ( ( ( void * ) block ) >
215  ( ( ( void * ) prev ) + prev->size ) );
216  }
217  prev = block;
218  }
219 }
struct list_head list
List of free blocks.
Definition: malloc.c:58
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
#define ASSERTING
Definition: assert.h:19
A free block of memory.
Definition: malloc.c:43
struct list_head blocks
List of free memory blocks.
Definition: malloc.h:46
#define list_check(list)
Check a list entry or list head is valid.
Definition: list.h:55
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
A heap.
Definition: malloc.h:44
size_t align
Alignment for free memory blocks.
Definition: malloc.h:49
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References heap::align, assert(), ASSERTING, block, heap::blocks, memory_block::list, list_check, list_for_each_entry, and NULL.

Referenced by heap_alloc_block(), and heap_free_block().

◆ discard_cache()

static unsigned int discard_cache ( size_t size  __unused)
static

Discard some cached data.

Parameters
sizeFailed allocation size
Return values
discardedNumber of cached items discarded

Definition at line 227 of file malloc.c.

227  {
228  struct cache_discarder *discarder;
229  unsigned int discarded;
230 
231  for_each_table_entry ( discarder, CACHE_DISCARDERS ) {
232  discarded = discarder->discard();
233  if ( discarded )
234  return discarded;
235  }
236  return 0;
237 }
#define CACHE_DISCARDERS
Cache discarder table.
Definition: malloc.h:102
unsigned int(* discard)(void)
Discard some cached data.
Definition: malloc.h:98
#define for_each_table_entry(pointer, table)
Iterate through all entries within a linker table.
Definition: tables.h:385
A cache discarder.
Definition: malloc.h:92

References CACHE_DISCARDERS, cache_discarder::discard, and for_each_table_entry.

Referenced by discard_all_cache().

◆ discard_all_cache()

static void discard_all_cache ( void  )
static

Discard all cached data.

Definition at line 243 of file malloc.c.

243  {
244  unsigned int discarded;
245 
246  do {
247  discarded = discard_cache ( 0 );
248  } while ( discarded );
249 }
static unsigned int discard_cache(size_t size __unused)
Discard some cached data.
Definition: malloc.c:227

References discard_cache().

Referenced by shutdown_cache().

◆ heap_alloc_block()

static void* heap_alloc_block ( struct heap heap,
size_t  size,
size_t  align,
size_t  offset 
)
static

Allocate a memory block.

Parameters
heapHeap
sizeRequested size
alignPhysical alignment
offsetOffset from physical alignment
Return values
ptrMemory block, or NULL

Allocates a memory block physically aligned as requested. No guarantees are provided for the alignment of the virtual address.

align must be a power of two. size may not be zero.

Definition at line 265 of file malloc.c.

266  {
267  struct memory_block *block;
268  size_t actual_offset;
269  size_t align_mask;
270  size_t actual_size;
271  size_t pre_size;
272  size_t post_size;
273  struct memory_block *pre;
274  struct memory_block *post;
275  unsigned int grown;
276  void *ptr;
277 
278  /* Sanity checks */
279  assert ( size != 0 );
280  assert ( ( align == 0 ) || ( ( align & ( align - 1 ) ) == 0 ) );
282  check_blocks ( heap );
283 
284  /* Limit offset to requested alignment */
285  offset &= ( align ? ( align - 1 ) : 0 );
286 
287  /* Calculate offset of memory block */
288  actual_offset = ( offset & ~( heap->align - 1 ) );
289  assert ( actual_offset <= offset );
290 
291  /* Calculate size of memory block */
292  actual_size = ( ( size + offset - actual_offset + heap->align - 1 )
293  & ~( heap->align - 1 ) );
294  if ( ! actual_size ) {
295  /* The requested size is not permitted to be zero. A
296  * zero result at this point indicates that either the
297  * original requested size was zero, or that unsigned
298  * integer overflow has occurred.
299  */
300  ptr = NULL;
301  goto done;
302  }
303  assert ( actual_size >= size );
304 
305  /* Calculate alignment mask */
306  align_mask = ( ( align - 1 ) | ( heap->align - 1 ) );
307 
308  DBGC2 ( heap, "HEAP allocating %#zx (aligned %#zx+%#zx)\n",
309  size, align, offset );
310  while ( 1 ) {
311  /* Search through blocks for the first one with enough space */
313  pre_size = ( ( actual_offset - virt_to_phys ( block ) )
314  & align_mask );
315  if ( ( block->size < pre_size ) ||
316  ( ( block->size - pre_size ) < actual_size ) )
317  continue;
318  post_size = ( block->size - pre_size - actual_size );
319  /* Split block into pre-block, block, and
320  * post-block. After this split, the "pre"
321  * block is the one currently linked into the
322  * free list.
323  */
324  pre = block;
325  block = ( ( ( void * ) pre ) + pre_size );
326  post = ( ( ( void * ) block ) + actual_size );
327  DBGC2 ( heap, "HEAP splitting [%p,%p) -> [%p,%p) "
328  "+ [%p,%p)\n", pre,
329  ( ( ( void * ) pre ) + pre->size ), pre, block,
330  post, ( ( ( void * ) pre ) + pre->size ) );
331  /* If there is a "post" block, add it in to
332  * the free list.
333  */
334  if ( post_size ) {
335  assert ( post_size >= sizeof ( *block ) );
336  assert ( ( post_size &
337  ( heap->align - 1 ) ) == 0 );
339  sizeof ( *post ));
340  post->size = post_size;
341  list_add ( &post->list, &pre->list );
342  }
343  /* Shrink "pre" block, leaving the main block
344  * isolated and no longer part of the free
345  * list.
346  */
347  pre->size = pre_size;
348  /* If there is no "pre" block, remove it from
349  * the list.
350  */
351  if ( ! pre_size ) {
352  list_del ( &pre->list );
354  sizeof ( *pre ) );
355  } else {
356  assert ( pre_size >= sizeof ( *block ) );
357  assert ( ( pre_size &
358  ( heap->align - 1 ) ) == 0 );
359  }
360  /* Update memory usage statistics */
361  heap->freemem -= actual_size;
362  heap->usedmem += actual_size;
363  if ( heap->usedmem > heap->maxusedmem )
365  /* Return allocated block */
366  ptr = ( ( ( void * ) block ) + offset - actual_offset );
367  DBGC2 ( heap, "HEAP allocated [%p,%p) within "
368  "[%p,%p)\n", ptr, ( ptr + size ), block,
369  ( ( ( void * ) block ) + actual_size ) );
371  goto done;
372  }
373 
374  /* Attempt to grow heap to satisfy allocation */
375  DBGC ( heap, "HEAP attempting to grow for %#zx (aligned "
376  "%#zx+%zx), used %zdkB\n", size, align, offset,
377  ( heap->usedmem >> 10 ) );
379  grown = ( heap->grow ? heap->grow ( actual_size ) : 0 );
381  check_blocks ( heap );
382  if ( ! grown ) {
383  /* Heap did not grow: fail allocation */
384  DBGC ( heap, "HEAP failed to allocate %#zx (aligned "
385  "%#zx)\n", size, align );
386  ptr = NULL;
387  goto done;
388  }
389  }
390 
391  done:
392  check_blocks ( heap );
394  return ptr;
395 }
#define list_add(new, head)
Add a new entry to the head of a list.
Definition: list.h:69
uint16_t size
Buffer size.
Definition: dwmac.h:14
#define DBGC(...)
Definition: compiler.h:505
struct list_head list
List of free blocks.
Definition: malloc.c:58
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
unsigned int(* grow)(size_t size)
Attempt to grow heap (optional)
Definition: malloc.h:66
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void valgrind_make_blocks_noaccess(struct heap *heap)
Mark all blocks in free list as inaccessible.
Definition: malloc.c:136
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
static void valgrind_make_blocks_defined(struct heap *heap)
Mark all blocks in free list as defined.
Definition: malloc.c:94
#define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr, _qzz_len)
Definition: memcheck.h:111
size_t maxusedmem
Maximum amount of used memory.
Definition: malloc.h:58
size_t freemem
Total amount of free memory.
Definition: malloc.h:54
A free block of memory.
Definition: malloc.c:43
struct list_head blocks
List of free memory blocks.
Definition: malloc.h:46
size_t usedmem
Total amount of used memory.
Definition: malloc.h:56
static void check_blocks(struct heap *heap)
Check integrity of the blocks in the free list.
Definition: malloc.c:185
#define DBGC2(...)
Definition: compiler.h:522
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
A heap.
Definition: malloc.h:44
size_t size
Size of this block.
Definition: malloc.c:45
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
#define VALGRIND_MAKE_MEM_UNDEFINED(_qzz_addr, _qzz_len)
Definition: memcheck.h:121
size_t align
Alignment for free memory blocks.
Definition: malloc.h:49
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321
struct bofm_section_header done
Definition: bofm_test.c:46

References heap::align, assert(), block, heap::blocks, check_blocks(), DBGC, DBGC2, done, heap::freemem, heap::grow, memory_block::list, list_add, list_del, list_for_each_entry, heap::maxusedmem, NULL, offset, size, memory_block::size, heap::usedmem, valgrind_make_blocks_defined(), valgrind_make_blocks_noaccess(), VALGRIND_MAKE_MEM_NOACCESS, and VALGRIND_MAKE_MEM_UNDEFINED.

Referenced by heap_realloc(), and malloc_phys_offset().

◆ heap_free_block()

static void heap_free_block ( struct heap heap,
void *  ptr,
size_t  size 
)
static

Free a memory block.

Parameters
heapHeap
ptrMemory allocated by heap_alloc_block(), or NULL
sizeSize of the memory

If ptr is NULL, no action is taken.

Definition at line 406 of file malloc.c.

406  {
407  struct memory_block *freeing;
408  struct memory_block *block;
409  struct memory_block *tmp;
410  size_t sub_offset;
411  size_t actual_size;
412  ssize_t gap_before;
413  ssize_t gap_after = -1;
414 
415  /* Allow for ptr==NULL */
416  if ( ! ptr )
417  return;
419 
420  /* Sanity checks */
422  check_blocks ( heap );
423 
424  /* Round up to match actual block that heap_alloc_block() would
425  * have allocated.
426  */
427  assert ( size != 0 );
428  sub_offset = ( virt_to_phys ( ptr ) & ( heap->align - 1 ) );
429  freeing = ( ptr - sub_offset );
430  actual_size = ( ( size + sub_offset + heap->align - 1 ) &
431  ~( heap->align - 1 ) );
432  DBGC2 ( heap, "HEAP freeing [%p,%p) within [%p,%p)\n",
433  ptr, ( ptr + size ), freeing,
434  ( ( ( void * ) freeing ) + actual_size ) );
435  VALGRIND_MAKE_MEM_UNDEFINED ( freeing, sizeof ( *freeing ) );
436 
437  /* Check that this block does not overlap the free list */
438  if ( ASSERTING ) {
440  if ( ( ( ( void * ) block ) <
441  ( ( void * ) freeing + actual_size ) ) &&
442  ( ( void * ) freeing <
443  ( ( void * ) block + block->size ) ) ) {
444  assert ( 0 );
445  DBGC ( heap, "HEAP double free of [%p,%p) "
446  "overlapping [%p,%p) detected from %p\n",
447  freeing,
448  ( ( ( void * ) freeing ) + size ), block,
449  ( ( void * ) block + block->size ),
450  __builtin_return_address ( 0 ) );
451  }
452  }
453  }
454 
455  /* Insert/merge into free list */
456  freeing->size = actual_size;
458  /* Calculate gaps before and after the "freeing" block */
459  gap_before = ( ( ( void * ) freeing ) -
460  ( ( ( void * ) block ) + block->size ) );
461  gap_after = ( ( ( void * ) block ) -
462  ( ( ( void * ) freeing ) + freeing->size ) );
463  /* Merge with immediately preceding block, if possible */
464  if ( gap_before == 0 ) {
465  DBGC2 ( heap, "HEAP merging [%p,%p) + [%p,%p) -> "
466  "[%p,%p)\n", block,
467  ( ( ( void * ) block ) + block->size ), freeing,
468  ( ( ( void * ) freeing ) + freeing->size ),
469  block,
470  ( ( ( void * ) freeing ) + freeing->size ) );
471  block->size += actual_size;
472  list_del ( &block->list );
473  VALGRIND_MAKE_MEM_NOACCESS ( freeing,
474  sizeof ( *freeing ) );
475  freeing = block;
476  }
477  /* Stop processing as soon as we reach a following block */
478  if ( gap_after >= 0 )
479  break;
480  }
481 
482  /* Insert before the immediately following block. If
483  * possible, merge the following block into the "freeing"
484  * block.
485  */
486  DBGC2 ( heap, "HEAP freed [%p,%p)\n",
487  freeing, ( ( ( void * ) freeing ) + freeing->size ) );
488  list_add_tail ( &freeing->list, &block->list );
489  if ( gap_after == 0 ) {
490  DBGC2 ( heap, "HEAP merging [%p,%p) + [%p,%p) -> [%p,%p)\n",
491  freeing, ( ( ( void * ) freeing ) + freeing->size ),
492  block, ( ( ( void * ) block ) + block->size ), freeing,
493  ( ( ( void * ) block ) + block->size ) );
494  freeing->size += block->size;
495  list_del ( &block->list );
496  VALGRIND_MAKE_MEM_NOACCESS ( block, sizeof ( *block ) );
497  }
498 
499  /* Update memory usage statistics */
500  heap->freemem += actual_size;
501  heap->usedmem -= actual_size;
502 
503  /* Allow heap to shrink */
504  if ( heap->shrink && heap->shrink ( freeing, freeing->size ) ) {
505  list_del ( &freeing->list );
506  heap->freemem -= freeing->size;
507  VALGRIND_MAKE_MEM_UNDEFINED ( freeing, freeing->size );
508  }
509 
510  /* Sanity checks */
511  check_blocks ( heap );
513 }
unsigned int(* shrink)(void *ptr, size_t size)
Allow heap to shrink (optional)
Definition: malloc.h:78
uint16_t size
Buffer size.
Definition: dwmac.h:14
#define DBGC(...)
Definition: compiler.h:505
unsigned long tmp
Definition: linux_pci.h:64
struct list_head list
List of free blocks.
Definition: malloc.c:58
#define list_del(list)
Delete an entry from a list.
Definition: list.h:119
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
static void valgrind_make_blocks_noaccess(struct heap *heap)
Mark all blocks in free list as inaccessible.
Definition: malloc.c:136
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
#define list_add_tail(new, head)
Add a new entry to the tail of a list.
Definition: list.h:93
#define ASSERTING
Definition: assert.h:19
static void valgrind_make_blocks_defined(struct heap *heap)
Mark all blocks in free list as defined.
Definition: malloc.c:94
#define list_for_each_entry_safe(pos, tmp, head, member)
Iterate over entries in a list, safe against deletion of the current entry.
Definition: list.h:458
#define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr, _qzz_len)
Definition: memcheck.h:111
size_t freemem
Total amount of free memory.
Definition: malloc.h:54
A free block of memory.
Definition: malloc.c:43
struct list_head blocks
List of free memory blocks.
Definition: malloc.h:46
size_t usedmem
Total amount of used memory.
Definition: malloc.h:56
static void check_blocks(struct heap *heap)
Check integrity of the blocks in the free list.
Definition: malloc.c:185
#define DBGC2(...)
Definition: compiler.h:522
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
A heap.
Definition: malloc.h:44
size_t size
Size of this block.
Definition: malloc.c:45
signed long ssize_t
Definition: stdint.h:7
#define VALGRIND_MAKE_MEM_UNDEFINED(_qzz_addr, _qzz_len)
Definition: memcheck.h:121
size_t align
Alignment for free memory blocks.
Definition: malloc.h:49

References heap::align, assert(), ASSERTING, block, heap::blocks, check_blocks(), DBGC, DBGC2, heap::freemem, memory_block::list, list_add_tail, list_del, list_for_each_entry, list_for_each_entry_safe, heap::shrink, size, tmp, heap::usedmem, valgrind_make_blocks_defined(), valgrind_make_blocks_noaccess(), VALGRIND_MAKE_MEM_NOACCESS, and VALGRIND_MAKE_MEM_UNDEFINED.

Referenced by free_phys(), heap_populate(), and heap_realloc().

◆ heap_realloc()

void* heap_realloc ( struct heap heap,
void *  old_ptr,
size_t  new_size 
)

Reallocate memory.

Parameters
heapHeap
old_ptrMemory previously allocated by heap_realloc(), or NULL
new_sizeRequested size
Return values
new_ptrAllocated memory, or NULL

Allocates memory with no particular alignment requirement. new_ptr will be aligned to at least a multiple of sizeof(void*). If old_ptr is non-NULL, then the contents of the newly allocated memory will be the same as the contents of the previously allocated memory, up to the minimum of the old and new sizes. The old memory will be freed.

If allocation fails the previously allocated block is left untouched and NULL is returned.

Calling heap_realloc() with a new size of zero is a valid way to free a memory block.

Definition at line 536 of file malloc.c.

536  {
537  struct autosized_block *old_block;
538  struct autosized_block *new_block;
539  size_t old_total_size;
540  size_t new_total_size;
541  size_t old_size;
542  size_t offset = offsetof ( struct autosized_block, data );
543  void *new_ptr = NOWHERE;
544 
545  /* Allocate new memory if necessary. If allocation fails,
546  * return without touching the old block.
547  */
548  if ( new_size ) {
549  new_total_size = ( new_size + offset );
550  if ( new_total_size < new_size )
551  return NULL;
552  new_block = heap_alloc_block ( heap, new_total_size,
553  heap->ptr_align, -offset );
554  if ( ! new_block )
555  return NULL;
556  new_block->size = new_total_size;
557  VALGRIND_MAKE_MEM_NOACCESS ( &new_block->size,
558  sizeof ( new_block->size ) );
559  new_ptr = &new_block->data;
560  VALGRIND_MALLOCLIKE_BLOCK ( new_ptr, new_size, 0, 0 );
561  assert ( ( ( ( intptr_t ) new_ptr ) &
562  ( heap->ptr_align - 1 ) ) == 0 );
563  }
564 
565  /* Copy across relevant part of the old data region (if any),
566  * then free it. Note that at this point either (a) new_ptr
567  * is valid, or (b) new_size is 0; either way, the memcpy() is
568  * valid.
569  */
570  if ( old_ptr && ( old_ptr != NOWHERE ) ) {
571  old_block = container_of ( old_ptr, struct autosized_block,
572  data );
573  VALGRIND_MAKE_MEM_DEFINED ( &old_block->size,
574  sizeof ( old_block->size ) );
575  old_total_size = old_block->size;
576  assert ( old_total_size != 0 );
577  old_size = ( old_total_size - offset );
578  memcpy ( new_ptr, old_ptr,
579  ( ( old_size < new_size ) ? old_size : new_size ) );
580  VALGRIND_FREELIKE_BLOCK ( old_ptr, 0 );
581  heap_free_block ( heap, old_block, old_total_size );
582  }
583 
584  if ( ASSERTED ) {
585  DBGC ( heap, "HEAP detected possible memory corruption "
586  "from %p\n", __builtin_return_address ( 0 ) );
587  }
588  return new_ptr;
589 }
#define NOWHERE
Address for zero-length memory blocks.
Definition: malloc.h:41
#define VALGRIND_MAKE_MEM_DEFINED(_qzz_addr, _qzz_len)
Definition: memcheck.h:131
char data[0]
Remaining data.
Definition: malloc.c:73
#define DBGC(...)
Definition: compiler.h:505
static void * heap_alloc_block(struct heap *heap, size_t size, size_t align, size_t offset)
Allocate a memory block.
Definition: malloc.c:265
#define offsetof(type, field)
Get offset of a field within a structure.
Definition: stddef.h:24
unsigned long intptr_t
Definition: stdint.h:21
void * memcpy(void *dest, const void *src, size_t len) __nonnull
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define container_of(ptr, type, field)
Get containing structure.
Definition: stddef.h:35
size_t ptr_align
Alignment for size-tracked allocations.
Definition: malloc.h:51
size_t size
Size of this block.
Definition: malloc.c:71
#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)
Definition: valgrind.h:4411
#define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr, _qzz_len)
Definition: memcheck.h:111
#define ASSERTED
Definition: assert.h:25
A heap.
Definition: malloc.h:44
A block of allocated memory complete with size information.
Definition: malloc.c:69
static void heap_free_block(struct heap *heap, void *ptr, size_t size)
Free a memory block.
Definition: malloc.c:406
uint8_t data[48]
Additional event data.
Definition: ena.h:22
uint16_t offset
Offset to command line.
Definition: bzimage.h:8
#define VALGRIND_FREELIKE_BLOCK(addr, rzB)
Definition: valgrind.h:4421
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References assert(), ASSERTED, container_of, data, autosized_block::data, DBGC, heap_alloc_block(), heap_free_block(), memcpy(), NOWHERE, NULL, offset, offsetof, heap::ptr_align, autosized_block::size, VALGRIND_FREELIKE_BLOCK, VALGRIND_MAKE_MEM_DEFINED, VALGRIND_MAKE_MEM_NOACCESS, and VALGRIND_MALLOCLIKE_BLOCK.

Referenced by realloc(), and uheap_realloc().

◆ realloc()

void* realloc ( void *  old_ptr,
size_t  new_size 
)

Reallocate memory.

Parameters
old_ptrMemory previously allocated by malloc(), or NULL
new_sizeRequested size
Return values
new_ptrAllocated memory, or NULL

Definition at line 606 of file malloc.c.

606  {
607 
608  return heap_realloc ( &heap, old_ptr, new_size );
609 }
A heap.
Definition: malloc.h:44
void * heap_realloc(struct heap *heap, void *old_ptr, size_t new_size)
Reallocate memory.
Definition: malloc.c:536

References heap_realloc().

Referenced by __attribute__(), asn1_grow(), bitmap_resize(), cachedhcp_record(), dhcpopt_init(), efi_ifr_op(), efi_ifr_string(), efivars_find(), free(), ibft_alloc_string(), ibft_install(), line_buffer(), malloc(), nvo_realloc(), process_script(), and xferbuf_malloc_realloc().

◆ malloc()

void* malloc ( size_t  size)

Allocate memory.

Parameters
sizeRequested size
Return values
ptrMemory, or NULL

Allocates memory with no particular alignment requirement. ptr will be aligned to at least a multiple of sizeof(void*).

Definition at line 620 of file malloc.c.

620  {
621  void *ptr;
622 
623  ptr = realloc ( NULL, size );
624  if ( ASSERTED ) {
625  DBGC ( &heap, "HEAP detected possible memory corruption "
626  "from %p\n", __builtin_return_address ( 0 ) );
627  }
628  return ptr;
629 }
uint16_t size
Buffer size.
Definition: dwmac.h:14
#define DBGC(...)
Definition: compiler.h:505
#define ASSERTED
Definition: assert.h:25
A heap.
Definition: malloc.h:44
void * realloc(void *old_ptr, size_t new_size)
Reallocate memory.
Definition: malloc.c:606
#define NULL
NULL pointer (VOID *)
Definition: Base.h:321

References ASSERTED, DBGC, NULL, realloc(), and size.

Referenced by add_tls(), aes_unwrap(), aes_wrap(), alloc_iob_raw(), apply_dns_search(), ath5k_hw_rfregs_init(), chap_init(), deflate_test_exec(), der_asn1(), derwin(), dhcpv6_rx(), dhe_key(), dupwin(), eap_rx_mschapv2_request(), eap_tx_response(), efi_block_label(), efi_boot_path(), efi_cacert_all(), efi_cmdline_init(), efi_download_start(), efi_load_path(), efi_local_check_volume_name(), efi_local_len(), efi_locate_device(), efi_vasprintf(), efivars_fetch(), eisabus_probe(), fc_ulp_login(), fetch_setting_copy(), format_uri_alloc(), http_format_ntlm_auth(), icert_encode(), int13_hook(), ipair_rx_pubkey(), ipoib_map_remac(), ipv4_add_miniroute(), isabus_probe(), isapnpbus_probe(), iscsi_handle_chap_c_value(), iscsi_handle_chap_r_value(), iscsi_rx_buffered_data(), iscsi_scsi_command(), jme_alloc_rx_resources(), jme_alloc_tx_resources(), lldp_rx(), loopback_test(), mcabus_probe(), memcpy_test_speed(), mlx_memory_alloc_priv(), net80211_probe_start(), net80211_register(), newwin(), nfs_uri_symlink(), ntlm_authenticate_okx(), ocsp_response(), ocsp_uri_string(), parse_kv(), parse_net_args(), pci_vpd_resize(), pcibus_probe(), peerblk_decrypt(), peerblk_parse_header(), pem_asn1(), rsa_alloc(), sandev_parse_iso9660(), storef_setting(), storen_setting(), strndup(), t509bus_probe(), tls_new_server_key_exchange(), tls_new_session_ticket(), tls_select_handshake(), tls_send_client_key_exchange_dhe(), uhci_enqueue(), usb_config_descriptor(), usb_get_string_descriptor(), usbio_config(), usbio_path(), vasprintf(), vesafb_mode_list(), vmbus_open(), wpa_make_rsn_ie(), wpa_start(), and zalloc().

◆ free()

void free ( void *  ptr)

Free memory.

Parameters
ptrMemory allocated by malloc(), or NULL

Memory allocated with malloc_phys() cannot be freed with free(); it must be freed with free_phys() instead.

If ptr is NULL, no action is taken.

Definition at line 641 of file malloc.c.

641  {
642 
643  realloc ( ptr, 0 );
644  if ( ASSERTED ) {
645  DBGC ( &heap, "HEAP detected possible memory corruption "
646  "from %p\n", __builtin_return_address ( 0 ) );
647  }
648 }
#define DBGC(...)
Definition: compiler.h:505
#define ASSERTED
Definition: assert.h:25
A heap.
Definition: malloc.h:44
void * realloc(void *old_ptr, size_t new_size)
Reallocate memory.
Definition: malloc.c:606

References ASSERTED, DBGC, and realloc().

◆ zalloc()

void* zalloc ( size_t  size)

Allocate cleared memory.

Parameters
sizeRequested size
Return values
ptrAllocated memory

Allocate memory as per malloc(), and zero it.

This function name is non-standard, but pretty intuitive. zalloc(size) is always equivalent to calloc(1,size)

Definition at line 661 of file malloc.c.

661  {
662  void *data;
663 
664  data = malloc ( size );
665  if ( data )
666  memset ( data, 0, size );
667  if ( ASSERTED ) {
668  DBGC ( &heap, "HEAP detected possible memory corruption "
669  "from %p\n", __builtin_return_address ( 0 ) );
670  }
671  return data;
672 }
uint16_t size
Buffer size.
Definition: dwmac.h:14
#define DBGC(...)
Definition: compiler.h:505
#define ASSERTED
Definition: assert.h:25
void * malloc(size_t size)
Allocate memory.
Definition: malloc.c:620
A heap.
Definition: malloc.h:44
uint8_t data[48]
Additional event data.
Definition: ena.h:22
void * memset(void *dest, int character, size_t len) __nonnull

References ASSERTED, data, DBGC, malloc(), memset(), and size.

Referenced by add_dynui_item(), add_parameter(), alloc_form(), alloc_gpios(), alloc_ibdev(), alloc_image(), alloc_netdev(), alloc_pixbuf(), alloc_sandev(), alloc_uart(), alloc_usb(), alloc_usb_bus(), alloc_usb_hub(), aoecmd_create(), aoedev_open(), ar9300_eeprom_restore_internal(), arbel_alloc(), arbel_create_cq(), arbel_create_qp(), ata_open(), atadev_command(), ath5k_hw_attach(), ath5k_probe(), ath9k_init_softc(), ath_descdma_setup(), atl1e_setup_ring_resources(), autovivify_child_settings(), block_translate(), cachedhcp_record(), calloc(), cms_message(), cms_parse_participants(), concat_args(), cpio_okx(), create_downloader(), create_dynui(), create_parameters(), create_pinger(), create_validator(), dhcp_deliver(), dhcpv6_register(), dns_resolv(), dt_probe_node(), dwgpio_group_probe(), dwusb_probe(), efi_block_exec(), efi_block_install(), efi_fcp_path(), efi_file_open_image(), efi_ib_srp_path(), efi_image_path(), efi_iscsi_path(), efi_local_open(), efi_netdev_path(), efi_path_uri(), efi_paths(), efi_pxe_install(), efi_snp_hii_fetch(), efi_snp_hii_install(), efi_snp_hii_process(), efi_snp_hii_store(), efi_snp_probe(), efi_uri_path(), efi_usb_install(), efi_usb_open(), efi_usb_path(), efi_usb_probe(), efidev_alloc(), efipci_start(), efivars_find(), ehci_endpoint_open(), ehci_probe(), ehci_ring_alloc(), eoib_create_peer(), exanic_probe(), fc_els_create(), fc_ns_query(), fc_peer_create(), fc_port_open(), fc_ulp_create(), fc_xchg_create(), fcpdev_open(), fcpdev_scsi_command(), fetch_string_setting_copy_alloc(), fetchf_setting_copy(), flexboot_nodnic_create_cq(), flexboot_nodnic_create_qp(), flexboot_nodnic_eth_open(), flexboot_nodnic_probe(), fragment_reassemble(), ftp_open(), generic_settings_store(), golan_alloc(), golan_create_cq(), golan_create_qp_aux(), guestinfo_fetch_type(), hermon_alloc(), hermon_create_cq(), hermon_create_qp(), http_connect(), http_open(), http_open_uri(), hub_probe(), hv_probe(), hvm_probe(), hw_open(), ib_cmrc_open(), ib_create_conn(), ib_create_cq(), ib_create_madx(), ib_create_mi(), ib_create_path(), ib_create_qp(), ib_mcast_attach(), ib_srp_open(), ibft_install(), icert_certs(), imux_probe(), init_mlx_utils(), ipair_create(), ipv6_add_miniroute(), iscsi_open(), linda_create_send_wq(), mlx_memory_zalloc_priv(), ndp_register_settings(), neighbour_create(), net80211_handle_mgmt(), net80211_prepare_assoc(), net80211_probe_start(), net80211_probe_step(), net80211_step_associate(), nfs_open(), nii_map(), numeric_resolv(), ocsp_check(), ocsp_uri_string(), open(), parse_uri(), pcibridge_probe(), peerblk_open(), peerdisc_create(), peerdisc_discovered(), peermux_filter(), ping_open(), png_pixbuf(), pxe_menu_parse(), qib7322_create_send_bufs(), qib7322_create_send_wq(), qib7322_probe(), rc80211_init(), resolv(), resolv_setting(), rtl818x_probe(), scsi_open(), scsidev_command(), sec80211_install(), sis190_mii_probe(), skge_probe(), skge_ring_alloc(), sky2_probe(), sky2_up(), slam_open(), srp_open(), srpdev_scsi_command(), start_dhcp(), start_dhcpv6(), start_ipv6conf(), start_ntp(), start_pxebs(), tcp_open(), tftp_core_open(), tg3_alloc_consistent(), tls_session(), tls_set_cipher(), txnic_bgx_probe(), txnic_pf_probe(), ucode_exec(), udp_open_common(), uhci_endpoint_open(), uhci_probe(), undipci_probe(), undirom_probe(), uri_dup(), usb_probe_all(), usbblk_probe(), usbio_endpoint_open(), usbio_interfaces(), usbio_interrupt_open(), usbio_start(), usbkbd_probe(), validator_start_download(), virtnet_open_legacy(), virtnet_open_modern(), vmbus_probe(), vmbus_probe_channels(), vxge_hw_device_initialize(), x509_alloc_chain(), x509_append(), x509_certificate(), xcm_create(), xenbus_probe_device(), xenstore_response(), xfer_open_named_socket(), xhci_bus_open(), xhci_device_open(), xhci_endpoint_open(), xhci_probe(), xhci_ring_alloc(), xsigo_ib_probe(), xve_create(), and zlib_deflate().

◆ malloc_phys_offset()

void* malloc_phys_offset ( size_t  size,
size_t  phys_align,
size_t  offset 
)

Allocate memory with specified physical alignment and offset.

Parameters
sizeRequested size
alignPhysical alignment
offsetOffset from physical alignment
Return values
ptrMemory, or NULL

align must be a power of two. size may not be zero.

Definition at line 684 of file malloc.c.

684  {
685  void * ptr;
686 
687  ptr = heap_alloc_block ( &heap, size, phys_align, offset );
688  if ( ptr && size ) {
689  assert ( ( phys_align == 0 ) ||
690  ( ( ( virt_to_phys ( ptr ) ^ offset ) &
691  ( phys_align - 1 ) ) == 0 ) );
692  VALGRIND_MALLOCLIKE_BLOCK ( ptr, size, 0, 0 );
693  }
694  return ptr;
695 }
uint16_t size
Buffer size.
Definition: dwmac.h:14
static void * heap_alloc_block(struct heap *heap, size_t size, size_t align, size_t offset)
Allocate a memory block.
Definition: malloc.c:265
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
#define VALGRIND_MALLOCLIKE_BLOCK(addr, sizeB, rzB, is_zeroed)
Definition: valgrind.h:4411
A heap.
Definition: malloc.h:44
uint16_t offset
Offset to command line.
Definition: bzimage.h:8

References assert(), heap_alloc_block(), offset, size, and VALGRIND_MALLOCLIKE_BLOCK.

Referenced by alloc_iob_raw(), and malloc_phys().

◆ malloc_phys()

void* malloc_phys ( size_t  size,
size_t  phys_align 
)

Allocate memory with specified physical alignment.

Parameters
sizeRequested size
alignPhysical alignment
Return values
ptrMemory, or NULL

align must be a power of two. size may not be zero.

Definition at line 706 of file malloc.c.

706  {
707 
708  return malloc_phys_offset ( size, phys_align, 0 );
709 }
uint16_t size
Buffer size.
Definition: dwmac.h:14
void * malloc_phys_offset(size_t size, size_t phys_align, size_t offset)
Allocate memory with specified physical alignment and offset.
Definition: malloc.c:684

References malloc_phys_offset(), and size.

Referenced by __vxge_hw_fifo_create(), __vxge_hw_ring_create(), a3c90x_setup_rx_ring(), a3c90x_setup_tx_ring(), arbel_alloc(), arbel_alloc_icm(), arbel_create_cq(), arbel_create_eq(), arbel_create_recv_wq(), arbel_create_send_wq(), ath5k_desc_alloc(), ath_descdma_setup(), atl1e_setup_ring_resources(), b44_init_rx_ring(), b44_init_tx_ring(), efx_hunt_alloc_special_buffer(), ehci_bus_open(), ehci_ring_alloc(), ena_create_admin(), ena_create_async(), ena_create_cq(), ena_create_sq(), ena_probe(), exanic_probe(), falcon_alloc_special_buffer(), golan_cmd_init(), golan_create_cq(), golan_create_eq(), golan_create_qp_aux(), hermon_alloc(), hermon_create_cq(), hermon_create_eq(), hermon_create_qp(), hv_alloc_message(), hv_alloc_pages(), hvm_map_hypercall(), icplus_create_ring(), ifec_net_open(), ifec_tx_setup(), igbvf_setup_rx_resources(), igbvf_setup_tx_resources(), jme_alloc_rx_resources(), jme_alloc_tx_resources(), legacy_probe(), linda_create_recv_wq(), linda_init_send(), mlx_memory_alloc_dma_priv(), myri10ge_net_open(), myson_create_ring(), natsemi_create_ring(), netfront_create_ring(), nv_init_rings(), pcnet32_setup_rx_resources(), pcnet32_setup_tx_resources(), phantom_create_rx_ctx(), phantom_create_tx_ctx(), phantom_open(), qib7322_create_recv_wq(), qib7322_init_send(), rhine_create_ring(), rtl818x_init_rx_ring(), rtl818x_init_tx_ring(), sis190_open(), skge_up(), sky2_probe(), sky2_up(), tg3_alloc_consistent(), tg3_test_dma(), uhci_bus_open(), uhci_enqueue(), uhci_ring_alloc(), velocity_alloc_rings(), vmbus_open(), and vmxnet3_open().

◆ free_phys()

void free_phys ( void *  ptr,
size_t  size 
)

Free memory allocated with malloc_phys()

Parameters
ptrMemory allocated by malloc_phys(), or NULL
sizeSize of memory, as passed to malloc_phys()

Memory allocated with malloc_phys() can only be freed with free_phys(); it cannot be freed with the standard free().

If ptr is NULL, no action is taken.

Definition at line 722 of file malloc.c.

722  {
723 
724  VALGRIND_FREELIKE_BLOCK ( ptr, 0 );
725  heap_free_block ( &heap, ptr, size );
726 }
uint16_t size
Buffer size.
Definition: dwmac.h:14
A heap.
Definition: malloc.h:44
static void heap_free_block(struct heap *heap, void *ptr, size_t size)
Free a memory block.
Definition: malloc.c:406
#define VALGRIND_FREELIKE_BLOCK(addr, rzB)
Definition: valgrind.h:4421

References heap_free_block(), size, and VALGRIND_FREELIKE_BLOCK.

Referenced by __vxge_hw_fifo_delete(), __vxge_hw_ring_delete(), a3c90x_free_rx_ring(), a3c90x_free_tx_ring(), alloc_iob_raw(), arbel_alloc(), arbel_alloc_icm(), arbel_create_cq(), arbel_create_eq(), arbel_create_qp(), arbel_create_recv_wq(), arbel_destroy_cq(), arbel_destroy_eq(), arbel_destroy_qp(), arbel_free(), arbel_free_icm(), ath5k_desc_alloc(), ath5k_desc_free(), ath_descdma_cleanup(), ath_descdma_setup(), atl1e_free_ring_resources(), b44_free_rx_ring(), b44_free_tx_ring(), b44_init_rx_ring(), b44_init_tx_ring(), efx_hunt_free_special_buffer(), ehci_bus_close(), ehci_bus_open(), ehci_ring_alloc(), ehci_ring_free(), ena_create_admin(), ena_create_async(), ena_create_cq(), ena_create_sq(), ena_destroy_admin(), ena_destroy_async(), ena_destroy_cq(), ena_destroy_sq(), ena_probe(), ena_remove(), exanic_probe(), exanic_remove(), falcon_free_special_buffer(), free_iob(), golan_cmd_init(), golan_cmd_uninit(), golan_create_cq(), golan_create_eq(), golan_create_qp_aux(), golan_destory_eq(), golan_destroy_cq(), golan_destroy_qp(), hermon_alloc(), hermon_create_cq(), hermon_create_eq(), hermon_create_qp(), hermon_destroy_cq(), hermon_destroy_eq(), hermon_destroy_qp(), hermon_free(), hv_alloc_pages(), hv_free_message(), hv_free_pages(), hvm_unmap_hypercall(), icplus_create_ring(), icplus_destroy_ring(), ifec_free(), ifec_net_open(), igbvf_free_rx_resources(), igbvf_free_tx_resources(), jme_free_rx_resources(), jme_free_tx_resources(), legacy_probe(), legacy_remove(), linda_create_recv_wq(), linda_destroy_recv_wq(), linda_fini_send(), linda_init_send(), mlx_memory_free_dma_priv(), myri10ge_net_close(), myri10ge_net_open(), myson_create_ring(), myson_destroy_ring(), natsemi_create_ring(), natsemi_destroy_ring(), netfront_create_ring(), netfront_destroy_ring(), nv_free_rxtx_resources(), pcnet32_free_rx_resources(), pcnet32_free_tx_resources(), phantom_close(), phantom_create_rx_ctx(), phantom_create_tx_ctx(), phantom_open(), qib7322_create_recv_wq(), qib7322_destroy_recv_wq(), qib7322_fini_send(), qib7322_init_send(), rhine_destroy_ring(), rtl818x_free_rx_ring(), rtl818x_free_tx_ring(), sis190_free(), skge_free(), sky2_free_rings(), sky2_probe(), sky2_remove(), tg3_free_consistent(), tg3_rx_prodring_fini(), tg3_test_dma(), uhci_bus_close(), uhci_bus_open(), uhci_dequeue(), uhci_enqueue(), uhci_ring_alloc(), uhci_ring_free(), velocity_alloc_rings(), velocity_close(), vmbus_close(), vmbus_open(), vmxnet3_close(), and vmxnet3_open().

◆ heap_populate()

void heap_populate ( struct heap heap,
void *  start,
size_t  len 
)

Add memory to allocation pool.

Parameters
heapHeap
startStart address
lenLength of memory

Adds a block of memory to the allocation pool. The memory must be aligned to the heap's required free memory block alignment.

Definition at line 738 of file malloc.c.

738  {
739 
740  /* Sanity checks */
741  assert ( ( virt_to_phys ( start ) & ( heap->align - 1 ) ) == 0 );
742  assert ( ( len & ( heap->align - 1 ) ) == 0 );
743 
744  /* Add to allocation pool */
746 
747  /* Fix up memory usage statistics */
748  heap->usedmem += len;
749 }
uint32_t start
Starting offset.
Definition: netvsc.h:12
assert((readw(&hdr->flags) &(GTF_reading|GTF_writing))==0)
ring len
Length.
Definition: dwmac.h:231
size_t usedmem
Total amount of used memory.
Definition: malloc.h:56
A heap.
Definition: malloc.h:44
static void heap_free_block(struct heap *heap, void *ptr, size_t size)
Free a memory block.
Definition: malloc.c:406
size_t align
Alignment for free memory blocks.
Definition: malloc.h:49

References heap::align, assert(), heap_free_block(), len, start, and heap::usedmem.

Referenced by init_heap(), and uheap_grow().

◆ init_heap()

static void init_heap ( void  )
static

Initialise the heap.

Definition at line 755 of file malloc.c.

755  {
756 
757  /* Sanity check */
758  build_assert ( MIN_MEMBLOCK_ALIGN >= sizeof ( struct memory_block ) );
759 
760  /* Populate heap */
763  heap_populate ( &heap, heap_area, sizeof ( heap_area ) );
764 }
static char heap_area[HEAP_SIZE]
The heap area.
Definition: malloc.c:87
void heap_populate(struct heap *heap, void *start, size_t len)
Add memory to allocation pool.
Definition: malloc.c:738
#define build_assert(condition)
Assert a condition at build time (after dead code elimination)
Definition: assert.h:76
#define VALGRIND_MAKE_MEM_NOACCESS(_qzz_addr, _qzz_len)
Definition: memcheck.h:111
#define MIN_MEMBLOCK_ALIGN
Physical address alignment maintained for free blocks of memory.
Definition: malloc.c:66
A free block of memory.
Definition: malloc.c:43
struct list_head blocks
List of free memory blocks.
Definition: malloc.h:46
A heap.
Definition: malloc.h:44

References heap::blocks, build_assert, heap_area, heap_populate(), MIN_MEMBLOCK_ALIGN, and VALGRIND_MAKE_MEM_NOACCESS.

◆ __init_fn()

struct init_fn heap_init_fn __init_fn ( INIT_EARLY  )

Memory allocator initialisation function.

◆ shutdown_cache()

static void shutdown_cache ( int booting  __unused)
static

Discard all cached data on shutdown.

Definition at line 776 of file malloc.c.

776  {
778  DBGC ( &heap, "HEAP maximum usage %zdkB\n",
779  ( heap.maxusedmem >> 10 ) );
780 }
#define DBGC(...)
Definition: compiler.h:505
static void discard_all_cache(void)
Discard all cached data.
Definition: malloc.c:243
size_t maxusedmem
Maximum amount of used memory.
Definition: malloc.h:58
A heap.
Definition: malloc.h:44

References DBGC, discard_all_cache(), and heap::maxusedmem.

◆ __startup_fn()

struct startup_fn heap_startup_fn __startup_fn ( STARTUP_EARLY  )

Memory allocator shutdown function.

◆ heap_dump()

void heap_dump ( struct heap heap)

Dump free block list (for debugging)

Definition at line 792 of file malloc.c.

792  {
793  struct memory_block *block;
794 
795  dbg_printf ( "HEAP free block list:\n" );
797  dbg_printf ( "...[%p,%p] (size %#zx)\n", block,
798  ( ( ( void * ) block ) + block->size ),
799  block->size );
800  }
801 }
struct list_head list
List of free blocks.
Definition: malloc.c:58
#define list_for_each_entry(pos, head, member)
Iterate over entries in a list.
Definition: list.h:431
A free block of memory.
Definition: malloc.c:43
struct list_head blocks
List of free memory blocks.
Definition: malloc.h:46
uint8_t block[3][8]
DES-encrypted blocks.
Definition: mschapv2.h:12
A heap.
Definition: malloc.h:44
void dbg_printf(const char *fmt,...)
Print debug message.
Definition: debug.c:38

References block, heap::blocks, dbg_printf(), memory_block::list, and list_for_each_entry.

Variable Documentation

◆ heap_area

char heap_area[HEAP_SIZE]
static

The heap area.

Definition at line 87 of file malloc.c.

Referenced by init_heap().

◆ heap

struct heap heap
static
Initial value:
= {
.blocks = LIST_HEAD_INIT ( heap.blocks ),
.ptr_align = sizeof ( void * ),
.grow = discard_cache,
}
static unsigned int discard_cache(size_t size __unused)
Discard some cached data.
Definition: malloc.c:227
#define MIN_MEMBLOCK_ALIGN
Physical address alignment maintained for free blocks of memory.
Definition: malloc.c:66
struct list_head blocks
List of free memory blocks.
Definition: malloc.h:46
A heap.
Definition: malloc.h:44
#define LIST_HEAD_INIT(list)
Initialise a static list head.
Definition: list.h:30

The global heap.

Definition at line 592 of file malloc.c.