On 22 December 2017 at 15:50, Naresh Kamboju naresh.kamboju@linaro.org wrote:
On 22 December 2017 at 14:36, Greg Kroah-Hartman gregkh@linuxfoundation.org wrote:
On Fri, Dec 22, 2017 at 02:29:55PM +0530, Naresh Kamboju wrote:
On 22 December 2017 at 12:41, Greg Kroah-Hartman gregkh@linuxfoundation.org wrote:
On Thu, Dec 21, 2017 at 04:35:30PM -0600, Dan Rue wrote:
Hi Greg,
It looks like the pending v4.14.8-159-gc2a94d1a609 fails to boot on all arm64 boards. hikey and juno are failing for us, and I see similar arm64 boot failures reported by kernelci.
Still investigating root cause.
Any help in bisecting to find the problem here would be great...
Booting now on arm64 Hikey board. After reverting 83e3c48729d.
git revert 83e3c48729d9ebb7af5a31a504f3fd6aff0348c4
Reverting above commit 83e3c48 (mm/sparsemem: Allocate mem_section at) might not be the right way to fix this problem. Instead cherry pick this commit 629a359bd to fix ARM64 boot crash problem. (mm/sparsemem: Fix ARM64 boot crash when CONFIG_SPARSEMEM_EXTREME=y)
tree: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable-rc.git branch: linux-4.14.y
git cherry-pick 629a359bdb0e0652a8227b4ff3125431995fec6e
$ git log --oneline -2 599755e mm/sparsemem: Fix ARM64 boot crash when CONFIG_SPARSEMEM_EXTREME=y b483e86 Linux 4.14.9-rc1
Kernel version after the successful boot on Hikey. Linux version 4.14.9-rc1-00161-g599755e (naresh@linaro) (gcc version 6.2.1 20161016 (Linaro GCC 6.2-2016.11-rc2)) #2 SMP PREEMPT Fri Dec 22 17:48:59 IST 2017
More information, Found this commit from linux tree ----
From 629a359bdb0e0652a8227b4ff3125431995fec6e Mon Sep 17 00:00:00 2001
From: "Kirill A. Shutemov" kirill.shutemov@linux.intel.com Date: Tue, 7 Nov 2017 11:33:37 +0300 Subject: mm/sparsemem: Fix ARM64 boot crash when CONFIG_SPARSEMEM_EXTREME=y
Since commit:
83e3c48729d9 ("mm/sparsemem: Allocate mem_section at runtime for CONFIG_SPARSEMEM_EXTREME=y")
we allocate the mem_section array dynamically in sparse_memory_present_with_active_regions(), but some architectures, like arm64, don't call the routine to initialize sparsemem.
Let's move the initialization into memory_present() it should cover all architectures.
Reported-and-tested-by: Sudeep Holla sudeep.holla@arm.com Tested-by: Bjorn Andersson bjorn.andersson@linaro.org Signed-off-by: Kirill A. Shutemov kirill.shutemov@linux.intel.com Acked-by: Will Deacon will.deacon@arm.com Cc: Andrew Morton akpm@linux-foundation.org Cc: Linus Torvalds torvalds@linux-foundation.org Cc: Peter Zijlstra peterz@infradead.org Cc: Thomas Gleixner tglx@linutronix.de Cc: linux-mm@kvack.org Fixes: 83e3c48729d9 ("mm/sparsemem: Allocate mem_section at runtime for CONFIG_SPARSEMEM_EXTREME=y") Link: http://lkml.kernel.org/r/20171107083337.89952-1-kirill.shutemov@linux.intel.... Signed-off-by: Ingo Molnar mingo@kernel.org --- mm/page_alloc.c | 10 ---------- mm/sparse.c | 10 ++++++++++ 2 files changed, 10 insertions(+), 10 deletions(-)
(limited to 'mm')
diff --git a/mm/page_alloc.c b/mm/page_alloc.c index 8dfd13f..77e4d3c 100644 --- a/mm/page_alloc.c +++ b/mm/page_alloc.c @@ -5646,16 +5646,6 @@ void __init sparse_memory_present_with_active_regions(int nid) unsigned long start_pfn, end_pfn; int i, this_nid;
-#ifdef CONFIG_SPARSEMEM_EXTREME - if (!mem_section) { - unsigned long size, align; - - size = sizeof(struct mem_section) * NR_SECTION_ROOTS; - align = 1 << (INTERNODE_CACHE_SHIFT); - mem_section = memblock_virt_alloc(size, align); - } -#endif - for_each_mem_pfn_range(i, nid, &start_pfn, &end_pfn, &this_nid) memory_present(this_nid, start_pfn, end_pfn); } diff --git a/mm/sparse.c b/mm/sparse.c index b00a973..d294148 100644 --- a/mm/sparse.c +++ b/mm/sparse.c @@ -206,6 +206,16 @@ void __init memory_present(int nid, unsigned long start, unsigned long end) { unsigned long pfn;
+#ifdef CONFIG_SPARSEMEM_EXTREME + if (unlikely(!mem_section)) { + unsigned long size, align; + + size = sizeof(struct mem_section) * NR_SECTION_ROOTS; + align = 1 << (INTERNODE_CACHE_SHIFT); + mem_section = memblock_virt_alloc(size, align); + } +#endif + start &= PAGE_SECTION_MASK; mminit_validate_memmodel_limits(&start, &end); for (pfn = start; pfn < end; pfn += PAGES_PER_SECTION) {