Minchan Kim wrote: > Hi :-) > Kukjin, Could you test below patch? Sure. > I don't have any sparsemem system. Sorry. No problem... And in the same test, there was no problem ;-) It means has no kernel panic with your this patch. If you need other test on sparsemem system, please let me know. Thanks. Best regards, Kgene. -- Kukjin Kim <kgene.kim@xxxxxxxxxxx>, Senior Engineer, SW Solution Development Team, Samsung Electronics Co., Ltd. > > -- CUT DOWN HERE -- > > Kukjin reported oops happen while he change min_free_kbytes > http://www.spinics.net/lists/arm-kernel/msg92894.html > It happen by memory map on sparsemem. > > The system has a memory map following as. > section 0 section 1 section 2 > 0x20000000-0x25000000, 0x40000000-0x50000000, 0x50000000-0x58000000 > SECTION_SIZE_BITS 28(256M) > > It means section 0 is an incompletely filled section. > Nontheless, current pfn_valid of sparsemem checks pfn loosely. > > It checks only mem_section's validation. > So in above case, pfn on 0x25000000 can pass pfn_valid's validation check. > It's not what we want. > > The Following patch adds check valid pfn range check on pfn_valid of sparsemem. > > Signed-off-by: Minchan Kim <minchan.kim@xxxxxxxxx> > Reported-by: Kukjin Kim <kgene.kim@xxxxxxxxxxx> > > P.S) > It is just RFC. If we agree with this, I will make the patch on mmotm. > > -- > > diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h > index b4d109e..6c2147a 100644 > --- a/include/linux/mmzone.h > +++ b/include/linux/mmzone.h > @@ -979,6 +979,8 @@ struct mem_section { > struct page_cgroup *page_cgroup; > unsigned long pad; > #endif > + unsigned long start_pfn; > + unsigned long end_pfn; > }; > > #ifdef CONFIG_SPARSEMEM_EXTREME > @@ -1039,6 +1041,12 @@ static inline int valid_section(struct mem_section > *section) > return (section && (section->section_mem_map & > SECTION_HAS_MEM_MAP)); > } > > +static inline int valid_section_pfn(struct mem_section *section, unsigned long pfn) > +{ > + return ((section && (section->section_mem_map & > SECTION_HAS_MEM_MAP)) && > + (section->start_pfn <= pfn && pfn < section->end_pfn)); > +} > + > static inline int valid_section_nr(unsigned long nr) > { > return valid_section(__nr_to_section(nr)); > @@ -1053,7 +1061,7 @@ static inline int pfn_valid(unsigned long pfn) > { > if (pfn_to_section_nr(pfn) >= NR_MEM_SECTIONS) > return 0; > - return valid_section(__nr_to_section(pfn_to_section_nr(pfn))); > + return valid_section_pfn(__nr_to_section(pfn_to_section_nr(pfn)), pfn); > } > > diff --git a/mm/sparse.c b/mm/sparse.c > index 95ac219..bde9090 100644 > --- a/mm/sparse.c > +++ b/mm/sparse.c > @@ -195,6 +195,8 @@ void __init memory_present(int nid, unsigned long start, > unsigned long end) > if (!ms->section_mem_map) > ms->section_mem_map = > sparse_encode_early_nid(nid) | > > SECTION_MARKED_PRESENT; > + ms->start_pfn = start; > + ms->end_pfn = end; > } > } > > > > -- > Kind regards, > Minchan Kim -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxxx For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>