• Hugh Dickins's avatar
    [PATCH] mm: page fault handler locking · 8f4e2101
    Hugh Dickins authored
    On the page fault path, the patch before last pushed acquiring the
    page_table_lock down to the head of handle_pte_fault (though it's also taken
    and dropped earlier when a new page table has to be allocated).
    
    Now delete that line, read "entry = *pte" without it, and go off to this or
    that page fault handler on the basis of this unlocked peek.  Usually the
    handler can proceed without the lock, relying on the subsequent locked
    pte_same or pte_none test to back out when necessary; though do_wp_page needs
    the lock immediately, and do_file_page doesn't check (if there's a race,
    install_page just zaps the entry and reinstalls it).
    
    But on those architectures (notably i386 with PAE) whose pte is too big to be
    read atomically, if SMP or preemption is enabled, do_swap_page and
    do_file_page might cause irretrievable damage if passed a Frankenstein entry
    stitched together from unrelated parts.  In those configs, "pte_unmap_same"
    has to take page_table_lock, validate orig_pte still the same, and drop
    page_table_lock before unmapping, before proceeding.
    
    Use pte_offset_map_lock and pte_unmap_unlock throughout the handlers; but lock
    avoidance leaves more lone maps and unmaps than elsewhere.
    Signed-off-by: default avatarHugh Dickins <hugh@veritas.com>
    Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
    Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
    8f4e2101
memory.c 59.4 KB