[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20180712095002.GA5342@techadventures.net>
Date: Thu, 12 Jul 2018 11:50:02 +0200
From: Oscar Salvador <osalvador@...hadventures.net>
To: Michael Ellerman <mpe@...erman.id.au>
Cc: Oscar Salvador <osalvador.vilardaga@...il.com>,
Pavel Tatashin <pasha.tatashin@...cle.com>,
Andrew Morton <akpm@...ux-foundation.org>, broonie@...nel.org,
mhocko@...e.cz, Stephen Rothwell <sfr@...b.auug.org.au>,
linux-next@...r.kernel.org, linux-fsdevel@...r.kernel.org,
Linux Memory Management List <linux-mm@...ck.org>,
LKML <linux-kernel@...r.kernel.org>, mm-commits@...r.kernel.org,
linuxppc-dev@...ts.ozlabs.org, bhe@...hat.com,
aneesh.kumar@...ux.ibm.com, khandual@...ux.vnet.ibm.com
Subject: Re: Boot failures with "mm/sparse: Remove
CONFIG_SPARSEMEM_ALLOC_MEM_MAP_TOGETHER" on powerpc (was Re: mmotm
2018-07-10-16-50 uploaded)
> > I just roughly check, but if I checked the right place,
> > vmemmap_populated() checks for the section to contain the flags we are
> > setting in sparse_init_one_section().
>
> Yes.
>
> > But with this patch, we populate first everything, and then we call
> > sparse_init_one_section() in sparse_init().
> > As I said I could be mistaken because I just checked the surface.
>
> Yeah I think that's correct.
>
> This might just be a bug in our code, let me look at it a bit.
I wonder if something like this could make the trick:
diff --git a/arch/powerpc/mm/init_64.c b/arch/powerpc/mm/init_64.c
index 51ce091914f9..e281651f50cd 100644
--- a/arch/powerpc/mm/init_64.c
+++ b/arch/powerpc/mm/init_64.c
@@ -177,6 +177,8 @@ static __meminit void vmemmap_list_populate(unsigned long phys,
vmemmap_list = vmem_back;
}
+static unsigned long last_addr_populated = 0;
+
int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
struct vmem_altmap *altmap)
{
@@ -191,7 +193,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
void *p;
int rc;
- if (vmemmap_populated(start, page_size))
+ if (start + page_size <= last_addr_populated)
continue;
if (altmap)
@@ -212,6 +214,7 @@ int __meminit vmemmap_populate(unsigned long start, unsigned long end, int node,
__func__, rc);
return -EFAULT;
}
+ last_addr_populated = start + page_size;
}
I know it looks hacky, and chances are that are wrong, but could you give it a try?
I will try to grab a ppc server and try it out too.
Thanks
--
Oscar Salvador
SUSE L3
Powered by blists - more mailing lists