Re: [PATCH v2 1/3] lmb: Return -EFAULT when requested region is not part of memory map

Randolph Sapp <[email protected]>
Newsgroups org.u-boot-project.lists.u-boot
Message-ID <[email protected]>
On Tue Aug 11, 2026 at 6:16 PM CDT, Jonas Karlman wrote:
> lmb_alloc_addr() is documented to return -EINVAL when the requested
> memory region is not part of the LMB memory map. However, -EINVAL is
> also used to e.g. indicate that a NULL pointer is passed as the addr
> parameter or when the requested memory region partially overlaps an
> existing region.
>
> Change lmb_alloc_addr() to return -EFAULT when the requested memory
> region is not part of the LMB memory map to make the type of error known
> to callers. Also extend unit tests to validate that the return code has
> stay the same when the requested memory region partially overlaps.
>
> No caller of lmb_alloc_addr() is checking what type of error code is
> returned, so this change has no intended behavior change.
>
> Signed-off-by: Jonas Karlman <[email protected]>
> ---
>  include/lmb.h  |  2 +-
>  lib/lmb.c      |  4 +++-
>  test/lib/lmb.c | 10 +++++++++-
>  3 files changed, 13 insertions(+), 3 deletions(-)
>
> diff --git a/include/lmb.h b/include/lmb.h
> index ed472e9ef2e1..028dabb19e86 100644
> --- a/include/lmb.h
> +++ b/include/lmb.h
> @@ -124,7 +124,7 @@ struct lmb {
>   * Return: 0 on success, -ve value on failure
>   *
>   * When the allocation is of type @LMB_MEM_ALLOC_ADDR, the return value can
> - * be -EINVAL if the requested memory region is not part of the LMB memory
> + * be -EFAULT if the requested memory region is not part of the LMB memory
>   * map, and -EEXIST if the requested region is already allocated.
>   */

This doc string may need to be updated a little more to indicate that -EINVAL is
now used to report partial overlaps.

Reviewed-by: Randolph Sapp <[email protected]>

>  int lmb_alloc_mem(enum lmb_mem_type type, u64 align, phys_addr_t *addr,
> diff --git a/lib/lmb.c b/lib/lmb.c
> index 77440a48486c..f7c2e826d067 100644
> --- a/lib/lmb.c
> +++ b/lib/lmb.c
> @@ -752,9 +752,11 @@ static int _lmb_alloc_addr(phys_addr_t base, phys_size_t size, u32 flags)
>  				      base + size - 1, 1))
>  			/* ok, reserve the memory */
>  			return lmb_reserve(base, size, flags);
> +
> +		return -EINVAL;
>  	}
>  
> -	return -EINVAL;
> +	return -EFAULT;
>  }
>  
>  int lmb_alloc_mem(enum lmb_mem_type type, u64 align, phys_addr_t *addr,
> diff --git a/test/lib/lmb.c b/test/lib/lmb.c
> index b6259bef4426..b93b903f99f9 100644
> --- a/test/lib/lmb.c
> +++ b/test/lib/lmb.c
> @@ -779,11 +779,19 @@ static int test_alloc_addr(struct unit_test_state *uts, const phys_addr_t ram)
>  	/* check that allocating outside memory fails */
>  	if (ram_end != 0) {
>  		ret = lmb_alloc_addr(ram_end, 1, LMB_NONE);
> +		ut_asserteq(ret, -EFAULT);
> +		ret = lmb_alloc_addr(ram_end - 1, 2, LMB_NOMAP);
> +		ut_asserteq(ret, -EINVAL);
> +		ret = lmb_alloc_addr(ram_end - 1, 2, LMB_NOOVERWRITE);
>  		ut_asserteq(ret, -EINVAL);
>  	}
>  	if (ram != 0) {
>  		ret = lmb_alloc_addr(ram - 1, 1, LMB_NONE);
> -		ut_asserteq(ret, -EINVAL);
> +		ut_asserteq(ret, -EFAULT);
> +		ret = lmb_alloc_addr(ram - 1, 2, LMB_NOMAP);
> +		ut_asserteq(ret, -EEXIST);
> +		ret = lmb_alloc_addr(ram - 1, 2, LMB_NOOVERWRITE);
> +		ut_asserteq(ret, -EEXIST);
>  	}
>  
>  	lmb_pop(&store);
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.