[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