On Tue, Jun 23, 2020 at 02:44:02PM +0200, David Hildenbrand wrote: >On 23.06.20 11:42, Wei Yang wrote: >> For early sections, we assumes its memmap will never be partially >> removed. But current behavior breaks this. >> >> Let's correct it. >> >> Fixes: ba72b4c8cf60 ("mm/sparsemem: support sub-section hotplug") >> Signed-off-by: Wei Yang <richard.weiyang@xxxxxxxxxxxxxxxxx> >> --- >> mm/sparse.c | 6 +++--- >> 1 file changed, 3 insertions(+), 3 deletions(-) >> >> diff --git a/mm/sparse.c b/mm/sparse.c >> index b2b9a3e34696..1a0069f492f5 100644 >> --- a/mm/sparse.c >> +++ b/mm/sparse.c >> @@ -825,10 +825,10 @@ static void section_deactivate(unsigned long pfn, unsigned long nr_pages, >> ms->section_mem_map &= ~SECTION_HAS_MEM_MAP; >> } >> >> - if (section_is_early && memmap) >> - free_map_bootmem(memmap); >> - else >> + if (!section_is_early) >> depopulate_section_memmap(pfn, nr_pages, altmap); >> + else if (memmap) >> + free_map_bootmem(memmap); >> >> if (empty) >> ms->section_mem_map = (unsigned long)NULL; >> > >Agreed, that's what pfn_valid() and section_activate() expect. > >"If we hot-add memory into such a section then we do not need to >populate the memmap and can simply reuse what is already there." - this >is the case when hot-adding sub-sections into partially populated early >sections, and has to be the case when re-hot-adding after hot-removing. > >Acked-by: David Hildenbrand <david@xxxxxxxxxx> > > >I am also not convinced that the complicated sparse_decode_mem_map() >handling in that function is required - ms->section_mem_map & >SECTION_MAP_MASK is sufficient for this use case of removing the memmap >of a full early section once empty. > You mean remove this line? memmap = sparse_decode_mem_map(ms->section_mem_map, section_nr); Then what to passed to free_map_bootmem() ? >-- >Thanks, > >David / dhildenb -- Wei Yang Help you, Help me