From 6141600b612aada94015182fccb16041ba75ba5f Mon Sep 17 00:00:00 2001 From: Guillaume Souchere Date: Thu, 3 Nov 2022 08:44:56 +0100 Subject: [PATCH] heap: add selective placement of function in IRAM This commit aims to place in the IRAM section only the functions that are relevent for performance instead of placing the entire content of multi_heap.c, mullti_heap_poisoning.c and tlsf.c in the IRAM. --- components/heap/heap_private.h | 2 +- components/heap/linker.lf | 46 +++++++++++++++++++++++++++++++--- components/heap/multi_heap.c | 19 +++----------- 3 files changed, 47 insertions(+), 20 deletions(-) diff --git a/components/heap/heap_private.h b/components/heap/heap_private.h index 5e172c034b..345ae032c8 100644 --- a/components/heap/heap_private.h +++ b/components/heap/heap_private.h @@ -51,7 +51,7 @@ extern SLIST_HEAD(registered_heap_ll, heap_t_) registered_heaps; bool heap_caps_match(const heap_t *heap, uint32_t caps); /* return all possible capabilities (across all priorities) for a given heap */ -inline static IRAM_ATTR uint32_t get_all_caps(const heap_t *heap) +inline static uint32_t get_all_caps(const heap_t *heap) { if (heap->heap == NULL) { return 0; diff --git a/components/heap/linker.lf b/components/heap/linker.lf index a2be01e113..1b29d7c24f 100644 --- a/components/heap/linker.lf +++ b/components/heap/linker.lf @@ -1,7 +1,47 @@ [mapping:heap] archive: libheap.a entries: - heap_tlsf (noflash) - multi_heap (noflash) + heap_tlsf:tlsf_ffs (noflash) + heap_tlsf:tlsf_fls (noflash) + heap_tlsf:tlsf_block_size (noflash) + heap_tlsf:tlsf_size (noflash) + heap_tlsf:tlsf_align_size (noflash) + heap_tlsf:tlsf_block_size_min (noflash) + heap_tlsf:tlsf_block_size_max (noflash) + heap_tlsf:tlsf_alloc_overhead (noflash) + heap_tlsf:tlsf_get_pool (noflash) + heap_tlsf:tlsf_malloc (noflash) + heap_tlsf:tlsf_memalign_offs (noflash) + heap_tlsf:tlsf_memalign (noflash) + heap_tlsf:tlsf_free (noflash) + heap_tlsf:tlsf_realloc (noflash) + + multi_heap:assert_valid_block (noflash) + multi_heap:multi_heap_get_block_address_impl (noflash) + multi_heap:multi_heap_get_allocated_size_impl (noflash) + multi_heap:multi_heap_set_lock (noflash) + multi_heap:multi_heap_get_first_block (noflash) + multi_heap:multi_heap_get_next_block (noflash) + multi_heap:multi_heap_is_free (noflash) + multi_heap:multi_heap_malloc_impl (noflash) + multi_heap:multi_heap_free_impl (noflash) + multi_heap:multi_heap_realloc_impl (noflash) + multi_heap:multi_heap_aligned_alloc_impl_offs (noflash) + multi_heap:multi_heap_aligned_alloc_impl (noflash) + if HEAP_POISONING_DISABLED = n: - multi_heap_poisoning (noflash) + multi_heap_poisoning:poison_allocated_region (noflash) + multi_heap_poisoning:verify_allocated_region (noflash) + multi_heap_poisoning:multi_heap_aligned_alloc (noflash) + multi_heap_poisoning:multi_heap_malloc (noflash) + multi_heap_poisoning:multi_heap_free (noflash) + multi_heap_poisoning:multi_heap_aligned_free (noflash) + multi_heap_poisoning:multi_heap_realloc (noflash) + multi_heap_poisoning:multi_heap_get_block_address (noflash) + multi_heap_poisoning:multi_heap_get_block_owner (noflash) + multi_heap_poisoning:multi_heap_get_allocated_size (noflash) + multi_heap_poisoning:multi_heap_internal_check_block_poisoning (noflash) + multi_heap_poisoning:multi_heap_internal_poison_fill_region (noflash) + + if HEAP_POISONING_COMPREHENSIVE = y: + multi_heap_poisoning:verify_fill_pattern (noflash) diff --git a/components/heap/multi_heap.c b/components/heap/multi_heap.c index 6b0d0a2c93..fd7183ac27 100644 --- a/components/heap/multi_heap.c +++ b/components/heap/multi_heap.c @@ -85,18 +85,6 @@ typedef struct multi_heap_info { tlsf_t heap_data; } heap_t; -/* Return true if this block is free. */ -static inline bool is_free(const block_header_t *block) -{ - return ((block->size & 0x01) != 0); -} - -/* Data size of the block (excludes this block's header) */ -static inline size_t block_data_size(const block_header_t *block) -{ - return (block->size & ~0x03); -} - /* Check a block is valid for this heap. Used to verify parameters. */ static void assert_valid_block(const heap_t *heap, const block_header_t *block) { @@ -110,8 +98,7 @@ static void assert_valid_block(const heap_t *heap, const block_header_t *block) void *multi_heap_get_block_address_impl(multi_heap_block_handle_t block) { - void *ptr = block_to_ptr(block); - return (ptr); + return block_to_ptr(block); } size_t multi_heap_get_allocated_size_impl(multi_heap_handle_t heap, void *p) @@ -175,7 +162,7 @@ multi_heap_block_handle_t multi_heap_get_next_block(multi_heap_handle_t heap, mu assert_valid_block(heap, block); block_header_t* next = block_next(block); - if(block_data_size(next) == 0) { + if(block_size(next) == 0) { //Last block: return NULL; } else { @@ -186,7 +173,7 @@ multi_heap_block_handle_t multi_heap_get_next_block(multi_heap_handle_t heap, mu bool multi_heap_is_free(multi_heap_block_handle_t block) { - return is_free(block); + return block_is_free(block); } void *multi_heap_malloc_impl(multi_heap_handle_t heap, size_t size)