Bharata B Rao <bhar...@linux.ibm.com> writes: > With hot-plugged memory getting mapped with 2M mappings always, > there will be no need to split any mappings during unplug. > > Hence remove split_kernel_mapping() and associated code. This > essentially is a revert of > commit 4dd5f8a99e791 ("powerpc/mm/radix: Split linear mapping on hot-unplug") >
Reviewed-by: Aneesh Kumar K.V <aneesh.ku...@linux.ibm.com> > Signed-off-by: Bharata B Rao <bhar...@linux.ibm.com> > --- > arch/powerpc/mm/book3s64/radix_pgtable.c | 93 +++++------------------- > 1 file changed, 19 insertions(+), 74 deletions(-) > > diff --git a/arch/powerpc/mm/book3s64/radix_pgtable.c > b/arch/powerpc/mm/book3s64/radix_pgtable.c > index 0d9ef3277579..56f2c698deac 100644 > --- a/arch/powerpc/mm/book3s64/radix_pgtable.c > +++ b/arch/powerpc/mm/book3s64/radix_pgtable.c > @@ -15,7 +15,6 @@ > #include <linux/mm.h> > #include <linux/hugetlb.h> > #include <linux/string_helpers.h> > -#include <linux/stop_machine.h> > #include <linux/memory.h> > > #include <asm/pgtable.h> > @@ -782,30 +781,6 @@ static void free_pud_table(pud_t *pud_start, pgd_t *pgd) > pgd_clear(pgd); > } > > -struct change_mapping_params { > - pte_t *pte; > - unsigned long start; > - unsigned long end; > - unsigned long aligned_start; > - unsigned long aligned_end; > -}; > - > -static int __meminit stop_machine_change_mapping(void *data) > -{ > - struct change_mapping_params *params = > - (struct change_mapping_params *)data; > - > - if (!data) > - return -1; > - > - spin_unlock(&init_mm.page_table_lock); > - pte_clear(&init_mm, params->aligned_start, params->pte); > - create_physical_mapping(__pa(params->aligned_start), > __pa(params->start), -1); > - create_physical_mapping(__pa(params->end), __pa(params->aligned_end), > -1); > - spin_lock(&init_mm.page_table_lock); > - return 0; > -} > - > static void remove_pte_table(pte_t *pte_start, unsigned long addr, > unsigned long end) > { > @@ -834,52 +809,6 @@ static void remove_pte_table(pte_t *pte_start, unsigned > long addr, > } > } > > -/* > - * clear the pte and potentially split the mapping helper > - */ > -static void __meminit split_kernel_mapping(unsigned long addr, unsigned long > end, > - unsigned long size, pte_t *pte) > -{ > - unsigned long mask = ~(size - 1); > - unsigned long aligned_start = addr & mask; > - unsigned long aligned_end = addr + size; > - struct change_mapping_params params; > - bool split_region = false; > - > - if ((end - addr) < size) { > - /* > - * We're going to clear the PTE, but not flushed > - * the mapping, time to remap and flush. The > - * effects if visible outside the processor or > - * if we are running in code close to the > - * mapping we cleared, we are in trouble. > - */ > - if (overlaps_kernel_text(aligned_start, addr) || > - overlaps_kernel_text(end, aligned_end)) { > - /* > - * Hack, just return, don't pte_clear > - */ > - WARN_ONCE(1, "Linear mapping %lx->%lx overlaps kernel " > - "text, not splitting\n", addr, end); > - return; > - } > - split_region = true; > - } > - > - if (split_region) { > - params.pte = pte; > - params.start = addr; > - params.end = end; > - params.aligned_start = addr & ~(size - 1); > - params.aligned_end = min_t(unsigned long, aligned_end, > - (unsigned long)__va(memblock_end_of_DRAM())); > - stop_machine(stop_machine_change_mapping, ¶ms, NULL); > - return; > - } > - > - pte_clear(&init_mm, addr, pte); > -} > - > static void remove_pmd_table(pmd_t *pmd_start, unsigned long addr, > unsigned long end) > { > @@ -895,7 +824,12 @@ static void remove_pmd_table(pmd_t *pmd_start, unsigned > long addr, > continue; > > if (pmd_is_leaf(*pmd)) { > - split_kernel_mapping(addr, end, PMD_SIZE, (pte_t *)pmd); > + if (!IS_ALIGNED(addr, PMD_SIZE) || > + !IS_ALIGNED(next, PMD_SIZE)) { > + WARN_ONCE(1, "%s: unaligned range\n", __func__); > + continue; > + } > + pte_clear(&init_mm, addr, (pte_t *)pmd); > continue; > } > > @@ -920,7 +854,12 @@ static void remove_pud_table(pud_t *pud_start, unsigned > long addr, > continue; > > if (pud_is_leaf(*pud)) { > - split_kernel_mapping(addr, end, PUD_SIZE, (pte_t *)pud); > + if (!IS_ALIGNED(addr, PUD_SIZE) || > + !IS_ALIGNED(next, PUD_SIZE)) { > + WARN_ONCE(1, "%s: unaligned range\n", __func__); > + continue; > + } > + pte_clear(&init_mm, addr, (pte_t *)pud); > continue; > } > > @@ -946,7 +885,13 @@ static void __meminit remove_pagetable(unsigned long > start, unsigned long end) > continue; > > if (pgd_is_leaf(*pgd)) { > - split_kernel_mapping(addr, end, PGDIR_SIZE, (pte_t > *)pgd); > + if (!IS_ALIGNED(addr, PGDIR_SIZE) || > + !IS_ALIGNED(next, PGDIR_SIZE)) { > + WARN_ONCE(1, "%s: unaligned range\n", __func__); > + continue; > + } > + > + pte_clear(&init_mm, addr, (pte_t *)pgd); > continue; > } > > -- > 2.21.0