• Andrew Morton's avatar
    [PATCH] rmap 39 add anon_vma rmap · 8aa3448c
    Andrew Morton authored
    From: Hugh Dickins <hugh@veritas.com>
    
    Andrea Arcangeli's anon_vma object-based reverse mapping scheme for anonymous
    pages.  Instead of tracking anonymous pages by pte_chains or by mm, this
    tracks them by vma.  But because vmas are frequently split and merged
    (particularly by mprotect), a page cannot point directly to its vma(s), but
    instead to an anon_vma list of those vmas likely to contain the page - a list
    on which vmas can easily be linked and unlinked as they come and go.  The vmas
    on one list are all related, either by forking or by splitting.
    
    This has three particular advantages over anonmm: that it can cope
    effortlessly with mremap moves; and no longer needs page_table_lock to protect
    an mm's vma tree, since try_to_unmap finds vmas via page -> anon_vma -> vma
    instead of using find_vma; and should use less cpu for swapout since it can
    locate its anonymous vmas more quickly.
    
    It does have disadvantages too: a lot more change in mmap.c to deal with
    anon_vmas, though small straightforward additions now that the vma merging has
    been refactored there; more lowmem needed for each anon_vma and vma structure;
    an additional restriction on the merging of vmas (cannot be merged if already
    assigned different anon_vmas, since then their pages will be pointing to
    different heads).
    
    (There would be no need to enlarge the vma structure if anonymous pages
    belonged only to anonymous vmas; but private file mappings accumulate
    anonymous pages by copy-on-write, so need to be listed in both anon_vma and
    prio_tree at the same time.  A different implementation could avoid that by
    using anon_vmas only for purely anonymous vmas, and use the existing prio_tree
    to locate cow pages - but that would involve a long search for each single
    private copy, probably not a good idea.)
    
    Where before the vm_pgoff of a purely anonymous (not file-backed) vma was
    meaningless, now it represents the virtual start address at which that vma is
    mapped - which the standard file pgoff manipulations treat linearly as vmas
    are split and merged.  But if mremap moves the vma, then it generally carries
    its original vm_pgoff to the new location, so pages shared with the old
    location can still be found.  Magic.
    
    Hugh has massaged it somewhat: building on the earlier rmap patches, this
    patch is a fifth of the size of Andrea's original anon_vma patch.  Please note
    that this posting will be his first sight of this patch, which he may or may
    not approve.
    8aa3448c
main.c 15.5 KB