• Rik van Riel's avatar
    mm,generic: only flush the local TLB in ptep_set_access_flags · cef23d9d
    Rik van Riel authored
    The function ptep_set_access_flags is only ever used to upgrade
    access permissions to a page. That means the only negative side
    effect of not flushing remote TLBs is that other CPUs may incur
    spurious page faults, if they happen to access the same address,
    and still have a PTE with the old permissions cached in their
    TLB.
    
    Having another CPU maybe incur a spurious page fault is faster
    than always incurring the cost of a remote TLB flush, so replace
    the remote TLB flush with a purely local one.
    
    This should be safe on every architecture that correctly
    implements flush_tlb_fix_spurious_fault() to actually invalidate
    the local TLB entry that caused a page fault, as well as on
    architectures where the hardware invalidates TLB entries that
    cause page faults.
    
    In the unlikely event that you are hitting what appears to be
    an infinite loop of page faults, and 'git bisect' took you to
    this changeset, your architecture needs to implement
    flush_tlb_fix_spurious_fault to actually flush the TLB entry.
    Signed-off-by: default avatarRik van Riel <riel@redhat.com>
    Cc: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Michel Lespinasse <walken@google.com>
    Cc: Ingo Molnar <mingo@kernel.org>
    cef23d9d
pgtable-generic.c 4.58 KB