[PATCH] minimal rmap
authorAndrew Morton <akpm@zip.com.au>
Fri, 19 Jul 2002 04:08:35 +0000 (21:08 -0700)
committerLinus Torvalds <torvalds@home.transmeta.com>
Fri, 19 Jul 2002 04:08:35 +0000 (21:08 -0700)
commitc48c43e6ed41a3bcec0155e8e4b8440a9a769a0a
tree47b1a23b3a84d14e8d712eda4c14700bf3151ffb
parentb15d45bfd7a7fa994adec7a32673a448b5155cb0
[PATCH] minimal rmap

This is the "minimal rmap" patch, writen by Rik, ported to 2.5 by Craig
Kulsea.

Basically,

before: When the page reclaim code decides that is has scanned too many
unreclaimable pages on the LRU it does a scan of process virtual
address spaces for pages to add to swapcache.  ptes pointing at the
page are unmapped as the scan proceeds.  When all ptes referring to a
page have been unmapped and it has been written to swap the page is
reclaimable.

after: When an anonymous page is encountered on the tail of the LRU we
use the rmap to see if it hasn't been referenced lately.  If so then
add it to swapcache.  When the page is again encountered on the LRU, if
it is still unreferenced then try to unmap all ptes which refer to it
in one hit, and if it is clean (ie: on swap) then free it.

The rest of the VM - list management, the classzone concept, etc
remains unchanged.

There are a number of things which the per-page pte chain could be
used for.  Bill Irwin has identified the following.

(1)  page replacement no longer goes around randomly unmapping things

(2)  referenced bits are more accurate because there aren't several ms
        or even seconds between find the multiple pte's mapping a page

(3)  reduces page replacement from O(total virtually mapped) to O(physical)

(4)  enables defragmentation of physical memory

(5)  enables cooperative offlining of memory for friendly guest instance
        behavior in UML and/or LPAR settings

(6)  demonstrable benefit in performance of swapping which is common in
        end-user interactive workstation workloads (I don't like the word
        "desktop"). c.f. Craig Kulesa's post wrt. swapping performance

(7)  evidence from 2.4-based rmap trees indicates approximate parity
        with mainline in kernel compiles with appropriate locking bits

(8)  partitioning of physical memory can reduce the complexity of page
        replacement searches by scanning only the "interesting" zones
        implemented and merged in 2.4-based rmap

(9)  partitioning of physical memory can increase the parallelism of page
        replacement searches by independently processing different zones
        implemented, but not merged in 2.4-based rmap

(10) the reverse mappings may be used for efficiently keeping pte cache
        attributes coherent

(11) they may be used for virtual cache invalidation (with changes)

(12) the reverse mappings enable proper RSS limit enforcement
        implemented and merged in 2.4-based rmap

The code adds a pointer to struct page, consumes additional storage for
the pte chains and adds computational expense to the page reclaim code
(I measured it at 3% additional load during streaming I/O).  The
benefits which we get back for all this are, I must say, theoretical
and unproven.  If it has real advantages (or, indeed, disadvantages)
then why has nobody demonstrated them?

There are a number of things remaining to be done:

1: Demonstrate the above advantages.

2: Make it work with pte-highmem  (Bill Irwin is signed up for this)

3: Don't add pte_chains to non-shared pages optimisation (Dave McCracken's
   patch does this)

4: Move the pte_chains into highmem too (Bill, I guess)

5: per-cpu pte_chain freelists (Rik?)

6: maybe GC the pte_chain backing pages. (Seems unavoidable.  Rik?)

7: multithread the page reclaim code.  (I have patches).

8: clustered add-to-swap.  Not sure if I buy this.  anon pages are
   often well-ordered-by-virtual-address on the LRU, so it "just
   works" for benchmarky loads.  But there may be some other loads...

9: Fix bad IO latency in page reclaim (I have lame patches)

10: Develop tuning tools, use them.

11: The nightly updatedb run is still evicting everything.
31 files changed:
fs/exec.c
include/asm-alpha/rmap.h [new file with mode: 0644]
include/asm-arm/proc-armv/rmap.h [new file with mode: 0644]
include/asm-arm/rmap.h [new file with mode: 0644]
include/asm-cris/rmap.h [new file with mode: 0644]
include/asm-generic/rmap.h [new file with mode: 0644]
include/asm-i386/rmap.h [new file with mode: 0644]
include/asm-ia64/rmap.h [new file with mode: 0644]
include/asm-m68k/rmap.h [new file with mode: 0644]
include/asm-mips/rmap.h [new file with mode: 0644]
include/asm-mips64/rmap.h [new file with mode: 0644]
include/asm-parisc/rmap.h [new file with mode: 0644]
include/asm-ppc/rmap.h [new file with mode: 0644]
include/asm-s390/rmap.h [new file with mode: 0644]
include/asm-s390x/rmap.h [new file with mode: 0644]
include/asm-sh/rmap.h [new file with mode: 0644]
include/asm-sparc/rmap.h [new file with mode: 0644]
include/asm-sparc64/rmap.h [new file with mode: 0644]
include/linux/mm.h
include/linux/page-flags.h
include/linux/swap.h
kernel/fork.c
mm/Makefile
mm/filemap.c
mm/memory.c
mm/mremap.c
mm/page_alloc.c
mm/rmap.c [new file with mode: 0644]
mm/swap_state.c
mm/swapfile.c
mm/vmscan.c