diff options
| author | Tom Rini <[email protected]> | 2026-08-24 13:57:15 -0600 |
|---|---|---|
| committer | Tom Rini <[email protected]> | 2026-08-24 13:58:00 -0600 |
| commit | 4d757bfe8ee09da03f215abd71cad73e123405d6 (patch) | |
| tree | 0e6522aa7a415d6fbbbbef4783835addb56999e5 | |
| parent | fb79a4fcb09b49c6d6ef0a9a030e1abef32358e9 (diff) | |
| parent | 94a09715bf4c8dfdefbefcd341d0c9da04c5a6c1 (diff) | |
Merge patch series "boot: image-fdt: Restore suppression of irrelevant ERROR message"
Jonas Karlman <[email protected]> says:
This series changes the returned error code for lmb_alloc_mem() and
lmb_free() may return to help restore suppression of the verbose ERROR
messages when FDT memreserve and reserved-memory is being processed.
Link: https://lore.kernel.org/r/[email protected]
| -rw-r--r-- | boot/image-fdt.c | 8 | ||||
| -rw-r--r-- | include/lmb.h | 4 | ||||
| -rw-r--r-- | lib/lmb.c | 6 | ||||
| -rw-r--r-- | test/lib/lmb.c | 12 |
4 files changed, 21 insertions, 9 deletions
diff --git a/boot/image-fdt.c b/boot/image-fdt.c index 9e0e0f93edd..956a3d97c42 100644 --- a/boot/image-fdt.c +++ b/boot/image-fdt.c @@ -91,10 +91,10 @@ static void boot_fdt_handle_region(u64 addr, u64 size, u32 flags, bool free) ret = lmb_alloc_mem(LMB_MEM_ALLOC_ADDR, 0, &rsv_addr, size, flags); - if (!ret) { - debug(" %s fdt memory region: addr=%llx size=%llx flags=%x\n", - free ? "freed" : "reserved", (unsigned long long)addr, - (unsigned long long)size, flags); + if (!ret || ret == -EFAULT) { + debug(" %s fdt memory region%s: addr=%llx size=%llx flags=%x ret=%ld\n", + free ? "free" : "reserve", ret ? " failed" : "", + (unsigned long long)addr, (unsigned long long)size, flags, ret); } else { printf("ERROR: %s fdt memory region failed (addr=%llx size=%llx flags=%x): %ld\n", free ? "freeing" : "reserving", (unsigned long long)addr, diff --git a/include/lmb.h b/include/lmb.h index ed472e9ef2e..157a24baf97 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. */ int lmb_alloc_mem(enum lmb_mem_type type, u64 align, phys_addr_t *addr, @@ -168,6 +168,8 @@ int lmb_is_reserved_flags(phys_addr_t addr, int flags); * @flags: Memory region attributes * * Return: 0 on success, negative error code on failure. + * + * The return value can be -EFAULT when the region has not been allocated. */ long lmb_free(phys_addr_t base, phys_size_t size, u32 flags); diff --git a/lib/lmb.c b/lib/lmb.c index 77440a48486..ca00047f624 100644 --- a/lib/lmb.c +++ b/lib/lmb.c @@ -286,7 +286,7 @@ static long _lmb_free(struct alist *lmb_rgn_lst, phys_addr_t base, /* Didn't find the region */ if (i == lmb_rgn_lst->count) - return -1; + return -EFAULT; /* Check to see if we are removing entire region */ if (rgnbegin == base && rgnend == end) { @@ -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 b6259bef442..168c66ae649 100644 --- a/test/lib/lmb.c +++ b/test/lib/lmb.c @@ -477,7 +477,7 @@ static int lib_test_lmb_at_0(struct unit_test_state *uts) 0, 0, 0, 0); /* check that this was an error by freeing b */ ret = lmb_free(b, 4, LMB_NONE); - ut_asserteq(ret, -1); + ut_asserteq(ret, -EFAULT); ASSERT_LMB(mem_lst, used_lst, ram, ram_size, 1, a, ram_size - 4, 0, 0, 0, 0); @@ -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); |
