On 23.06.20 15:02, Wei Yang wrote: > 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() ? Never mind, I misread something, sparse_decode_mem_map() is indeed necessary. -- Thanks, David / dhildenb