Lines Matching refs:mmhead
132 static void addsize(k_mm_head *mmhead, size_t size, size_t req_size) in addsize() argument
136 if (mmhead->free_size > size) { in addsize()
137 mmhead->free_size -= size; in addsize()
139 mmhead->free_size = 0; in addsize()
142 mmhead->used_size += size; in addsize()
143 if (mmhead->used_size > mmhead->maxused_size) { in addsize()
144 mmhead->maxused_size = mmhead->used_size; in addsize()
150 mmhead->alloc_times[level]++; in addsize()
155 static void removesize(k_mm_head *mmhead, size_t size) in removesize() argument
157 if (mmhead->used_size > size) { in removesize()
158 mmhead->used_size -= size; in removesize()
160 mmhead->used_size = 0; in removesize()
162 mmhead->free_size += size; in removesize()
166 #define stats_addsize(mmhead, size, req_size) addsize(mmhead, size, req_size) argument
168 #define stats_removesize(mmhead, size) removesize(mmhead, size) argument
170 #define stats_addsize(mmhead, size, req_size) do {} while (0) argument
171 #define stats_removesize(mmhead, size) do {} while (0) argument
262 kstat_t krhino_deinit_mm_head(k_mm_head *mmhead) in krhino_deinit_mm_head() argument
265 krhino_mutex_del(&mmhead->mm_mutex); in krhino_deinit_mm_head()
268 memset(mmhead, 0, sizeof(k_mm_head)); in krhino_deinit_mm_head()
273 kstat_t krhino_add_mm_region(k_mm_head *mmhead, void *addr, size_t len) in krhino_add_mm_region() argument
283 NULL_PARA_CHK(mmhead); in krhino_add_mm_region()
298 MM_CRITICAL_ENTER(mmhead, flags_cpsr); in krhino_add_mm_region()
305 region->next = mmhead->regioninfo; in krhino_add_mm_region()
306 mmhead->regioninfo = region; in krhino_add_mm_region()
319 mmhead->used_size += MM_GET_BLK_SIZE(nextblk); in krhino_add_mm_region()
322 MM_CRITICAL_EXIT(mmhead, flags_cpsr); in krhino_add_mm_region()
325 k_mm_free(mmhead, nextblk->mbinfo.buffer); in krhino_add_mm_region()
331 static void k_mm_freelist_insert(k_mm_head *mmhead, k_mm_list_t *blk) in k_mm_freelist_insert() argument
341 blk->mbinfo.free_ptr.next = mmhead->freelist[level]; in k_mm_freelist_insert()
343 if (mmhead->freelist[level] != NULL) { in k_mm_freelist_insert()
344 mmhead->freelist[level]->mbinfo.free_ptr.prev = blk; in k_mm_freelist_insert()
347 mmhead->freelist[level] = blk; in k_mm_freelist_insert()
350 mmhead->free_bitmap |= (1 << level); in k_mm_freelist_insert()
353 static void k_mm_freelist_delete(k_mm_head *mmhead, k_mm_list_t *blk) in k_mm_freelist_delete() argument
369 if (mmhead->freelist[level] == blk) { in k_mm_freelist_delete()
371 mmhead->freelist[level] = blk->mbinfo.free_ptr.next; in k_mm_freelist_delete()
372 if (mmhead->freelist[level] == NULL) { in k_mm_freelist_delete()
374 mmhead->free_bitmap &= (~(1 << level)); in k_mm_freelist_delete()
382 static k_mm_list_t *find_up_level(k_mm_head *mmhead, int32_t level) in find_up_level() argument
386 bitmap = mmhead->free_bitmap & (0xfffffffful << (level + 1)); in find_up_level()
390 return mmhead->freelist[level]; in find_up_level()
396 void *k_mm_alloc(k_mm_head *mmhead, size_t size) in k_mm_alloc() argument
405 if (!mmhead) { in k_mm_alloc()
413 MM_CRITICAL_ENTER(mmhead, flags_cpsr); in k_mm_alloc()
417 if (mmhead->fix_pool != NULL && size <= RHINO_CONFIG_MM_BLK_SIZE) { in k_mm_alloc()
418 retptr = krhino_mblk_alloc_nolock((mblk_pool_t *)mmhead->fix_pool, size); in k_mm_alloc()
420 MM_CRITICAL_EXIT(mmhead, flags_cpsr); in k_mm_alloc()
437 get_b = find_up_level(mmhead, level); in k_mm_alloc()
440 get_b = mmhead->freelist[level]; in k_mm_alloc()
455 get_b = mmhead->freelist[level]; in k_mm_alloc()
465 get_b = find_up_level(mmhead, level); in k_mm_alloc()
473 k_mm_freelist_delete(mmhead, get_b); in k_mm_alloc()
493 k_mm_freelist_insert(mmhead, new_b); in k_mm_alloc()
507 stats_addsize(mmhead, MM_GET_BLK_SIZE(get_b), req_size); in k_mm_alloc()
512 MM_CRITICAL_EXIT(mmhead, flags_cpsr); in k_mm_alloc()
517 void k_mm_free(k_mm_head *mmhead, void *ptr) in k_mm_free() argument
523 if (!ptr || !mmhead) { in k_mm_free()
527 MM_CRITICAL_ENTER(mmhead, flags_cpsr); in k_mm_free()
530 if (krhino_mblk_check(mmhead->fix_pool, ptr)) { in k_mm_free()
531 (void)krhino_mblk_free_nolock((mblk_pool_t *)mmhead->fix_pool, ptr); in k_mm_free()
532 MM_CRITICAL_EXIT(mmhead, flags_cpsr); in k_mm_free()
563 stats_removesize(mmhead, MM_GET_BLK_SIZE(free_b)); in k_mm_free()
585 k_mm_freelist_delete(mmhead, next_b); in k_mm_free()
592 k_mm_freelist_delete(mmhead, prev_b); in k_mm_free()
598 k_mm_freelist_insert(mmhead, free_b); in k_mm_free()
604 MM_CRITICAL_EXIT(mmhead, flags_cpsr); in k_mm_free()
607 void *k_mm_realloc(k_mm_head *mmhead, void *oldmem, size_t new_size) in k_mm_realloc() argument
621 return (void *)k_mm_alloc(mmhead, new_size); in k_mm_realloc()
626 k_mm_free(mmhead, oldmem); in k_mm_realloc()
633 if (krhino_mblk_check(mmhead->fix_pool, oldmem)) { in k_mm_realloc()
634 ptr_aux = k_mm_alloc(mmhead, new_size); in k_mm_realloc()
636 int cp_len = krhino_mblk_get_size(mmhead->fix_pool, oldmem); in k_mm_realloc()
639 MM_CRITICAL_ENTER(mmhead, flags_cpsr); in k_mm_realloc()
640 (void)krhino_mblk_free_nolock((mblk_pool_t *)mmhead->fix_pool, oldmem); in k_mm_realloc()
641 MM_CRITICAL_EXIT(mmhead, flags_cpsr); in k_mm_realloc()
646 MM_CRITICAL_ENTER(mmhead, flags_cpsr); in k_mm_realloc()
656 stats_removesize(mmhead, MM_GET_BLK_SIZE(this_b)); in k_mm_realloc()
659 k_mm_freelist_delete(mmhead, next_b); in k_mm_realloc()
684 k_mm_freelist_insert(mmhead, split_b); in k_mm_realloc()
686 stats_addsize(mmhead, MM_GET_BLK_SIZE(this_b), req_size); in k_mm_realloc()
691 stats_removesize(mmhead, MM_GET_BLK_SIZE(this_b)); in k_mm_realloc()
694 k_mm_freelist_delete(mmhead, next_b); in k_mm_realloc()
720 k_mm_freelist_insert(mmhead, split_b); in k_mm_realloc()
722 stats_addsize(mmhead, MM_GET_BLK_SIZE(this_b), req_size); in k_mm_realloc()
735 MM_CRITICAL_EXIT(mmhead, flags_cpsr); in k_mm_realloc()
739 MM_CRITICAL_EXIT(mmhead, flags_cpsr); in k_mm_realloc()
742 ptr_aux = k_mm_alloc(mmhead, new_size); in k_mm_realloc()
750 k_mm_free(mmhead, oldmem); in k_mm_realloc()