54 lines
2.0 KiB
Diff
54 lines
2.0 KiB
Diff
From a636289fb6037392c3551aeed1033576c3aef426 Mon Sep 17 00:00:00 2001
|
|
From: Ian Campbell <ian.campbell@citrix.com>
|
|
Date: Tue, 25 Nov 2014 15:05:13 +0000
|
|
Subject: [PATCH] of/fdt: memblock_reserve /memreserve/ regions in the case of
|
|
partial overlap
|
|
Origin: https://git.kernel.org/cgit/linux/kernel/git/glikely/linux.git/commit/?h=devicetree/merge&id=094cb98179f19b75acf9ff471daabf3948ce98e6
|
|
|
|
memblock_is_region_reserved() returns true in the case of a partial
|
|
overlap, meaning that the current code fails to reserve the
|
|
non-overlapping portion.
|
|
|
|
This call was introduced as part of d1552ce449eb "of/fdt: move
|
|
memreserve and dtb memory reservations into core" which went into
|
|
v3.16.
|
|
|
|
I observed this causing a Midway system with a buggy fdt (the header
|
|
declares itself to be larger than it really is) failing to boot
|
|
because the over-inflated size of the fdt was causing it to seem to
|
|
run into the swapper_pg_dir region, meaning the DT wasn't reserved.
|
|
The symptoms were failing to find an disks or network and failing to
|
|
boot.
|
|
|
|
However given the ambiguity of whether things like the initrd are
|
|
covered by /memreserve/ and similar I think it is best to also
|
|
register the region rather than just ignoring it.
|
|
|
|
Since memblock_reserve() handles overlaps just fine lets just warn and
|
|
carry on.
|
|
|
|
Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
|
|
Signed-off-by: Grant Likely <grant.likely@linaro.org>
|
|
Cc: Rob Herring <robh+dt@kernel.org>
|
|
Cc: stable@vger.kernel.org # v3.16+
|
|
---
|
|
drivers/of/fdt.c | 2 --
|
|
1 file changed, 2 deletions(-)
|
|
|
|
diff --git a/drivers/of/fdt.c b/drivers/of/fdt.c
|
|
index 379ad4f..94a8511 100644
|
|
--- a/drivers/of/fdt.c
|
|
+++ b/drivers/of/fdt.c
|
|
@@ -960,8 +960,6 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size)
|
|
int __init __weak early_init_dt_reserve_memory_arch(phys_addr_t base,
|
|
phys_addr_t size, bool nomap)
|
|
{
|
|
- if (memblock_is_region_reserved(base, size))
|
|
- return -EBUSY;
|
|
if (nomap)
|
|
return memblock_remove(base, size);
|
|
return memblock_reserve(base, size);
|
|
--
|
|
2.1.3
|
|
|