Message ID | 1373323495-10087-1-git-send-email-swarren@wwwdotorg.org (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 07/08/2013 04:44 PM, Stephen Warren wrote: > From: Stephen Warren <swarren@nvidia.com> > > When early_alloc_aligned() is called, it appears that only memory in the > first memory bank is mapped for CPU access. However, memblock_alloc() is > called to allocate the RAM, and that can return RAM that is part of any > valid memory bank, which hence could be inaccessible to the CPU. If this > happens, the subsequent memset() will hang or crash. > > Solve this by calling memblock_alloc_base() instead of memblock_alloc(). > This function takes an explicit max address. Use the end of the first > memory bank as the address. Scratch this; it causes problems on systems with highmem. > diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c > static void __init *early_alloc_aligned(unsigned long sz, unsigned long align) > { > - void *ptr = __va(memblock_alloc(sz, align)); > + phys_addr_t max_pa = memblock.memory.regions[0].base + > + memblock.memory.regions[0].size; Perhaps that needs to be min(memblock 0 end, end of lowmem). I'll try that...
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c index d7229d2..0849741 100644 --- a/arch/arm/mm/mmu.c +++ b/arch/arm/mm/mmu.c @@ -585,7 +585,10 @@ EXPORT_SYMBOL(phys_mem_access_prot); static void __init *early_alloc_aligned(unsigned long sz, unsigned long align) { - void *ptr = __va(memblock_alloc(sz, align)); + phys_addr_t max_pa = memblock.memory.regions[0].base + + memblock.memory.regions[0].size; + phys_addr_t pa = memblock_alloc_base(sz, align, max_pa); + void *ptr = __va(pa); memset(ptr, 0, sz); return ptr; }