From: Ahmad Fatoum <a.fatoum@pengutronix.de>
To: chalianis1@gmail.com, s.hauer@pengutronix.de
Cc: barebox@lists.infradead.org, Ahmad Fatoum <a.fatoum@barebox.org>
Subject: Re: [PATCH 06/11] efi: payload: earlymem: allocate only the barebox needs in term of memory
Date: Mon, 6 Oct 2025 13:32:33 +0200 [thread overview]
Message-ID: <87b37585-46c9-4f50-b73c-91a517ef4547@pengutronix.de> (raw)
In-Reply-To: <20251006041512.1360284-6-chalianis1@gmail.com>
On 10/6/25 6:15 AM, chalianis1@gmail.com wrote:
> From: Chali Anis <chalianis1@gmail.com>
>
> With TLSF now able to invoke a callback to request additional memory on
> demand, limit early allocations to what barebox strictly requires and have
> everything handled via the request callback. This ensures more deterministic
> behavior and reduces the risk of OOM conditions.
>
> Signed-off-by: Ahmad Fatoum <a.fatoum@barebox.org>
> Signed-off-by: Chali Anis <chalianis1@gmail.com>\
Reviewed-by: Ahmad Fatoum <a.fatoum@pengutronix.de>
> ---
> common/tlsf_malloc.c | 18 ++++++++++++++++++
> efi/payload/Kconfig | 1 +
> efi/payload/early-mem.c | 19 ++++---------------
> efi/payload/entry-multi.c | 5 ++---
> efi/payload/entry-single.c | 5 ++---
> efi/payload/init.c | 15 +++++++++++++++
> include/efi/efi-payload.h | 2 +-
> include/malloc.h | 1 +
> 8 files changed, 44 insertions(+), 22 deletions(-)
>
> diff --git a/common/tlsf_malloc.c b/common/tlsf_malloc.c
> index 74089fe7f390..d3b665a2fc40 100644
> --- a/common/tlsf_malloc.c
> +++ b/common/tlsf_malloc.c
> @@ -11,11 +11,14 @@
> #include <stdio.h>
> #include <module.h>
> #include <tlsf.h>
> +#include <linux/sizes.h>
> +#include <linux/log2.h>
>
> #include <linux/kasan.h>
> #include <linux/list.h>
>
> tlsf_t tlsf_mem_pool;
> +static void (*malloc_request_store)(size_t bytes);
>
> struct pool_entry {
> pool_t pool;
> @@ -124,3 +127,18 @@ void *malloc_add_pool(void *mem, size_t bytes)
>
> return (void *)new_pool;
> }
> +
> +static void tlsf_request_store(tlsf_t tlsf, size_t bytes)
> +{
> + size_t size;
> +
> + size = __roundup_pow_of_two(bytes + sizeof(struct pool_entry));
> +
> + malloc_request_store(max_t(size_t, SZ_8M, size));
> +}
> +
> +void malloc_register_store(void (*cb)(size_t bytes))
> +{
> + malloc_request_store = cb;
> + tlsf_register_store(tlsf_mem_pool, tlsf_request_store);
> +}
> diff --git a/efi/payload/Kconfig b/efi/payload/Kconfig
> index 9263d59de94a..a403acc81a93 100644
> --- a/efi/payload/Kconfig
> +++ b/efi/payload/Kconfig
> @@ -15,6 +15,7 @@ config EFI_PAYLOAD
> select BLOCK
> select PARTITION_DISK
> select HW_HAS_PCI
> + select MALLOC_TLSF
>
> config HAVE_EFI_STUB
> bool
> diff --git a/efi/payload/early-mem.c b/efi/payload/early-mem.c
> index 0f79a8c30694..c5e94b33a756 100644
> --- a/efi/payload/early-mem.c
> +++ b/efi/payload/early-mem.c
> @@ -6,28 +6,17 @@
> #include <efi/efi-payload.h>
>
> void *efi_earlymem_alloc(const struct efi_system_table *sys_table,
> - size_t *memsize, enum efi_memory_type mem_type)
> + size_t memsize, enum efi_memory_type mem_type)
> {
> struct efi_boot_services *bs = sys_table->boottime;
> - enum efi_allocate_type alloc_type = EFI_ALLOCATE_ANY_PAGES;
> efi_physical_addr_t mem;
> efi_status_t efiret;
>
> - if (IS_ENABLED(CONFIG_X86)) {
> - /* Try to stay clear of memory mapped devices */
> - alloc_type = EFI_ALLOCATE_MAX_ADDRESS;
> - mem = SZ_1G - 1;
> - }
> -
> - for (*memsize = SZ_256M; *memsize >= SZ_8M; *memsize /= 2) {
> - efiret = bs->allocate_pages(alloc_type, mem_type,
> - *memsize / EFI_PAGE_SIZE, &mem);
> - if (!EFI_ERROR(efiret) || efiret != EFI_OUT_OF_RESOURCES)
> - break;
> - }
> + efiret = bs->allocate_pages(EFI_ALLOCATE_ANY_PAGES, mem_type,
> + memsize / EFI_PAGE_SIZE, &mem);
> if (EFI_ERROR(efiret))
> panic("failed to allocate %zu byte memory pool: 0x%lx\n",
> - *memsize, efiret);
> + memsize, efiret);
>
> return efi_phys_to_virt(mem);
> }
> diff --git a/efi/payload/entry-multi.c b/efi/payload/entry-multi.c
> index d5d54cdf70a1..82f3dfffe870 100644
> --- a/efi/payload/entry-multi.c
> +++ b/efi/payload/entry-multi.c
> @@ -23,7 +23,6 @@ static void efi_putc(void *ctx, int ch)
>
> void __efistub_efi_pe_entry(void *image, struct efi_system_table *sys_table)
> {
> - size_t memsize;
> void *mem;
> static struct barebox_efi_data efidata;
>
> @@ -37,7 +36,7 @@ void __efistub_efi_pe_entry(void *image, struct efi_system_table *sys_table)
>
> handoff_data_add(HANDOFF_DATA_EFI, &efidata, sizeof(efidata));
>
> - mem = efi_earlymem_alloc(sys_table, &memsize, EFI_LOADER_CODE);
> + mem = efi_earlymem_alloc(sys_table, SZ_16M, EFI_BOOT_SERVICES_CODE);
>
> - barebox_pbl_entry((uintptr_t)mem, memsize, NULL);
> + barebox_pbl_entry((uintptr_t)mem, SZ_16M, NULL);
> }
> diff --git a/efi/payload/entry-single.c b/efi/payload/entry-single.c
> index 8600bd845c49..f481d0942ba5 100644
> --- a/efi/payload/entry-single.c
> +++ b/efi/payload/entry-single.c
> @@ -17,7 +17,6 @@
> void efi_main(efi_handle_t image, struct efi_system_table *sys_table)
> {
> efi_status_t efiret;
> - size_t memsize;
> void *mem;
>
> #ifdef DEBUG
> @@ -37,9 +36,9 @@ void efi_main(efi_handle_t image, struct efi_system_table *sys_table)
> BS->handle_protocol(efi_loaded_image->device_handle,
> &efi_device_path_protocol_guid, (void **)&efi_device_path);
>
> - mem = efi_earlymem_alloc(sys_table, &memsize, EFI_LOADER_DATA);
> + mem = efi_earlymem_alloc(sys_table, SZ_16M, EFI_BOOT_SERVICES_DATA);
>
> - mem_malloc_init(mem, mem + memsize - 1);
> + mem_malloc_init(mem, mem + SZ_16M - 1);
>
> start_barebox();
> }
> diff --git a/efi/payload/init.c b/efi/payload/init.c
> index 239c5ce9ec18..5b827c57ed1f 100644
> --- a/efi/payload/init.c
> +++ b/efi/payload/init.c
> @@ -270,11 +270,26 @@ static int efi_init(void)
> }
> device_efi_initcall(efi_init);
>
> +static void efi_request_mem(size_t bytes)
> +{
> + efi_status_t efiret;
> + efi_physical_addr_t mem;
> + size_t pages;
> +
> + pages = DIV_ROUND_UP(bytes, EFI_PAGE_SIZE);
> + efiret = BS->allocate_pages(EFI_ALLOCATE_ANY_PAGES, EFI_LOADER_DATA,
> + pages, &mem);
> + if (!EFI_ERROR(efiret))
> + malloc_add_pool(efi_phys_to_virt(mem), pages * EFI_PAGE_SIZE);
> +}
> +
> static int efi_core_init(void)
> {
> struct device *dev;
> int ret;
>
> + malloc_register_store(efi_request_mem);
> +
> dev = device_alloc("efi-cs", DEVICE_ID_SINGLE);
> ret = platform_device_register(dev);
> if (ret)
> diff --git a/include/efi/efi-payload.h b/include/efi/efi-payload.h
> index d8e66a187a87..337471117d5a 100644
> --- a/include/efi/efi-payload.h
> +++ b/include/efi/efi-payload.h
> @@ -32,7 +32,7 @@ int efi_set_variable(char *name, efi_guid_t *vendor, uint32_t attributes,
> int efi_set_variable_usec(char *name, efi_guid_t *vendor, uint64_t usec);
>
> void *efi_earlymem_alloc(const struct efi_system_table *sys_table,
> - size_t *memsize, enum efi_memory_type mem_type);
> + size_t memsize, enum efi_memory_type mem_type);
>
> int efi_initrd_register(void *initrd, size_t initrd_size);
> void efi_initrd_unregister(void);
> diff --git a/include/malloc.h b/include/malloc.h
> index 35551250324e..69ff23b4a058 100644
> --- a/include/malloc.h
> +++ b/include/malloc.h
> @@ -23,6 +23,7 @@
>
> #ifdef CONFIG_MALLOC_TLSF
> void *malloc_add_pool(void *mem, size_t bytes);
> +void malloc_register_store(void (*cb)(size_t bytes));
> #endif
>
> #if IN_PROPER
--
Pengutronix e.K. | |
Steuerwalder Str. 21 | http://www.pengutronix.de/ |
31137 Hildesheim, Germany | Phone: +49-5121-206917-0 |
Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 |
next prev parent reply other threads:[~2025-10-06 11:33 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-10-06 4:15 [PATCH 01/11] common: filetype: add detection for x86 Linux kernel images chalianis1
2025-10-06 4:15 ` [PATCH 02/11] efi: payload: split out payload Kconfig symbols chalianis1
2025-10-06 4:15 ` [PATCH 03/11] efi: payload: add support for EFI initrd media protocol chalianis1
2025-10-06 11:31 ` Ahmad Fatoum
2025-10-06 4:15 ` [PATCH 04/11] tlsf: move kasan_poison_shadow into tlsf_add_pool chalianis1
2025-10-06 4:15 ` [PATCH 05/11] tlsf: support on-demand requesting memory from external store chalianis1
2025-10-06 4:15 ` [PATCH 06/11] efi: payload: earlymem: allocate only the barebox needs in term of memory chalianis1
2025-10-06 11:32 ` Ahmad Fatoum [this message]
2025-10-06 4:15 ` [PATCH 07/11] efi: payload: split image handling from legacy handover boot chalianis1
2025-10-06 11:37 ` Ahmad Fatoum
2025-10-06 4:15 ` [PATCH 08/11] efi: payload: bootm: add support for efi stub boot chalianis1
2025-10-06 11:40 ` Ahmad Fatoum
2025-10-06 4:15 ` [PATCH 09/11] efi: payload: bootm: add support for fit image chalianis1
2025-10-06 11:41 ` Ahmad Fatoum
2025-10-06 4:15 ` [PATCH 10/11] efi: payload: make selectable without COMPILE_TEST chalianis1
2025-10-06 4:15 ` [PATCH 11/11] ARM: efi: add a generic defconfig for v8 efi payload chalianis1
2025-10-06 11:41 ` Ahmad Fatoum
2025-10-06 11:39 ` [PATCH 01/11] common: filetype: add detection for x86 Linux kernel images Ahmad Fatoum
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87b37585-46c9-4f50-b73c-91a517ef4547@pengutronix.de \
--to=a.fatoum@pengutronix.de \
--cc=a.fatoum@barebox.org \
--cc=barebox@lists.infradead.org \
--cc=chalianis1@gmail.com \
--cc=s.hauer@pengutronix.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox