mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-28 02:32:09 -04:00
mm, x86/mm: Make the batched unmap TLB flush API more generic
try_to_unmap_flush() used to open-code a rather x86-centric flush sequence: local_flush_tlb() + flush_tlb_others(). Rearrange the code so that the arch (only x86 for now) provides arch_tlbbatch_add_mm() and arch_tlbbatch_flush() and the core code calls those functions instead. I'll want this for x86 because, to enable address space ids, I can't support the flush_tlb_others() mode used by exising try_to_unmap_flush() implementation with good performance. I can support the new API fairly easily, though. I imagine that other architectures may be in a similar position. Architectures with strong remote flush primitives (arm64?) may have even worse performance problems with flush_tlb_others() the way that try_to_unmap_flush() uses it. Signed-off-by: Andy Lutomirski <[email protected]> Acked-by: Kees Cook <[email protected]> Cc: Andrew Morton <[email protected]> Cc: Borislav Petkov <[email protected]> Cc: Dave Hansen <[email protected]> Cc: Linus Torvalds <[email protected]> Cc: Mel Gorman <[email protected]> Cc: Michal Hocko <[email protected]> Cc: Nadav Amit <[email protected]> Cc: Nadav Amit <[email protected]> Cc: Peter Zijlstra <[email protected]> Cc: Rik van Riel <[email protected]> Cc: Sasha Levin <[email protected]> Cc: Thomas Gleixner <[email protected]> Cc: [email protected] Link: http://lkml.kernel.org/r/19f25a8581f9fb77876b7ff3b001f89835e34ea3.1495492063.git.luto@kernel.org Signed-off-by: Ingo Molnar <[email protected]>
This commit is contained in:
parent
b3b90e5af7
commit
e73ad5ff2f
5 changed files with 54 additions and 18 deletions
16
mm/rmap.c
16
mm/rmap.c
|
|
@ -579,25 +579,13 @@ void page_unlock_anon_vma_read(struct anon_vma *anon_vma)
|
|||
void try_to_unmap_flush(void)
|
||||
{
|
||||
struct tlbflush_unmap_batch *tlb_ubc = ¤t->tlb_ubc;
|
||||
int cpu;
|
||||
|
||||
if (!tlb_ubc->flush_required)
|
||||
return;
|
||||
|
||||
cpu = get_cpu();
|
||||
|
||||
if (cpumask_test_cpu(cpu, &tlb_ubc->cpumask)) {
|
||||
count_vm_tlb_event(NR_TLB_LOCAL_FLUSH_ALL);
|
||||
local_flush_tlb();
|
||||
trace_tlb_flush(TLB_LOCAL_SHOOTDOWN, TLB_FLUSH_ALL);
|
||||
}
|
||||
|
||||
if (cpumask_any_but(&tlb_ubc->cpumask, cpu) < nr_cpu_ids)
|
||||
flush_tlb_others(&tlb_ubc->cpumask, NULL, 0, TLB_FLUSH_ALL);
|
||||
cpumask_clear(&tlb_ubc->cpumask);
|
||||
arch_tlbbatch_flush(&tlb_ubc->arch);
|
||||
tlb_ubc->flush_required = false;
|
||||
tlb_ubc->writable = false;
|
||||
put_cpu();
|
||||
}
|
||||
|
||||
/* Flush iff there are potentially writable TLB entries that can race with IO */
|
||||
|
|
@ -613,7 +601,7 @@ static void set_tlb_ubc_flush_pending(struct mm_struct *mm, bool writable)
|
|||
{
|
||||
struct tlbflush_unmap_batch *tlb_ubc = ¤t->tlb_ubc;
|
||||
|
||||
cpumask_or(&tlb_ubc->cpumask, &tlb_ubc->cpumask, mm_cpumask(mm));
|
||||
arch_tlbbatch_add_mm(&tlb_ubc->arch, mm);
|
||||
tlb_ubc->flush_required = true;
|
||||
|
||||
/*
|
||||
|
|
|
|||
Loading…
Reference in a new issue