
I was running out of malloc() in SPL, and the message told me to look at CONFIG_SYS_SPL_MALLOC_SIZE. So I did, and bumped it quite a bit, but that had no effect whatsoever.
The reason for that was that I also have CONFIG_SPL_SYS_MALLOC_SIMPLE=y. So while board_init_r() in spl.c duly calls
mem_malloc_init(SYS_SPL_MALLOC_START, CONFIG_SYS_SPL_MALLOC_SIZE);
that doesn't actually do anything, because that function just sets some variables in dlmalloc.c, and (as the linker map shows), the rest of dlmalloc.o has been garbage-collected.
I don't want to have the full dlmalloc implementation in SPL - code size is still precious. However, once SDRAM is initialized, the heap is practically infinite, if only CONFIG_SYS_SPL_MALLOC_SIZE actually had an effect.
So just as CONFIG_SPL_SYS_MALLOC_SIMPLE redirects malloc() and friends at build-time to the _simple variants, add a _simple variant of mem_malloc_init() which will actually update the bookkeeping variables relevant to the actual and active malloc() implementation.
Signed-off-by: Rasmus Villemoes rasmus.villemoes@prevas.dk --- common/dlmalloc.c | 2 +- common/malloc_simple.c | 7 +++++++ include/malloc.h | 7 +++++-- 3 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/common/dlmalloc.c b/common/dlmalloc.c index dcecdb8623..d42b26410f 100644 --- a/common/dlmalloc.c +++ b/common/dlmalloc.c @@ -619,7 +619,7 @@ void *sbrk(ptrdiff_t increment) return (void *)old; }
-void mem_malloc_init(ulong start, ulong size) +void mem_dlmalloc_init(ulong start, ulong size) { mem_malloc_start = start; mem_malloc_end = start + size; diff --git a/common/malloc_simple.c b/common/malloc_simple.c index 0a004d40e1..9ecf05cf2e 100644 --- a/common/malloc_simple.c +++ b/common/malloc_simple.c @@ -17,6 +17,13 @@
DECLARE_GLOBAL_DATA_PTR;
+void mem_malloc_init_simple(ulong start, ulong size) +{ + gd->malloc_base = start; + gd->malloc_ptr = 0; + gd->malloc_limit = size; +} + static void *alloc_simple(size_t bytes, int align) { ulong addr, new_ptr; diff --git a/include/malloc.h b/include/malloc.h index 161ccbd129..f59942115b 100644 --- a/include/malloc.h +++ b/include/malloc.h @@ -899,6 +899,7 @@ void malloc_disable_testing(void); #define malloc malloc_simple #define realloc realloc_simple #define memalign memalign_simple +#define mem_malloc_init mem_malloc_init_simple #if IS_ENABLED(CONFIG_VALGRIND) #define free free_simple #else @@ -908,6 +909,9 @@ void *calloc(size_t nmemb, size_t size); void *realloc_simple(void *ptr, size_t size); #else
+#define mem_malloc_init mem_dlmalloc_init +void mem_dlmalloc_init(ulong start, ulong size); + # ifdef USE_DL_PREFIX # define cALLOc dlcalloc # define fREe dlfree @@ -955,6 +959,7 @@ int initf_malloc(void); /* Simple versions which can be used when space is tight */ void *malloc_simple(size_t size); void *memalign_simple(size_t alignment, size_t bytes); +void mem_malloc_init_simple(ulong start, ulong size);
#pragma GCC visibility push(hidden) # if __STD_C @@ -997,8 +1002,6 @@ extern ulong mem_malloc_start; extern ulong mem_malloc_end; extern ulong mem_malloc_brk;
-void mem_malloc_init(ulong start, ulong size); - #ifdef __cplusplus }; /* end of extern "C" */ #endif