Lines Matching full:chunk
86 static void dump_free_chunk(struct free_heap_chunk *chunk) in dump_free_chunk() argument
88 …INFO, "\t\tbase %p, end 0x%" PRIxVADDR ", len 0x%zx\n", chunk, (vaddr_t)chunk + chunk->len, chunk-… in dump_free_chunk()
99 struct free_heap_chunk *chunk; in miniheap_dump() local
100 list_for_every_entry(&theheap.free_list, chunk, struct free_heap_chunk, node) { in miniheap_dump()
101 dump_free_chunk(chunk); in miniheap_dump()
107 // try to insert this free chunk into the free list, consuming the chunk by merging it with
108 // nearby ones if possible. Returns base of whatever chunk it became in the list.
109 static struct free_heap_chunk *heap_insert_free_chunk(struct free_heap_chunk *chunk) in heap_insert_free_chunk() argument
112 vaddr_t chunk_end = (vaddr_t)chunk + chunk->len; in heap_insert_free_chunk()
115 LTRACEF("chunk ptr %p, size 0x%zx\n", chunk, chunk->len); in heap_insert_free_chunk()
122 theheap.remaining += chunk->len; in heap_insert_free_chunk()
129 if (chunk < next_chunk) { in heap_insert_free_chunk()
134 list_add_before(&next_chunk->node, &chunk->node); in heap_insert_free_chunk()
141 list_add_tail(&theheap.free_list, &chunk->node); in heap_insert_free_chunk()
143 // try to merge with the previous chunk in heap_insert_free_chunk()
145 last_chunk = list_prev_type(&theheap.free_list, &chunk->node, struct free_heap_chunk, node); in heap_insert_free_chunk()
147 if ((vaddr_t)last_chunk + last_chunk->len == (vaddr_t)chunk) { in heap_insert_free_chunk()
148 // easy, just extend the previous chunk in heap_insert_free_chunk()
149 last_chunk->len += chunk->len; in heap_insert_free_chunk()
152 list_delete(&chunk->node); in heap_insert_free_chunk()
154 // set the chunk pointer to the newly extended chunk, in case in heap_insert_free_chunk()
155 // it needs to merge with the next chunk below in heap_insert_free_chunk()
156 chunk = last_chunk; in heap_insert_free_chunk()
160 // try to merge with the next chunk in heap_insert_free_chunk()
162 if ((vaddr_t)chunk + chunk->len == (vaddr_t)next_chunk) { in heap_insert_free_chunk()
163 // extend our chunk in heap_insert_free_chunk()
164 chunk->len += next_chunk->len; in heap_insert_free_chunk()
173 return chunk; in heap_insert_free_chunk()
186 struct free_heap_chunk *chunk = (struct free_heap_chunk *)ptr; in heap_create_free_chunk() local
187 chunk->len = len; in heap_create_free_chunk()
189 return chunk; in heap_create_free_chunk()
246 struct free_heap_chunk *chunk; in miniheap_memalign() local
247 list_for_every_entry(&theheap.free_list, chunk, struct free_heap_chunk, node) { in miniheap_memalign()
248 …DEBUG_ASSERT((chunk->len % sizeof(void *)) == 0); // len should always be a multiple of pointer si… in miniheap_memalign()
251 if (chunk->len >= size) { in miniheap_memalign()
252 ptr = chunk; in miniheap_memalign()
255 struct list_node *next_node = list_next(&theheap.free_list, &chunk->node); in miniheap_memalign()
256 list_delete(&chunk->node); in miniheap_memalign()
258 if (chunk->len > size + sizeof(struct free_heap_chunk)) { in miniheap_memalign()
259 // there's enough space in this chunk to create a new one after the allocation in miniheap_memalign()
260 …free_heap_chunk *newchunk = heap_create_free_chunk((uint8_t *)ptr + size, chunk->len - size, true); in miniheap_memalign()
262 // truncate this chunk in miniheap_memalign()
263 chunk->len -= chunk->len - size; in miniheap_memalign()
265 // add the new one where chunk used to be in miniheap_memalign()
272 // the allocated size is actually the length of this chunk, not the size requested in miniheap_memalign()
273 DEBUG_ASSERT(chunk->len >= size); in miniheap_memalign()
274 size = chunk->len; in miniheap_memalign()
292 as->ptr = (void *)chunk; in miniheap_memalign()
301 as->padding_size = (((addr_t)chunk + size) - ((addr_t)ptr + original_size)); in miniheap_memalign()
302 … printf("padding start %p, size %u, chunk %p, size %u\n", as->padding_start, as->padding_s… in miniheap_memalign()
319 * grown chunk before we get the heaplock again. in miniheap_memalign()
384 // looks good, create a free chunk and add it to the pool in miniheap_free()
399 struct free_heap_chunk *chunk; in miniheap_trim() local
401 list_for_every_entry_safe(&theheap.free_list, chunk, next_chunk, struct free_heap_chunk, node) { in miniheap_trim()
402 LTRACEF("looking at chunk %p, len 0x%zx\n", chunk, chunk->len); in miniheap_trim()
404 uintptr_t start = (uintptr_t)chunk; in miniheap_trim()
405 uintptr_t end = start + chunk->len; in miniheap_trim()
423 // look for special case, we're going to completely remove the chunk in miniheap_trim()
425 LTRACEF("special case, free chunk completely covers page(s)\n"); in miniheap_trim()
426 list_delete(&chunk->node); in miniheap_trim()
433 LTRACEF("not enough space for free chunk before\n"); in miniheap_trim()
442 LTRACEF("will have to split, new chunk will be 0x%zx bytes long\n", new_chunk_size); in miniheap_trim()
444 … // if there's not enough space afterwards for a free chunk, we can't free the last page in miniheap_trim()
446 LTRACEF("not enough space for free chunk afterwards\n"); in miniheap_trim()
451 // trim the new space off the end of the current chunk in miniheap_trim()
452 chunk->len -= new_chunk_size; in miniheap_trim()
455 // create a new chunk after the one we're trimming in miniheap_trim()
459 list_add_after(&chunk->node, &new_chunk->node); in miniheap_trim()
464 … LTRACEF("special case, after splitting off new chunk, free chunk completely covers page(s)\n"); in miniheap_trim()
465 list_delete(&chunk->node); in miniheap_trim()
470 chunk->len -= end_page - start_page; in miniheap_trim()
487 struct free_heap_chunk *chunk; in miniheap_get_stats() local
496 list_for_every_entry(&theheap.free_list, chunk, struct free_heap_chunk, node) { in miniheap_get_stats()
497 ptr->heap_free += chunk->len; in miniheap_get_stats()
499 if (chunk->len > ptr->heap_max_chunk) { in miniheap_get_stats()
500 ptr->heap_max_chunk = chunk->len; in miniheap_get_stats()