In the context of a KVM/arm64 thread [1], it became apparent that the
difference in behaviour of EFI and DT with respect to no-map regions was
something worth fixing.
Rob pointed out in that thread that a couple of patches in this area had
been sent but still needed to be integrated together, which is basically
what this series attempts to do.
- Patch 01 is a generic fix that should make sense on its own;
- Patch 02 allows the kernel to have a saner behaviour with a broken DT.
This one had a small rebase conflict (caused by patch 01). I tested
it in qemu and everything is looking good, the error message shows up
in dmesg when it should.
Thanks,
Quentin
[1] https://lore.kernel.org/kvmarm/20210108121524.656872-1-qperret@google.com/
KarimAllah Ahmed (1):
fdt: Properly handle "no-map" field in the memory region
Nicolas Boichat (1):
of/fdt: Make sure no-map does not remove already reserved regions
drivers/of/fdt.c | 12 ++++++++++--
1 file changed, 10 insertions(+), 2 deletions(-)
--
2.30.0.284.gd98b1dd5eaa7-goog
From: KarimAllah Ahmed <redacted>
Mark the memory region with NOMAP flag instead of completely removing it
from the memory blocks. That makes the FDT handling consistent with the EFI
memory map handling.
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Frank Rowand <redacted>
Cc: devicetree@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: KarimAllah Ahmed <redacted>
Signed-off-by: Quentin Perret <redacted>
---
drivers/of/fdt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Nicolas Boichat <redacted>
If the device tree is incorrectly configured, and attempts to
define a "no-map" reserved memory that overlaps with the kernel
data/code, the kernel would crash quickly after boot, with no
obvious clue about the nature of the issue.
For example, this would happen if we have the kernel mapped at
these addresses (from /proc/iomem):
40000000-41ffffff : System RAM
40080000-40dfffff : Kernel code
40e00000-411fffff : reserved
41200000-413e0fff : Kernel data
And we declare a no-map shared-dma-pool region at a fixed address
within that range:
mem_reserved: mem_region {
compatible = "shared-dma-pool";
reg = <0 0x40000000 0 0x01A00000>;
no-map;
};
To fix this, when removing memory regions at early boot (which is
what "no-map" regions do), we need to make sure that the memory
is not already reserved. If we do, __reserved_mem_reserve_reg
will throw an error:
[ 0.000000] OF: fdt: Reserved memory: failed to reserve memory
for node 'mem_region': base 0x0000000040000000, size 26 MiB
and the code that will try to use the region should also fail,
later on.
We do not do anything for non-"no-map" regions, as memblock
explicitly allows reserved regions to overlap, and the commit
that this fixes removed the check for that precise reason.
[ qperret: fixed conflicts caused by the usage of memblock_mark_nomap ]
Fixes: 094cb98179f19b7 ("of/fdt: memblock_reserve /memreserve/ regions in the case of partial overlap")
Signed-off-by: Nicolas Boichat <redacted>
Reviewed-by: Stephen Boyd <redacted>
Signed-off-by: Quentin Perret <redacted>
---
drivers/of/fdt.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
From: Rob Herring <robh@kernel.org> Date: 2021-01-15 17:30:33
On Fri, 15 Jan 2021 11:45:43 +0000, Quentin Perret wrote:
From: KarimAllah Ahmed <redacted>
Mark the memory region with NOMAP flag instead of completely removing it
from the memory blocks. That makes the FDT handling consistent with the EFI
memory map handling.
Cc: Rob Herring <robh+dt@kernel.org>
Cc: Frank Rowand <redacted>
Cc: devicetree@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: KarimAllah Ahmed <redacted>
Signed-off-by: Quentin Perret <redacted>
---
drivers/of/fdt.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
From: Rob Herring <robh@kernel.org> Date: 2021-01-15 17:31:06
On Fri, 15 Jan 2021 11:45:44 +0000, Quentin Perret wrote:
From: Nicolas Boichat <redacted>
If the device tree is incorrectly configured, and attempts to
define a "no-map" reserved memory that overlaps with the kernel
data/code, the kernel would crash quickly after boot, with no
obvious clue about the nature of the issue.
For example, this would happen if we have the kernel mapped at
these addresses (from /proc/iomem):
40000000-41ffffff : System RAM
40080000-40dfffff : Kernel code
40e00000-411fffff : reserved
41200000-413e0fff : Kernel data
And we declare a no-map shared-dma-pool region at a fixed address
within that range:
mem_reserved: mem_region {
compatible = "shared-dma-pool";
reg = <0 0x40000000 0 0x01A00000>;
no-map;
};
To fix this, when removing memory regions at early boot (which is
what "no-map" regions do), we need to make sure that the memory
is not already reserved. If we do, __reserved_mem_reserve_reg
will throw an error:
[ 0.000000] OF: fdt: Reserved memory: failed to reserve memory
for node 'mem_region': base 0x0000000040000000, size 26 MiB
and the code that will try to use the region should also fail,
later on.
We do not do anything for non-"no-map" regions, as memblock
explicitly allows reserved regions to overlap, and the commit
that this fixes removed the check for that precise reason.
[ qperret: fixed conflicts caused by the usage of memblock_mark_nomap ]
Fixes: 094cb98179f19b7 ("of/fdt: memblock_reserve /memreserve/ regions in the case of partial overlap")
Signed-off-by: Nicolas Boichat <redacted>
Reviewed-by: Stephen Boyd <redacted>
Signed-off-by: Quentin Perret <redacted>
---
drivers/of/fdt.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)
From: Nicolas Boichat <hidden> Date: 2021-01-16 00:31:31
On Sat, Jan 16, 2021 at 1:30 AM Rob Herring [off-list ref] wrote:
On Fri, 15 Jan 2021 11:45:44 +0000, Quentin Perret wrote:
quoted
From: Nicolas Boichat <redacted>
If the device tree is incorrectly configured, and attempts to
define a "no-map" reserved memory that overlaps with the kernel
data/code, the kernel would crash quickly after boot, with no
obvious clue about the nature of the issue.
For example, this would happen if we have the kernel mapped at
these addresses (from /proc/iomem):
40000000-41ffffff : System RAM
40080000-40dfffff : Kernel code
40e00000-411fffff : reserved
41200000-413e0fff : Kernel data
And we declare a no-map shared-dma-pool region at a fixed address
within that range:
mem_reserved: mem_region {
compatible = "shared-dma-pool";
reg = <0 0x40000000 0 0x01A00000>;
no-map;
};
To fix this, when removing memory regions at early boot (which is
what "no-map" regions do), we need to make sure that the memory
is not already reserved. If we do, __reserved_mem_reserve_reg
will throw an error:
[ 0.000000] OF: fdt: Reserved memory: failed to reserve memory
for node 'mem_region': base 0x0000000040000000, size 26 MiB
and the code that will try to use the region should also fail,
later on.
We do not do anything for non-"no-map" regions, as memblock
explicitly allows reserved regions to overlap, and the commit
that this fixes removed the check for that precise reason.
[ qperret: fixed conflicts caused by the usage of memblock_mark_nomap ]
Fixes: 094cb98179f19b7 ("of/fdt: memblock_reserve /memreserve/ regions in the case of partial overlap")
Signed-off-by: Nicolas Boichat <redacted>
Reviewed-by: Stephen Boyd <redacted>
Signed-off-by: Quentin Perret <redacted>
---
drivers/of/fdt.c | 10 +++++++++-
1 file changed, 9 insertions(+), 1 deletion(-)