[PATCH v2 4/5] lmb: use a single function to free up memory

Ilias Apalodimas ilias.apalodimas at linaro.org
Wed May 21 09:42:00 CEST 2025


Hi Sughosh,

On Tue May 20, 2025 at 3:06 PM EEST, Sughosh Ganu wrote:
> There is no need to have two separate API's for freeing up memory. Use
> a single API lmb_free() to achieve this.
>
> Signed-off-by: Sughosh Ganu <sughosh.ganu at linaro.org>

Reviewed-by: Ilias Apalodimas <ilias.apalodimas at linaro.org>

> ---
> Changes since V1: None
>
>  boot/image-fdt.c            |  2 +-
>  cmd/load.c                  |  2 +-
>  include/lmb.h               |  6 ++---
>  lib/efi_loader/efi_memory.c |  6 ++---
>  lib/lmb.c                   |  8 +-----
>  test/lib/lmb.c              | 49 +++++++++++++++++++------------------
>  6 files changed, 33 insertions(+), 40 deletions(-)
>
> diff --git a/boot/image-fdt.c b/boot/image-fdt.c
> index ff27a31ae2e..1a6db149021 100644
> --- a/boot/image-fdt.c
> +++ b/boot/image-fdt.c
> @@ -691,7 +691,7 @@ int image_setup_libfdt(struct bootm_headers *images, void *blob, bool lmb)
>
>  	/* Delete the old LMB reservation */
>  	if (CONFIG_IS_ENABLED(LMB) && lmb)
> -		lmb_free(map_to_sysmem(blob), fdt_totalsize(blob));
> +		lmb_free(map_to_sysmem(blob), fdt_totalsize(blob), LMB_NONE);
>
>  	ret = fdt_shrink_to_minimum(blob, 0);
>  	if (ret < 0)
> diff --git a/cmd/load.c b/cmd/load.c
> index 569716607ff..9d94a884087 100644
> --- a/cmd/load.c
> +++ b/cmd/load.c
> @@ -191,7 +191,7 @@ static ulong load_serial(long offset)
>  			dst = map_sysmem(store_addr, binlen);
>  			memcpy(dst, binbuf, binlen);
>  			unmap_sysmem(dst);
> -			lmb_free(store_addr, binlen);
> +			lmb_free(store_addr, binlen, LMB_NONE);
>  		    }
>  		    if ((store_addr) < start_addr)
>  			start_addr = store_addr;
> diff --git a/include/lmb.h b/include/lmb.h
> index 29345d1fa50..c869744c99f 100644
> --- a/include/lmb.h
> +++ b/include/lmb.h
> @@ -142,16 +142,14 @@ phys_size_t lmb_get_free_size(phys_addr_t addr);
>  int lmb_is_reserved_flags(phys_addr_t addr, int flags);
>
>  /**
> - * lmb_free_flags() - Free up a region of memory
> + * lmb_free() - Free up a region of memory
>   * @base: Base Address of region to be freed
>   * @size: Size of the region to be freed
>   * @flags: Memory region attributes
>   *
>   * Return: 0 on success, negative error code on failure.
>   */
> -long lmb_free_flags(phys_addr_t base, phys_size_t size, uint flags);
> -
> -long lmb_free(phys_addr_t base, phys_size_t size);
> +long lmb_free(phys_addr_t base, phys_size_t size, u32 flags);
>
>  void lmb_dump_all(void);
>  void lmb_dump_all_force(void);
> diff --git a/lib/efi_loader/efi_memory.c b/lib/efi_loader/efi_memory.c
> index 73e1eef5011..fd6aee21d36 100644
> --- a/lib/efi_loader/efi_memory.c
> +++ b/lib/efi_loader/efi_memory.c
> @@ -508,7 +508,7 @@ efi_status_t efi_allocate_pages(enum efi_allocate_type type,
>  	ret = efi_update_memory_map(efi_addr, pages, memory_type, true, false);
>  	if (ret != EFI_SUCCESS) {
>  		/* Map would overlap, bail out */
> -		lmb_free_flags(addr, (u64)pages << EFI_PAGE_SHIFT, flags);
> +		lmb_free(addr, (u64)pages << EFI_PAGE_SHIFT, flags);
>  		unmap_sysmem((void *)(uintptr_t)efi_addr);
>  		return  EFI_OUT_OF_RESOURCES;
>  	}
> @@ -548,8 +548,8 @@ efi_status_t efi_free_pages(uint64_t memory, efi_uintn_t pages)
>  	 * been mapped with map_sysmem() from efi_allocate_pages(). Convert
>  	 * it back to an address LMB understands
>  	 */
> -	status = lmb_free_flags(map_to_sysmem((void *)(uintptr_t)memory), len,
> -				LMB_NOOVERWRITE);
> +	status = lmb_free(map_to_sysmem((void *)(uintptr_t)memory), len,
> +			  LMB_NOOVERWRITE);
>  	if (status)
>  		return EFI_NOT_FOUND;
>
> diff --git a/lib/lmb.c b/lib/lmb.c
> index 4f3cf345984..c9526c3c578 100644
> --- a/lib/lmb.c
> +++ b/lib/lmb.c
> @@ -655,8 +655,7 @@ long lmb_add(phys_addr_t base, phys_size_t size)
>  	return lmb_map_update_notify(base, size, LMB_MAP_OP_ADD, LMB_NONE);
>  }
>
> -long lmb_free_flags(phys_addr_t base, phys_size_t size,
> -		    uint flags)
> +long lmb_free(phys_addr_t base, phys_size_t size, u32 flags)
>  {
>  	long ret;
>
> @@ -667,11 +666,6 @@ long lmb_free_flags(phys_addr_t base, phys_size_t size,
>  	return lmb_map_update_notify(base, size, LMB_MAP_OP_FREE, flags);
>  }
>
> -long lmb_free(phys_addr_t base, phys_size_t size)
> -{
> -	return lmb_free_flags(base, size, LMB_NONE);
> -}
> -
>  static int _lmb_alloc_base(phys_size_t size, ulong align,
>  			   phys_addr_t *addr, u32 flags)
>  {
> diff --git a/test/lib/lmb.c b/test/lib/lmb.c
> index 8ce19efc854..94a335a4bb8 100644
> --- a/test/lib/lmb.c
> +++ b/test/lib/lmb.c
> @@ -182,7 +182,7 @@ static int test_multi_alloc(struct unit_test_state *uts, const phys_addr_t ram,
>  	ASSERT_LMB(mem_lst, used_lst, 0, 0, 2,
>  		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 8, 0, 0);
>
> -	ret = lmb_free(a, 4);
> +	ret = lmb_free(a, 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, 0, 0, 2,
>  		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 4, 0, 0);
> @@ -191,12 +191,12 @@ static int test_multi_alloc(struct unit_test_state *uts, const phys_addr_t ram,
>  	ut_asserteq(a, a2);
>  	ASSERT_LMB(mem_lst, used_lst, 0, 0, 2,
>  		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 8, 0, 0);
> -	ret = lmb_free(a2, 4);
> +	ret = lmb_free(a2, 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, 0, 0, 2,
>  		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 4, 0, 0);
>
> -	ret = lmb_free(b, 4);
> +	ret = lmb_free(b, 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, 0, 0, 3,
>  		   alloc_64k_addr - 8, 4, alloc_64k_addr, 0x10000,
> @@ -206,17 +206,17 @@ static int test_multi_alloc(struct unit_test_state *uts, const phys_addr_t ram,
>  	ut_asserteq(b, b2);
>  	ASSERT_LMB(mem_lst, used_lst, 0, 0, 2,
>  		   alloc_64k_addr - 8, 0x10000 + 8, ram_end - 8, 4, 0, 0);
> -	ret = lmb_free(b2, 4);
> +	ret = lmb_free(b2, 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, 0, 0, 3,
>  		   alloc_64k_addr - 8, 4, alloc_64k_addr, 0x10000,
>  		   ram_end - 8, 4);
>
> -	ret = lmb_free(c, 4);
> +	ret = lmb_free(c, 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, 0, 0, 2,
>  		   alloc_64k_addr - 8, 4, alloc_64k_addr, 0x10000, 0, 0);
> -	ret = lmb_free(d, 4);
> +	ret = lmb_free(d, 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, 0, 0, 1, alloc_64k_addr, 0x10000,
>  		   0, 0, 0, 0);
> @@ -320,7 +320,7 @@ static int test_bigblock(struct unit_test_state *uts, const phys_addr_t ram)
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, a,
>  		   big_block_size + 0x10000, 0, 0, 0, 0);
>
> -	ret = lmb_free(a, big_block_size);
> +	ret = lmb_free(a, big_block_size, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, alloc_64k_addr, 0x10000,
>  		   0, 0, 0, 0);
> @@ -392,12 +392,12 @@ static int test_noreserved(struct unit_test_state *uts, const phys_addr_t ram,
>  			   - alloc_size_aligned, alloc_size, 0, 0);
>  	}
>  	/* and free them */
> -	ret = lmb_free(b, alloc_size);
> +	ret = lmb_free(b, alloc_size, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1,
>  		   ram + ram_size - alloc_size_aligned,
>  		   alloc_size, 0, 0, 0, 0);
> -	ret = lmb_free(a, alloc_size);
> +	ret = lmb_free(a, alloc_size, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 0, 0, 0, 0, 0, 0, 0);
>
> @@ -408,7 +408,7 @@ static int test_noreserved(struct unit_test_state *uts, const phys_addr_t ram,
>  		   ram + ram_size - alloc_size_aligned,
>  		   alloc_size, 0, 0, 0, 0);
>  	/* and free it */
> -	ret = lmb_free(b, alloc_size);
> +	ret = lmb_free(b, alloc_size, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 0, 0, 0, 0, 0, 0, 0);
>
> @@ -476,12 +476,12 @@ static int lib_test_lmb_at_0(struct unit_test_state *uts)
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, a, ram_size - 4,
>  		   0, 0, 0, 0);
>  	/* check that this was an error by freeing b */
> -	ret = lmb_free(b, 4);
> +	ret = lmb_free(b, 4, LMB_NONE);
>  	ut_asserteq(ret, -1);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, a, ram_size - 4,
>  		   0, 0, 0, 0);
>
> -	ret = lmb_free(a, ram_size - 4);
> +	ret = lmb_free(a, ram_size - 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 0, 0, 0, 0, 0, 0, 0);
>
> @@ -612,7 +612,7 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  	ut_asserteq(b, 0);
>  	b = lmb_alloc_addr(alloc_addr_a, 0x2000, LMB_NONE);
>  	ut_asserteq(b, 0);
> -	ret = lmb_free(alloc_addr_a, 0x2000);
> +	ret = lmb_free(alloc_addr_a, 0x2000, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	b = lmb_alloc_addr(alloc_addr_a, 0x1000, LMB_NOOVERWRITE);
>  	ut_asserteq(b, 0);
> @@ -620,7 +620,7 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  	ut_asserteq(b, -EEXIST);
>  	b = lmb_alloc_addr(alloc_addr_a, 0x1000, LMB_NOOVERWRITE);
>  	ut_asserteq(b, -EEXIST);
> -	ret = lmb_free(alloc_addr_a, 0x1000);
> +	ret = lmb_free(alloc_addr_a, 0x1000, LMB_NONE);
>  	ut_asserteq(ret, 0);
>
>  	/*
> @@ -642,9 +642,9 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 2, alloc_addr_a, 0x1000,
>  		   alloc_addr_a + 0x4000, 0x1000, 0, 0);
>
> -	ret = lmb_free(alloc_addr_a, 0x1000);
> +	ret = lmb_free(alloc_addr_a, 0x1000, LMB_NONE);
>  	ut_asserteq(ret, 0);
> -	ret = lmb_free(alloc_addr_a + 0x4000, 0x1000);
> +	ret = lmb_free(alloc_addr_a + 0x4000, 0x1000, LMB_NOOVERWRITE);
>  	ut_asserteq(ret, 0);
>
>  	/*
> @@ -667,7 +667,7 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, alloc_addr_a, 0x6000,
>  		   0, 0, 0, 0);
>
> -	ret = lmb_free(alloc_addr_a, 0x6000);
> +	ret = lmb_free(alloc_addr_a, 0x6000, LMB_NONE);
>  	ut_asserteq(ret, 0);
>
>  	/*
> @@ -689,9 +689,9 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 2, alloc_addr_a, 0x1000,
>  		   alloc_addr_a + 0x4000, 0x1000, 0, 0);
>
> -	ret = lmb_free(alloc_addr_a, 0x1000);
> +	ret = lmb_free(alloc_addr_a, 0x1000, LMB_NOOVERWRITE);
>  	ut_asserteq(ret, 0);
> -	ret = lmb_free(alloc_addr_a + 0x4000, 0x1000);
> +	ret = lmb_free(alloc_addr_a + 0x4000, 0x1000, LMB_NOOVERWRITE);
>  	ut_asserteq(ret, 0);
>
>  	/*  reserve 3 blocks */
> @@ -732,7 +732,8 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  		   0, 0, 0, 0);
>
>  	/* free thge allocation from d */
> -	ret = lmb_free(alloc_addr_c + 0x10000, ram_end - alloc_addr_c - 0x10000);
> +	ret = lmb_free(alloc_addr_c + 0x10000, ram_end - alloc_addr_c - 0x10000,
> +		       LMB_NONE);
>  	ut_asserteq(ret, 0);
>
>  	/* allocate at 3 points in free range */
> @@ -741,7 +742,7 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  	ut_asserteq(d, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 2, ram, 0x18010000,
>  		   ram_end - 4, 4, 0, 0);
> -	ret = lmb_free(ram_end - 4, 4);
> +	ret = lmb_free(ram_end - 4, 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, ram, 0x18010000,
>  		   0, 0, 0, 0);
> @@ -750,7 +751,7 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  	ut_asserteq(d, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 2, ram, 0x18010000,
>  		   ram_end - 128, 4, 0, 0);
> -	ret = lmb_free(ram_end - 128, 4);
> +	ret = lmb_free(ram_end - 128, 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, ram, 0x18010000,
>  		   0, 0, 0, 0);
> @@ -759,13 +760,13 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  	ut_asserteq(d, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, ram, 0x18010004,
>  		   0, 0, 0, 0);
> -	ret = lmb_free(alloc_addr_c + 0x10000, 4);
> +	ret = lmb_free(alloc_addr_c + 0x10000, 4, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, ram, 0x18010000,
>  		   0, 0, 0, 0);
>
>  	/* allocate at the bottom a was assigned to ram at the top */
> -	ret = lmb_free(ram, alloc_addr_a - ram);
> +	ret = lmb_free(ram, alloc_addr_a - ram, LMB_NONE);
>  	ut_asserteq(ret, 0);
>  	ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, ram + 0x8000000,
>  		   0x10010000, 0, 0, 0, 0);



More information about the U-Boot mailing list