• Hugh Dickins's avatar
    [PATCH] rmaplock: kill page_map_lock · edcc56dc
    Hugh Dickins authored
    The pte_chains rmap used pte_chain_lock (bit_spin_lock on PG_chainlock) to
    lock its pte_chains.  We kept this (as page_map_lock: bit_spin_lock on
    PG_maplock) when we moved to objrmap.  But the file objrmap locks its vma tree
    with mapping->i_mmap_lock, and the anon objrmap locks its vma list with
    anon_vma->lock: so isn't the page_map_lock superfluous?
    
    Pretty much, yes.  The mapcount was protected by it, and needs to become an
    atomic: starting at -1 like page _count, so nr_mapped can be tracked precisely
    up and down.  The last page_remove_rmap can't clear anon page mapping any
    more, because of races with page_add_rmap; from which some BUG_ONs must go for
    the same reason, but they've served their purpose.
    
    vmscan decisions are naturally racy, little change there beyond removing
    page_map_lock/unlock.  But to stabilize the file-backed page->mapping against
    truncation while acquiring i_mmap_lock, page_referenced_file now needs page
    lock to be held even for refill_inactive_zone.  There's a similar issue in
    acquiring anon_vma->lock, where page lock doesn't help: which this patch
    pretends to handle, but actually it needs the next.
    
    Roughly 10% cut off lmbench fork numbers on my 2*HT*P4.  Must confess my
    testing failed to show the races even while they were knowingly exposed: would
    benefit from testing on racier equipment.
    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>
    edcc56dc
page_alloc.c 50.6 KB