• P
    mm: dirty page accounting vs VM_MIXEDMAP · 251b97f5
    Peter Zijlstra 提交于
    Dirty page accounting accurately measures the amound of dirty pages in
    writable shared mappings by mapping the pages RO (as indicated by
    vma_wants_writenotify).  We then trap on first write and call
    set_page_dirty() on the page, after which we map the page RW and
    continue execution.
    
    When we launder dirty pages, we call clear_page_dirty_for_io() which
    clears both the dirty flag, and maps the page RO again before we start
    writeout so that the story can repeat itself.
    
    vma_wants_writenotify() excludes VM_PFNMAP on the basis that we cannot
    do the regular dirty page stuff on raw PFNs and the memory isn't going
    anywhere anyway.
    
    The recently introduced VM_MIXEDMAP mixes both !pfn_valid() and
    pfn_valid() pages in a single mapping.
    
    We can't do dirty page accounting on !pfn_valid() pages as stated
    above, and mapping them RO causes them to be COW'ed on write, which
    breaks VM_SHARED semantics.
    
    Excluding VM_MIXEDMAP in vma_wants_writenotify() would mean we don't do
    the regular dirty page accounting for the pfn_valid() pages, which
    would bring back all the head-aches from inaccurate dirty page
    accounting.
    
    So instead, we let the !pfn_valid() pages get mapped RO, but fix them
    up unconditionally in the fault path.
    Signed-off-by: NPeter Zijlstra <a.p.zijlstra@chello.nl>
    Cc: Nick Piggin <nickpiggin@yahoo.com.au>
    Acked-by: NHugh Dickins <hugh@veritas.com>
    Cc: "Jared Hulbert" <jaredeh@gmail.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    251b97f5
memory.c 78.1 KB