[PATCH 1/2] arm: mm: Ignore memory banks which are in front of the kernel when HIGHMEM is ON

Russell King - ARM Linux linux at arm.linux.org.uk
Wed Feb 13 04:03:17 EST 2013


On Wed, Feb 13, 2013 at 09:58:44AM +0100, Michal Simek wrote:
> Arm kernel with HIGHMEM ON will fail when dts memory node is described
> by memory banks and the starting address is not inside the first 16MB
> of the first memory bank. If HIGHMEM is OFF and the configuration is the same
> then the first memory bank is ignored and the kernel boots.
> 
> Here is the example of behavior:
> dts memory reg = <0x0 0x10000000 0x10000000 0x30000000>
> kernel load address = 0x10000000 (respectively 0x1000800)
> 
> Current:
> "Machine: Xilinx Zynq Platform, model: Zynq ZC702 Development Board
> bootconsole [earlycon0] enabled
> Memory policy: ECC disabled, Data cache writeback
> Kernel panic - not syncing: ERROR: Failed to allocate 0x1000 bytes below 0x0."
> 
> After:
> The kernel ignore ram 0x0-0x0fffffff because is lower than the kernel starting
> address and the kernel bootlog contains.
> "Ignoring RAM at 00000000-0fffffff (CONFIG_HIGHMEM)."
> 
> Also using mem=768M on the command line will overwrite dts memory
> map and kernel will boot with HIGHMEM ON too.
> 
> Signed-off-by: Michal Simek <michal.simek at xilinx.com>
> ---
>  arch/arm/mm/mmu.c |    9 +++++++++
>  1 files changed, 9 insertions(+), 0 deletions(-)
> 
> diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
> index ce328c7..e60f370 100644
> --- a/arch/arm/mm/mmu.c
> +++ b/arch/arm/mm/mmu.c
> @@ -937,6 +937,15 @@ void __init sanity_check_meminfo(void)
>  			highmem = 1;
>  
>  #ifdef CONFIG_HIGHMEM
> +		if (__va(bank->start + bank->size - 1) < (void *)PAGE_OFFSET) {
> +			pr_notice("Ignoring RAM at %.8llx-%.8llx ",
> +				(unsigned long long)bank->start,
> +				(unsigned long long)bank->start
> +							+ bank->size - 1);
> +			pr_cont("(CONFIG_HIGHMEM).\n");
> +			continue;
> +		}

NAK.  __va() is only valid for memory within the kernel's direct mapping
(iow, lowmem).  Physical addresses outside of that range are free to
return any other value.

So, it's entirely possible that a valid highmem setup will have memory
in highmem where __va(start + size - 1) _is_ below PAGE_OFFSET, and this
memory should _not_ be discarded.



More information about the linux-arm-kernel mailing list