summaryrefslogtreecommitdiffstats
path: root/arch/powerpc/mm/mmu_context_book3s64.c
diff options
context:
space:
mode:
authorNicholas Piggin <npiggin@gmail.com>2018-07-25 19:54:28 +1000
committerMichael Ellerman <mpe@ellerman.id.au>2018-08-07 21:49:27 +1000
commit34c604d27590fdc9a2c944be8c50ae1fc80f5f25 (patch)
treeacebfa0f02d084736c6ce4bd78c500a3890ccbc4 /arch/powerpc/mm/mmu_context_book3s64.c
parent5a6099346c41792f1ba23aea6f74ad816e7fecd4 (diff)
downloadlinux-stable-34c604d27590fdc9a2c944be8c50ae1fc80f5f25.tar.gz
linux-stable-34c604d27590fdc9a2c944be8c50ae1fc80f5f25.tar.bz2
linux-stable-34c604d27590fdc9a2c944be8c50ae1fc80f5f25.zip
powerpc/64s: free page table caches at exit_mmap time
The kernel page table caches are tied to init_mm, so there is no more need for them after userspace is finished. destroy_context() gets called when we drop the last reference for an mm, which can be much later than the task exit due to other lazy mm references to it. We can free the page table cache pages on task exit because they only cache the userspace page tables and kernel threads should not access user space addresses. The mapping for kernel threads itself is maintained in init_mm and page table cache for that is attached to init_mm. Signed-off-by: Nicholas Piggin <npiggin@gmail.com> Reviewed-by: Aneesh Kumar K.V <aneesh.kumar@linux.ibm.com> [mpe: Merge change log additions from Aneesh] Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Diffstat (limited to 'arch/powerpc/mm/mmu_context_book3s64.c')
-rw-r--r--arch/powerpc/mm/mmu_context_book3s64.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/arch/powerpc/mm/mmu_context_book3s64.c b/arch/powerpc/mm/mmu_context_book3s64.c
index 39e9ef0eb78b..8b24168ea8c4 100644
--- a/arch/powerpc/mm/mmu_context_book3s64.c
+++ b/arch/powerpc/mm/mmu_context_book3s64.c
@@ -221,7 +221,7 @@ static void pmd_frag_destroy(void *pmd_frag)
}
}
-static void destroy_pagetable_page(struct mm_struct *mm)
+static void destroy_pagetable_cache(struct mm_struct *mm)
{
void *frag;
@@ -244,13 +244,14 @@ void destroy_context(struct mm_struct *mm)
WARN_ON(process_tb[mm->context.id].prtb0 != 0);
else
subpage_prot_free(mm);
- destroy_pagetable_page(mm);
destroy_contexts(&mm->context);
mm->context.id = MMU_NO_CONTEXT;
}
void arch_exit_mmap(struct mm_struct *mm)
{
+ destroy_pagetable_cache(mm);
+
if (radix_enabled()) {
/*
* Radix doesn't have a valid bit in the process table