Re: [PATCH] board_f: Call initf_malloc() before fdtdec_setup()

Simon Glass <[email protected]>
Newsgroups gmane.comp.boot-loaders.u-boot
Message-ID <CAFLszThbzKZWctdWh8B1j2cqACr+9dNVaX_FMkvbHtXkMDnsTg__4571.80705140985$1786213089$gmane$org@mail.gmail.com>
Hi Marek,

On Tue, 21 Jul 2026 at 13:48, Marek Vasut
<[email protected]> wrote:
>
> In case MULTI_DTB_FIT_GZIP is enabled, fdtdec_setup() does uncompress
> the compressed DTs in uncompress_blob() using gunzip(), which invokes
> malloc() internally. The early simple malloc is initialized in board_f
> initf_malloc() call, which sets up the early simple malloc limit and
> offset pointer in global data. Currently, the initf_malloc() is called
> after fdtdec_setup(), which leads to malloc failure in fdtdec_setup()
> during the gzip decompression, because the early simple malloc is not
> initialized yet.
>
> Call initf_malloc() before fdtdec_setup() to assure fdtdec_setup() can
> use malloc() during gzip decompression of the DTs.
>
> The impact of this change on boot time is negligible, because the
> initf_malloc() only assigns two fields in global data.
>
> Signed-off-by: Marek Vasut <[email protected]>
> ---
> Cc: Ilias Apalodimas <[email protected]>
> Cc: Simon Glass <[email protected]>
> Cc: Tom Rini <[email protected]>
> Cc: [email protected]
> ---
>  common/board_f.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)

I'm not keen on reordering this list...

The offending call is inside uncompress_blob(), which already has a
non-malloc path - MULTI_DTB_FIT_USER_DEFINED_AREA with
MULTI_DTB_FIT_USER_DEF_ADDR. That is the pattern most boards using
compressed multi-DTB FIT already use, and it avoids early malloc
altogether. Could the BTT config not just switch to that and drop the
board-local initf_malloc() workaround at the same time?

Failing that, the per-board workaround in board/liebherr/btt/btt.c is
ugly but localised. If we really want a generic fix, I would rather
see uncompress_blob() call initf_malloc() itself when it needs the
heap, so the ordering constraint stays local to the code that needs
it. We would need to ensure that malloc() isn't then inited a second
time. We could always add a flag to gd->boardf, I suppose.

The reordering also means that malloc cannot be traced - the idea with
trace is that it is enabled as early as possible. Finally (that I can
think of), it means that early malloc can never be configured by the
devicetree (although that is not something we have needed yet).

Regards,
Simon
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.