Hi all,
This patch series adds generic support for parsing DT properties related
to crash dump kernels ("linux,elfcorehdr" and "linux,elfcorehdr" under
the "/chosen" node), makes use of it on arm64, arm32, and (partially)
riscv, and performs a few cleanups. It is an evolution of the
combination of [1] and [2].
The series consists of 5 parts:
1. Patches 1-2 prepare (the visibility of) variables used to hold
information retrieved from the DT properties.
2. Patches 3-5 add support to the FDT core for parsing the properties.
This can co-exist safely with architecture-specific parsing, until
the latter has been removed.
3. Patch 6 removes the non-standard handling of "linux,elfcorehdr" on
riscv.
I think this can be applied independently, as the non-standard
handling is in v5.13, but upstream riscv kdump support is still
incomplete.
4. Patches 7-9 convert arm64 to use the generic handling instead of
its own implementation.
5. Patch 10 adds support for kdump properties to arm32.
The corresponding patch for kexec-tools is "[PATCH] arm: kdump: Add
DT properties to crash dump kernel's DTB"[3], which is still valid.
Changes compared to the previous versions:
- Make elfcorehdr_{addr,size} always visible,
- Add variables for usable memory limitation,
- Use IS_ENABLED() instead of #ifdef (incl. initrd and arm64),
- Clarify what architecture-specific code is still responsible for,
- Add generic support for parsing linux,usable-memory-range,
- Remove custom linux,usable-memory-range parsing on arm64,
- Use generic handling on ARM.
This has been tested on arm32 and arm64, and compile-tested on riscv64.
Thanks for your comments!
[1] "[PATCH v3] ARM: Parse kdump DT properties"
https://lore.kernel.org/r/20210317113130.2554368-1-geert+renesas@glider.be/
[2] "[PATCH 0/3] Add generic-support for linux,elfcorehdr and fix riscv"
https://lore.kernel.org/r/cover.1623780059.git.geert+renesas@glider.be/
[3] "[PATCH] arm: kdump: Add DT properties to crash dump kernel's DTB"
https://lore.kernel.org/linux-arm-kernel/20200902154129.6358-1-geert+renesas@glider.be/
Geert Uytterhoeven (10):
crash_dump: Make elfcorehdr_{addr,size} always visible
memblock: Add variables for usable memory limitation
of: fdt: Add generic support for parsing elf core headers property
of: fdt: Add generic support for parsing usable memory range property
of: fdt: Use IS_ENABLED(CONFIG_BLK_DEV_INITRD) instead of #ifdef
riscv: Remove non-standard linux,elfcorehdr handling
arm64: kdump: Remove custom linux,elfcorehdr parsing
arm64: kdump: Remove custom linux,usable-memory-range parsing
arm64: kdump: Use IS_ENABLED(CONFIG_CRASH_DUMP) instead of #ifdef
ARM: Parse kdump DT properties
Documentation/devicetree/bindings/chosen.txt | 12 ++--
.../arm/boot/compressed/fdt_check_mem_start.c | 48 ++++++++++++--
arch/arm/mm/init.c | 30 +++++++++
arch/arm64/mm/init.c | 63 +------------------
arch/riscv/mm/init.c | 20 ------
drivers/of/fdt.c | 63 ++++++++++++++++---
include/linux/crash_dump.h | 7 ++-
include/linux/memblock.h | 6 ++
mm/memblock.c | 2 +
9 files changed, 148 insertions(+), 103 deletions(-)
--
2.25.1
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Replace the conditional compilation using "#ifdef CONFIG_BLK_DEV_INITRD"
by a check for "IS_ENABLED(CONFIG_BLK_DEV_INITRD)", to increase compile
coverage and to simplify the code.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v4:
- New.
---
drivers/of/fdt.c | 9 +++------
1 file changed, 3 insertions(+), 6 deletions(-)
Replace the conditional compilation using "#ifdef CONFIG_CRASH_DUMP" by
a check for "IS_ENABLED(CONFIG_CRASH_DUMP)", to increase compile
coverage and to simplify the code.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v4:
- New.
---
arch/arm64/mm/init.c | 8 +-------
1 file changed, 1 insertion(+), 7 deletions(-)
Add support for parsing the "linux,usable-memory-range" property in the
"/chosen" node to the FDT core code. This can co-exist safely with the
architecture-specific parsing, until the latter has been removed.
Architecture-specific code still has to make sure the resulting memory
range limitation is applied, if present.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
About the change to chosen.txt: I have a similar change for
schemas/chosen.yaml in dt-schema.
v4:
- New.
---
Documentation/devicetree/bindings/chosen.txt | 6 ++---
drivers/of/fdt.c | 24 ++++++++++++++++++++
2 files changed, 27 insertions(+), 3 deletions(-)
@@ -79,9 +79,9 @@ a different secondary CPU release mechanism) linux,usable-memory-range --------------------------This property (arm64 only) holds a base address and size, describing a-limited region in which memory may be considered available for use by-the kernel. Memory outside of this range is not available for use.+This property holds a base address and size, describing a limited region in+which memory may be considered available for use by the kernel. Memory outside+of this range is not available for use. This property describes a limitation: memory within this range is only valid when also described through another mechanism that the kernel
RISC-V uses platform-specific code to locate the elf core header in
memory. However, this does not conform to the standard
"linux,elfcorehdr" DT bindings, as it relies on a reserved memory node
with the "linux,elfcorehdr" compatible value, instead of on a
"linux,elfcorehdr" property under the "/chosen" node.
The non-compliant code can just be removed, as the standard behavior is
already implemented by platform-agnostic handling in the FDT core code.
Fixes: 5640975003d0234d ("RISC-V: Add crash kernel support")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v4:
- No changes.
---
arch/riscv/mm/init.c | 20 --------------------
1 file changed, 20 deletions(-)
On Wed, 14 Jul 2021 05:50:16 PDT (-0700), geert+renesas@glider.be wrote:
quoted hunk
RISC-V uses platform-specific code to locate the elf core header in
memory. However, this does not conform to the standard
"linux,elfcorehdr" DT bindings, as it relies on a reserved memory node
with the "linux,elfcorehdr" compatible value, instead of on a
"linux,elfcorehdr" property under the "/chosen" node.
The non-compliant code can just be removed, as the standard behavior is
already implemented by platform-agnostic handling in the FDT core code.
Fixes: 5640975003d0234d ("RISC-V: Add crash kernel support")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v4:
- No changes.
---
arch/riscv/mm/init.c | 20 --------------------
1 file changed, 20 deletions(-)
Reviewed-by: Palmer Dabbelt <redacted>
Acked-by: Palmer Dabbelt <redacted>
LMK if you wanted me to take this series, otherwise I'm going to assume
it's going in via some other tree.
Hi Palmer,
On Tue, Jul 20, 2021 at 5:43 PM Palmer Dabbelt [off-list ref] wrote:
On Wed, 14 Jul 2021 05:50:16 PDT (-0700), geert+renesas@glider.be wrote:
quoted
RISC-V uses platform-specific code to locate the elf core header in
memory. However, this does not conform to the standard
"linux,elfcorehdr" DT bindings, as it relies on a reserved memory node
with the "linux,elfcorehdr" compatible value, instead of on a
"linux,elfcorehdr" property under the "/chosen" node.
The non-compliant code can just be removed, as the standard behavior is
already implemented by platform-agnostic handling in the FDT core code.
Fixes: 5640975003d0234d ("RISC-V: Add crash kernel support")
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v4:
- No changes.
---
arch/riscv/mm/init.c | 20 --------------------
1 file changed, 20 deletions(-)
Reviewed-by: Palmer Dabbelt <redacted>
Acked-by: Palmer Dabbelt <redacted>
LMK if you wanted me to take this series, otherwise I'm going to assume
it's going in via some other tree.
There will be a v5 of the series in response to the review comments.
But I think this patch can already be applied.
Thanks!
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
Remove the architecture-specific code for parsing the
"linux,usable-memory-range" property under the "/chosen" node in DT, as
the platform-agnostic handling in the FDT core code already takes care
of this.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v4:
- New.
---
arch/arm64/mm/init.c | 34 +---------------------------------
1 file changed, 1 insertion(+), 33 deletions(-)
Make the forward declarations of elfcorehdr_addr and elfcorehdr_size
always available, like is done for phys_initrd_start and
phys_initrd_size. Code referring to these symbols can then just check
for IS_ENABLED(CONFIG_CRASH_DUMP), instead of requiring conditional
compilation using an #ifdef, thus preparing to increase compile
coverage.
Suggested-by: Rob Herring <robh+dt@kernel.org>
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v4:
- New.
---
include/linux/crash_dump.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
From: Rob Herring <robh@kernel.org> Date: 2021-07-14 13:46:39
On Wed, Jul 14, 2021 at 02:50:11PM +0200, Geert Uytterhoeven wrote:
quoted hunk
Make the forward declarations of elfcorehdr_addr and elfcorehdr_size
always available, like is done for phys_initrd_start and
phys_initrd_size. Code referring to these symbols can then just check
for IS_ENABLED(CONFIG_CRASH_DUMP), instead of requiring conditional
compilation using an #ifdef, thus preparing to increase compile
coverage.
Suggested-by: Rob Herring <robh+dt@kernel.org>
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v4:
- New.
---
include/linux/crash_dump.h | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
@@ -10,13 +10,14 @@#include<linux/pgtable.h> /* for pgprot_t */+/* For IS_ENABLED(CONFIG_CRASH_DUMP) */+externunsignedlonglongelfcorehdr_addr;+externunsignedlonglongelfcorehdr_size;+#ifdef CONFIG_CRASH_DUMP#define ELFCORE_ADDR_MAX (-1ULL)#define ELFCORE_ADDR_ERR (-2ULL)
Seems like these could be needed and no need to hide them, so perhaps
just move the #ifdef down.
-extern unsigned long long elfcorehdr_addr;
-extern unsigned long long elfcorehdr_size;
-
extern int elfcorehdr_alloc(unsigned long long *addr, unsigned long long *size);
extern void elfcorehdr_free(unsigned long long addr);
extern ssize_t elfcorehdr_read(char *buf, size_t count, u64 *ppos);
--
2.25.1
There are two methods to specify the location of the elf core headers:
using the "elfcorehdr=" kernel parameter, as handled by generic code in
kernel/crash_dump.c, or using the "linux,elfcorehdr" property under the
"/chosen" node in the Device Tree, as handled by architecture-specific
code in arch/arm64/mm/init.c.
Extend support for "linux,elfcorehdr" to all platforms supporting DT by
adding platform-agnostic handling for parsing this property to the FDT
core code. This can co-exist safely with the architecture-specific
parsing, until the latter has been removed.
This requires moving the call to of_scan_flat_dt() up, as the code
scanning the "/chosen" node now needs to be aware of the values of
"#address-cells" and "#size-cells".
Architecture-specific code still has to reserve the memory used by the
elf core headers, if present.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
About the change to chosen.txt: I have a similar change for
schemas/chosen.yaml in dt-schema.
v4:
- Use IS_ENABLED() instead of #ifdef,
- Clarify what architecture-specific code is still responsible for.
---
Documentation/devicetree/bindings/chosen.txt | 6 ++--
drivers/of/fdt.c | 34 ++++++++++++++++++--
2 files changed, 34 insertions(+), 6 deletions(-)
@@ -106,9 +106,9 @@ respectively, of the root node. linux,elfcorehdr -----------------This property (currently used only on arm64) holds the memory range,-the address and the size, of the elf core header which mainly describes-the panicked kernel's memory layout as PT_LOAD segments of elf format.+This property holds the memory range, the address and the size, of the elf+core header which mainly describes the panicked kernel's memory layout as+PT_LOAD segments of elf format. e.g. / {
Remove the architecture-specific code for parsing the "linux,elfcorehdr"
property under the "/chosen" node in DT, as the platform-agnostic
handling in the FDT core code already takes care of this.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
v4:
- s/handlng/parsing/ in patch description.
---
arch/arm64/mm/init.c | 21 ---------------------
1 file changed, 21 deletions(-)
@@ -154,8 +135,6 @@ static int __init early_init_dt_scan_elfcorehdr(unsigned long node,*/staticvoid__initreserve_elfcorehdr(void){-of_scan_flat_dt(early_init_dt_scan_elfcorehdr,NULL);-if(!elfcorehdr_size)return;
Parse the following DT properties in the crash dump kernel, to provide a
modern interface between kexec and the crash dump kernel:
- linux,elfcorehdr: ELF core header segment, similar to the
"elfcorehdr=" kernel parameter.
- linux,usable-memory-range: Usable memory reserved for the crash dump
kernel.
This makes the memory reservation explicit. If present, Linux no
longer needs to mask the program counter, and rely on the "mem="
kernel parameter to obtain the start and size of usable memory.
For backwards compatibility, the traditional method to derive the start
of memory is still used if "linux,usable-memory-range" is absent, and
the "elfcorehdr=" and "mem=" kernel parameters are still parsed.
Loosely based on the ARM64 version by Akashi Takahiro.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
The corresponding patch for kexec-tools is "[PATCH] arm: kdump: Add DT
properties to crash dump kernel's DTB", which is still valid:
https://lore.kernel.org/linux-arm-kernel/20200902154129.6358-1-geert+renesas@glider.be/
v4:
- Remove references to architectures in chosen.txt, to avoid having to
change this again when more architectures copy kdump support,
- Remove the architecture-specific code for parsing
"linux,usable-memory-range" and "linux,elfcorehdr", as the FDT core
code now takes care of this,
- Move chosen.txt change to patch changing the FDT core,
- Use IS_ENABLED(CONFIG_CRASH_DUMP) instead of #ifdef,
v3:
- Rebase on top of accepted solution for DTB memory information
handling, which is part of v5.12-rc1,
v2:
- Rebase on top of reworked DTB memory information handling.
---
.../arm/boot/compressed/fdt_check_mem_start.c | 48 ++++++++++++++++---
arch/arm/mm/init.c | 30 ++++++++++++
2 files changed, 72 insertions(+), 6 deletions(-)
@@ -80,6 +81,27 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt)if(addr_cells>2||size_cells>2)returnmem_start;+/*+*Usablememoryincaseofacrashdumpkernel+*Thispropertydescribesalimitation:memorywithinthisrangeis+*onlyvalidwhenalsodescribedthroughanothermechanism+*/+usable=get_prop(fdt,"/chosen","linux,usable-memory-range",+(addr_cells+size_cells)*sizeof(fdt32_t));+if(usable){+size=get_val(usable+addr_cells,size_cells);+if(!size)+returnmem_start;++if(addr_cells>1&&fdt32_ld(usable)){+/* Outside 32-bit address space */+returnmem_start;+}++usable_base=fdt32_ld(usable+addr_cells-1);+usable_end=usable_base+size;+}+/* Walk all memory nodes and regions */for(offset=fdt_next_node(fdt,-1,NULL);offset>=0;offset=fdt_next_node(fdt,offset,NULL)){
@@ -107,7 +129,20 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt)base=fdt32_ld(reg+addr_cells-1);end=base+size;-if(mem_start>=base&&mem_start<end){+if(usable){+/*+*Cliptousablerange,whichtakesprecedence+*overmem_start+*/+if(base<usable_base)+base=usable_base;++if(end>usable_end)+end=usable_end;++if(end<=base)+continue;+}elseif(mem_start>=base&&mem_start<end){/* Calculated address is valid, use it */returnmem_start;}
@@ -221,8 +222,35 @@ void check_cpu_icache_size(int cpuid)}#endif+/*+*reserve_elfcorehdr()-reservesmemoryforelfcoreheader+*+*Thisfunctionreservesthememoryoccupiedbyanelfcoreheader+*describedinthedevicetree.Thisregioncontainsallthe+*informationaboutprimarykernel'scoreimageandisusedbyadump+*capturekerneltoaccessthesystemmemoryonprimarykernel.+*/+staticvoid__initreserve_elfcorehdr(void)+{+if(!IS_ENABLED(CONFIG_CRASH_DUMP)||!elfcorehdr_size)+return;++if(memblock_is_region_reserved(elfcorehdr_addr,elfcorehdr_size)){+pr_warn("elfcorehdr is overlapped\n");+return;+}++memblock_reserve(elfcorehdr_addr,elfcorehdr_size);++pr_info("Reserving %llu KiB of memory at 0x%llx for elfcorehdr\n",+elfcorehdr_size>>10,elfcorehdr_addr);+}+void__initarm_memblock_init(conststructmachine_desc*mdesc){+/* Handle linux,usable-memory-range property */+memblock_cap_memory_range(cap_mem_addr,cap_mem_size);+/* Register the kernel text, kernel data and initrd with memblock. */memblock_reserve(__pa(KERNEL_START),KERNEL_END-KERNEL_START);
From: Rob Herring <robh@kernel.org> Date: 2021-07-14 14:53:17
On Wed, Jul 14, 2021 at 02:50:20PM +0200, Geert Uytterhoeven wrote:
quoted hunk
Parse the following DT properties in the crash dump kernel, to provide a
modern interface between kexec and the crash dump kernel:
- linux,elfcorehdr: ELF core header segment, similar to the
"elfcorehdr=" kernel parameter.
- linux,usable-memory-range: Usable memory reserved for the crash dump
kernel.
This makes the memory reservation explicit. If present, Linux no
longer needs to mask the program counter, and rely on the "mem="
kernel parameter to obtain the start and size of usable memory.
For backwards compatibility, the traditional method to derive the start
of memory is still used if "linux,usable-memory-range" is absent, and
the "elfcorehdr=" and "mem=" kernel parameters are still parsed.
Loosely based on the ARM64 version by Akashi Takahiro.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
The corresponding patch for kexec-tools is "[PATCH] arm: kdump: Add DT
properties to crash dump kernel's DTB", which is still valid:
https://lore.kernel.org/linux-arm-kernel/20200902154129.6358-1-geert+renesas@glider.be/
v4:
- Remove references to architectures in chosen.txt, to avoid having to
change this again when more architectures copy kdump support,
- Remove the architecture-specific code for parsing
"linux,usable-memory-range" and "linux,elfcorehdr", as the FDT core
code now takes care of this,
- Move chosen.txt change to patch changing the FDT core,
- Use IS_ENABLED(CONFIG_CRASH_DUMP) instead of #ifdef,
v3:
- Rebase on top of accepted solution for DTB memory information
handling, which is part of v5.12-rc1,
v2:
- Rebase on top of reworked DTB memory information handling.
---
.../arm/boot/compressed/fdt_check_mem_start.c | 48 ++++++++++++++++---
arch/arm/mm/init.c | 30 ++++++++++++
2 files changed, 72 insertions(+), 6 deletions(-)
@@ -80,6 +81,27 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt)if(addr_cells>2||size_cells>2)returnmem_start;+/*+*Usablememoryincaseofacrashdumpkernel+*Thispropertydescribesalimitation:memorywithinthisrangeis+*onlyvalidwhenalsodescribedthroughanothermechanism+*/+usable=get_prop(fdt,"/chosen","linux,usable-memory-range",+(addr_cells+size_cells)*sizeof(fdt32_t));+if(usable){+size=get_val(usable+addr_cells,size_cells);+if(!size)+returnmem_start;++if(addr_cells>1&&fdt32_ld(usable)){+/* Outside 32-bit address space */+returnmem_start;+}++usable_base=fdt32_ld(usable+addr_cells-1);+usable_end=usable_base+size;+}+/* Walk all memory nodes and regions */for(offset=fdt_next_node(fdt,-1,NULL);offset>=0;offset=fdt_next_node(fdt,offset,NULL)){
@@ -107,7 +129,20 @@ uint32_t fdt_check_mem_start(uint32_t mem_start, const void *fdt)base=fdt32_ld(reg+addr_cells-1);end=base+size;-if(mem_start>=base&&mem_start<end){+if(usable){+/*+*Cliptousablerange,whichtakesprecedence+*overmem_start+*/+if(base<usable_base)+base=usable_base;++if(end>usable_end)+end=usable_end;++if(end<=base)+continue;+}elseif(mem_start>=base&&mem_start<end){/* Calculated address is valid, use it */returnmem_start;}
Add two global variables (cap_mem_addr and cap_mem_size) for storing a
base address and size, describing a limited region in which memory may
be considered available for use by the kernel. If enabled, memory
outside of this range is not available for use.
These variables can by filled by firmware-specific code, and used in
calls to memblock_cap_memory_range() by architecture-specific code.
An example user is the parser of the "linux,usable-memory-range"
property in the DT "/chosen" node.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
This is similar to how the initial ramdisk (phys_initrd_{start,size})
and ELF core headers (elfcorehdr_{addr,size})) are handled.
Does there exist a suitable place in the common memblock code to call
"memblock_cap_memory_range(cap_mem_addr, cap_mem_size)", or does this
have to be done in architecture-specific code?
v4:
- New.
---
include/linux/memblock.h | 6 ++++++
mm/memblock.c | 2 ++
2 files changed, 8 insertions(+)
From: Rob Herring <robh@kernel.org> Date: 2021-07-14 13:51:09
On Wed, Jul 14, 2021 at 02:50:12PM +0200, Geert Uytterhoeven wrote:
Add two global variables (cap_mem_addr and cap_mem_size) for storing a
base address and size, describing a limited region in which memory may
be considered available for use by the kernel. If enabled, memory
outside of this range is not available for use.
These variables can by filled by firmware-specific code, and used in
calls to memblock_cap_memory_range() by architecture-specific code.
An example user is the parser of the "linux,usable-memory-range"
property in the DT "/chosen" node.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
This is similar to how the initial ramdisk (phys_initrd_{start,size})
and ELF core headers (elfcorehdr_{addr,size})) are handled.
Does there exist a suitable place in the common memblock code to call
"memblock_cap_memory_range(cap_mem_addr, cap_mem_size)", or does this
have to be done in architecture-specific code?
Can't you just call it from early_init_dt_scan_usablemem? If the
property is present, you want to call it. If the property is not
present, nothing happens.
Rob
From: Mike Rapoport <rppt@kernel.org> Date: 2021-07-18 09:31:36
Hi,
On Wed, Jul 14, 2021 at 07:51:01AM -0600, Rob Herring wrote:
On Wed, Jul 14, 2021 at 02:50:12PM +0200, Geert Uytterhoeven wrote:
quoted
Add two global variables (cap_mem_addr and cap_mem_size) for storing a
base address and size, describing a limited region in which memory may
be considered available for use by the kernel. If enabled, memory
outside of this range is not available for use.
These variables can by filled by firmware-specific code, and used in
calls to memblock_cap_memory_range() by architecture-specific code.
An example user is the parser of the "linux,usable-memory-range"
property in the DT "/chosen" node.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
This is similar to how the initial ramdisk (phys_initrd_{start,size})
and ELF core headers (elfcorehdr_{addr,size})) are handled.
Does there exist a suitable place in the common memblock code to call
"memblock_cap_memory_range(cap_mem_addr, cap_mem_size)", or does this
have to be done in architecture-specific code?
Can't you just call it from early_init_dt_scan_usablemem? If the
property is present, you want to call it. If the property is not
present, nothing happens.
For memblock_cap_memory_range() to work properly it should be called after
memory is detected and added to memblock with memblock_add[_node]()
I'm not huge fan of adding more globals to memblock so if such ordering can
be implemented on the DT side it would be great.
I don't see a way to actually enforce this ordering, so maybe we'd want to
add warning in memblock_cap_memory_range() if memblock.memory is empty.
Hi Mike,
On Sun, Jul 18, 2021 at 11:31 AM Mike Rapoport [off-list ref] wrote:
On Wed, Jul 14, 2021 at 07:51:01AM -0600, Rob Herring wrote:
quoted
On Wed, Jul 14, 2021 at 02:50:12PM +0200, Geert Uytterhoeven wrote:
quoted
Add two global variables (cap_mem_addr and cap_mem_size) for storing a
base address and size, describing a limited region in which memory may
be considered available for use by the kernel. If enabled, memory
outside of this range is not available for use.
These variables can by filled by firmware-specific code, and used in
calls to memblock_cap_memory_range() by architecture-specific code.
An example user is the parser of the "linux,usable-memory-range"
property in the DT "/chosen" node.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
This is similar to how the initial ramdisk (phys_initrd_{start,size})
and ELF core headers (elfcorehdr_{addr,size})) are handled.
Does there exist a suitable place in the common memblock code to call
"memblock_cap_memory_range(cap_mem_addr, cap_mem_size)", or does this
have to be done in architecture-specific code?
Can't you just call it from early_init_dt_scan_usablemem? If the
property is present, you want to call it. If the property is not
present, nothing happens.
I will have a look...
For memblock_cap_memory_range() to work properly it should be called after
memory is detected and added to memblock with memblock_add[_node]()
I'm not huge fan of adding more globals to memblock so if such ordering can
be implemented on the DT side it would be great.
Me neither ;-)
I don't see a way to actually enforce this ordering, so maybe we'd want to
add warning in memblock_cap_memory_range() if memblock.memory is empty.
"linux,usable-memory-range" is optional, and typically used only in
crashdump kernels, so it would be a bad idea to add such a warning.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
From: Mike Rapoport <rppt@kernel.org> Date: 2021-07-20 05:41:41
Hi Geert,
On Mon, Jul 19, 2021 at 08:59:03AM +0200, Geert Uytterhoeven wrote:
Hi Mike,
On Sun, Jul 18, 2021 at 11:31 AM Mike Rapoport [off-list ref] wrote:
quoted
On Wed, Jul 14, 2021 at 07:51:01AM -0600, Rob Herring wrote:
quoted
On Wed, Jul 14, 2021 at 02:50:12PM +0200, Geert Uytterhoeven wrote:
quoted
Add two global variables (cap_mem_addr and cap_mem_size) for storing a
base address and size, describing a limited region in which memory may
be considered available for use by the kernel. If enabled, memory
outside of this range is not available for use.
These variables can by filled by firmware-specific code, and used in
calls to memblock_cap_memory_range() by architecture-specific code.
An example user is the parser of the "linux,usable-memory-range"
property in the DT "/chosen" node.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
This is similar to how the initial ramdisk (phys_initrd_{start,size})
and ELF core headers (elfcorehdr_{addr,size})) are handled.
Does there exist a suitable place in the common memblock code to call
"memblock_cap_memory_range(cap_mem_addr, cap_mem_size)", or does this
have to be done in architecture-specific code?
Can't you just call it from early_init_dt_scan_usablemem? If the
property is present, you want to call it. If the property is not
present, nothing happens.
I will have a look...
quoted
For memblock_cap_memory_range() to work properly it should be called after
memory is detected and added to memblock with memblock_add[_node]()
I'm not huge fan of adding more globals to memblock so if such ordering can
be implemented on the DT side it would be great.
Me neither ;-)
quoted
I don't see a way to actually enforce this ordering, so maybe we'd want to
add warning in memblock_cap_memory_range() if memblock.memory is empty.
"linux,usable-memory-range" is optional, and typically used only in
crashdump kernels, so it would be a bad idea to add such a warning.
If I remember correctly, memblock_cap_memory_range() was added to support
"linux,usable-memory-range" for crasdump kernels on arm64 and if it would
be called before memory is registered we may silently corrupt the memory
because the crash kernel will see all the memory as available.
So while WARN() maybe too much a pr_warn() seems to me quite appropriate.
--
Sincerely yours,
Mike.
Hi Mike,
On Tue, Jul 20, 2021 at 7:41 AM Mike Rapoport [off-list ref] wrote:
On Mon, Jul 19, 2021 at 08:59:03AM +0200, Geert Uytterhoeven wrote:
quoted
On Sun, Jul 18, 2021 at 11:31 AM Mike Rapoport [off-list ref] wrote:
quoted
On Wed, Jul 14, 2021 at 07:51:01AM -0600, Rob Herring wrote:
quoted
On Wed, Jul 14, 2021 at 02:50:12PM +0200, Geert Uytterhoeven wrote:
quoted
Add two global variables (cap_mem_addr and cap_mem_size) for storing a
base address and size, describing a limited region in which memory may
be considered available for use by the kernel. If enabled, memory
outside of this range is not available for use.
These variables can by filled by firmware-specific code, and used in
calls to memblock_cap_memory_range() by architecture-specific code.
An example user is the parser of the "linux,usable-memory-range"
property in the DT "/chosen" node.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
This is similar to how the initial ramdisk (phys_initrd_{start,size})
and ELF core headers (elfcorehdr_{addr,size})) are handled.
Does there exist a suitable place in the common memblock code to call
"memblock_cap_memory_range(cap_mem_addr, cap_mem_size)", or does this
have to be done in architecture-specific code?
Can't you just call it from early_init_dt_scan_usablemem? If the
property is present, you want to call it. If the property is not
present, nothing happens.
I will have a look...
quoted
For memblock_cap_memory_range() to work properly it should be called after
memory is detected and added to memblock with memblock_add[_node]()
I'm not huge fan of adding more globals to memblock so if such ordering can
be implemented on the DT side it would be great.
Me neither ;-)
quoted
I don't see a way to actually enforce this ordering, so maybe we'd want to
add warning in memblock_cap_memory_range() if memblock.memory is empty.
Sorry, I misread "if memblock.memory is empty" as "if capmem is empty".
quoted
"linux,usable-memory-range" is optional, and typically used only in
crashdump kernels, so it would be a bad idea to add such a warning.
If I remember correctly, memblock_cap_memory_range() was added to support
"linux,usable-memory-range" for crasdump kernels on arm64 and if it would
be called before memory is registered we may silently corrupt the memory
because the crash kernel will see all the memory as available.
"
So while WARN() maybe too much a pr_warn() seems to me quite appropriate.
Yes, makes perfect sense now.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds
On Wed, Jul 14, 2021 at 3:51 PM Rob Herring [off-list ref] wrote:
On Wed, Jul 14, 2021 at 02:50:12PM +0200, Geert Uytterhoeven wrote:
quoted
Add two global variables (cap_mem_addr and cap_mem_size) for storing a
base address and size, describing a limited region in which memory may
be considered available for use by the kernel. If enabled, memory
outside of this range is not available for use.
These variables can by filled by firmware-specific code, and used in
calls to memblock_cap_memory_range() by architecture-specific code.
An example user is the parser of the "linux,usable-memory-range"
property in the DT "/chosen" node.
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
---
This is similar to how the initial ramdisk (phys_initrd_{start,size})
and ELF core headers (elfcorehdr_{addr,size})) are handled.
Does there exist a suitable place in the common memblock code to call
"memblock_cap_memory_range(cap_mem_addr, cap_mem_size)", or does this
have to be done in architecture-specific code?
Can't you just call it from early_init_dt_scan_usablemem? If the
property is present, you want to call it. If the property is not
present, nothing happens.
Seems to work fine when called from early_init_dt_scan_nodes().
Hence v5 will no longer need to touch memblock.
Gr{oetje,eeting}s,
Geert
--
Geert Uytterhoeven -- There's lots of Linux beyond ia32 -- geert@linux-m68k.org
In personal conversations with technical people, I call myself a hacker. But
when I'm talking to journalists I just say "programmer" or something like that.
-- Linus Torvalds