On 2015/09/22 15:23, Ingo Molnar wrote: > So when memory hotplug removes a piece of physical memory from pagetable > mappings, it also frees the underlying PGD entry. > > This complicates PGD management, so don't do this. We can keep the > PGD mapped and the PUD table all clear - it's only a single 4K page > per 512 GB of memory hotplugged. > > Cc: Andrew Morton <akpm@xxxxxxxxxxxxxxxxxxxx> > Cc: Andy Lutomirski <luto@xxxxxxxxxxxxxx> > Cc: Borislav Petkov <bp@xxxxxxxxx> > Cc: Brian Gerst <brgerst@xxxxxxxxx> > Cc: Denys Vlasenko <dvlasenk@xxxxxxxxxx> > Cc: H. Peter Anvin <hpa@xxxxxxxxx> > Cc: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx> > Cc: Oleg Nesterov <oleg@xxxxxxxxxx> > Cc: Peter Zijlstra <peterz@xxxxxxxxxxxxx> > Cc: Rik van Riel <riel@xxxxxxxxxx> > Cc: Thomas Gleixner <tglx@xxxxxxxxxxxxx> > Cc: Waiman Long <Waiman.Long@xxxxxx> > Cc: linux-mm@xxxxxxxxx > Signed-off-by: Ingo Molnar <mingo@xxxxxxxxxx> Ishimatsu-san, Tang-san, please check. Doesn't this patch affects the issues of 5255e0a79fcc0ff47b387af92bd9ef5729b1b859 9661d5bcd058fe15b4138a00d96bd36516134543 ? -Kame > --- > arch/x86/mm/init_64.c | 27 --------------------------- > 1 file changed, 27 deletions(-) > > diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c > index 7129e7647a76..60b0cc3f2819 100644 > --- a/arch/x86/mm/init_64.c > +++ b/arch/x86/mm/init_64.c > @@ -780,27 +780,6 @@ static void __meminit free_pmd_table(pmd_t *pmd_start, pud_t *pud) > spin_unlock(&init_mm.page_table_lock); > } > > -/* Return true if pgd is changed, otherwise return false. */ > -static bool __meminit free_pud_table(pud_t *pud_start, pgd_t *pgd) > -{ > - pud_t *pud; > - int i; > - > - for (i = 0; i < PTRS_PER_PUD; i++) { > - pud = pud_start + i; > - if (pud_val(*pud)) > - return false; > - } > - > - /* free a pud table */ > - free_pagetable(pgd_page(*pgd), 0); > - spin_lock(&init_mm.page_table_lock); > - pgd_clear(pgd); > - spin_unlock(&init_mm.page_table_lock); > - > - return true; > -} > - > static void __meminit > remove_pte_table(pte_t *pte_start, unsigned long addr, unsigned long end, > bool direct) > @@ -992,7 +971,6 @@ remove_pagetable(unsigned long start, unsigned long end, bool direct) > unsigned long addr; > pgd_t *pgd; > pud_t *pud; > - bool pgd_changed = false; > > for (addr = start; addr < end; addr = next) { > next = pgd_addr_end(addr, end); > @@ -1003,13 +981,8 @@ remove_pagetable(unsigned long start, unsigned long end, bool direct) > > pud = (pud_t *)pgd_page_vaddr(*pgd); > remove_pud_table(pud, addr, next, direct); > - if (free_pud_table(pud, pgd)) > - pgd_changed = true; > } > > - if (pgd_changed) > - sync_global_pgds(start, end - 1, 1); > - > flush_tlb_all(); > } > > -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@xxxxxxxxx. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: <a href=mailto:"dont@xxxxxxxxx"> email@xxxxxxxxx </a>