Hi Rasmus, On Fri, 15 Sept 2023 at 11:51, Rasmus Villemoes <rasmus.villem...@prevas.dk> wrote: > > 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.villem...@prevas.dk> > --- > common/dlmalloc.c | 2 +- > common/malloc_simple.c | 7 +++++++ > include/malloc.h | 7 +++++-- > 3 files changed, 13 insertions(+), 3 deletions(-)
Reviewed-by: Simon Glass <s...@chromium.org> width change below > > 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); Please add a full comment here > + > # 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); Please add a full comment here > > #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 > Regards, Simon