[PATCH 2/2] malloc_simple: add mem_malloc_init_simple()

Rasmus Villemoes rasmus.villemoes at prevas.dk
Fri Sep 15 19:50:50 CEST 2023


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 at 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
-- 
2.37.2



More information about the U-Boot mailing list