summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Rini <[email protected]>2026-08-24 13:57:15 -0600
committerTom Rini <[email protected]>2026-08-24 13:58:00 -0600
commit4d757bfe8ee09da03f215abd71cad73e123405d6 (patch)
tree0e6522aa7a415d6fbbbbef4783835addb56999e5
parentfb79a4fcb09b49c6d6ef0a9a030e1abef32358e9 (diff)
parent94a09715bf4c8dfdefbefcd341d0c9da04c5a6c1 (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.c8
-rw-r--r--include/lmb.h4
-rw-r--r--lib/lmb.c6
-rw-r--r--test/lib/lmb.c12
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);