• Andrew Morton's avatar
    [PATCH] rmap 36 mprotect use vma_merge · 2b2e2a36
    Andrew Morton authored
    From: Hugh Dickins <hugh@veritas.com>
    
    Earlier on, in 2.6.6, we took the vma merging code out of mremap.c and let it
    rely on vma_merge instead (via copy_vma).  Now take the vma merging code out
    of mprotect.c and let it rely on vma_merge too: so vma_merge becomes the sole
    vma merging engine.  The fruit of this consolidation is that mprotect now
    merges file-backed vmas naturally.  Make this change now because anon_vma will
    complicate the vma merging rules, let's keep them all in one place.
    
    vma_merge remains where the decisions are made, whether to merge with prev
    and/or next; but now [addr,end) may be the latter part of prev, or first part
    or whole of next, whereas before it was always a new area.
    
    vma_adjust carries out vma_merge's decision, but when sliding the boundary
    between vma and next, must temporarily remove next from the prio_tree too. 
    And it turned out (by oops) to have a surer idea of whether next needs to be
    removed than vma_merge, so the fput and freeing moves into vma_adjust.
    
    Too much decipherment of what's going on at the start of vma_adjust?  Yes, and
    there's a delicate assumption that you may use vma_adjust in sliding a
    boundary, or splitting in two, or growing a vma (mremap uses it in that way),
    but not for simply shrinking a vma.  Which is so, and must be so (how could
    pages mapped in the part to go, be zapped without first splitting?), but would
    feel better with some protection.
    
    __vma_unlink can then be moved from mm.h to mmap.c, and mm.h's more misleading
    than helpful can_vma_merge is deleted.
    2b2e2a36
mprotect.c 6.07 KB