]> git.ipfire.org Git - thirdparty/kernel/stable.git/commit
arm64: Invalidate the TLB corresponding to intermediate page table levels
authorCatalin Marinas <catalin.marinas@arm.com>
Wed, 11 Mar 2015 12:20:39 +0000 (12:20 +0000)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 26 Mar 2015 12:59:36 +0000 (13:59 +0100)
commit79b99717f6046c0d7ea4b3b41481bf89548fca6e
treeb95f7520dd6069e5d52cab70c1958527e7c198cb
parent2195ac7f1315c7aa7e2d36c7dcab95f5ed1387ef
arm64: Invalidate the TLB corresponding to intermediate page table levels

commit 285994a62c80f1d72c6924282bcb59608098d5ec upstream.

The ARM architecture allows the caching of intermediate page table
levels and page table freeing requires a sequence like:

pmd_clear()
TLB invalidation
pte page freeing

With commit 5e5f6dc10546 (arm64: mm: enable HAVE_RCU_TABLE_FREE logic),
the page table freeing batching was moved from tlb_remove_page() to
tlb_remove_table(). The former takes care of TLB invalidation as this is
also shared with pte clearing and page cache page freeing. The latter,
however, does not invalidate the TLBs for intermediate page table levels
as it probably relies on the architecture code to do it if required.
When the mm->mm_users < 2, tlb_remove_table() does not do any batching
and page table pages are freed before tlb_finish_mmu() which performs
the actual TLB invalidation.

This patch introduces __tlb_flush_pgtable() for arm64 and calls it from
the {pte,pmd,pud}_free_tlb() directly without relying on deferred page
table freeing.

Fixes: 5e5f6dc10546 arm64: mm: enable HAVE_RCU_TABLE_FREE logic
Reported-by: Jon Masters <jcm@redhat.com>
Tested-by: Jon Masters <jcm@redhat.com>
Tested-by: Steve Capper <steve.capper@linaro.org>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/arm64/include/asm/tlb.h
arch/arm64/include/asm/tlbflush.h