• Andrew Morton's avatar
    [PATCH] rmap 2 anon and swapcache · 4875a601
    Andrew Morton authored
    From: Hugh Dickins <hugh@veritas.com>
    
    Tracking anonymous pages by anon_vma,pgoff or mm,address needs a
    pointer,offset pair in struct page: mapping,index the natural choice.  But
    swapcache uses those for &swapper_space,swp_entry_t.
    
    It's trivial to separate swapcache from pagecache with radix tree; most of
    swapper_space is actually unused, just a fiction to pretend swap like file;
    and page->private is a good place to keep swp_entry_t, now that swap never
    uses bufferheads.
    
    Define PG_anon bit, page_add_rmap SetPageAnon and put an oopsable address in
    page->mapping to test that we're not confused by it.  Define
    page_mapping(page) macro to give NULL when PageAnon, whatever may be in
    page->mapping.  Define PG_swapcache bit, deduce swapper_space from that in
    the few places we need it.
    
    add_to_swap_cache now distinct from add_to_page_cache.  Separating the caches
    somewhat simplifies the tmpfs swizzling in swap_state.c, now the page can
    briefly be in both caches.
    
    The rmap method remains pte chains, no change to that yet.  But one small
    functional difference: the use of PageAnon implies that a page truncated
    while still mapped will no longer be found and freed (swapped out) by
    try_to_unmap, will only be freed by exit or munmap.  But normally pages are
    unmapped by vmtruncate: this should only affect nonlinear mappings, and a
    later patch not in this batch will fix that.
    4875a601
swapfile.c 41.2 KB