linux-IllusionX/mm
Hugh Dickins 365e9c87a9 [PATCH] mm: update_hiwaters just in time
update_mem_hiwater has attracted various criticisms, in particular from those
concerned with mm scalability.  Originally it was called whenever rss or
total_vm got raised.  Then many of those callsites were replaced by a timer
tick call from account_system_time.  Now Frank van Maarseveen reports that to
be found inadequate.  How about this?  Works for Frank.

Replace update_mem_hiwater, a poor combination of two unrelated ops, by macros
update_hiwater_rss and update_hiwater_vm.  Don't attempt to keep
mm->hiwater_rss up to date at timer tick, nor every time we raise rss (usually
by 1): those are hot paths.  Do the opposite, update only when about to lower
rss (usually by many), or just before final accounting in do_exit.  Handle
mm->hiwater_vm in the same way, though it's much less of an issue.  Demand
that whoever collects these hiwater statistics do the work of taking the
maximum with rss or total_vm.

And there has been no collector of these hiwater statistics in the tree.  The
new convention needs an example, so match Frank's usage by adding a VmPeak
line above VmSize to /proc/<pid>/status, and also a VmHWM line above VmRSS
(High-Water-Mark or High-Water-Memory).

There was a particular anomaly during mremap move, that hiwater_vm might be
captured too high.  A fleeting such anomaly remains, but it's quickly
corrected now, whereas before it would stick.

What locking?  None: if the app is racy then these statistics will be racy,
it's not worth any overhead to make them exact.  But whenever it suits,
hiwater_vm is updated under exclusive mmap_sem, and hiwater_rss under
page_table_lock (for now) or with preemption disabled (later on): without
going to any trouble, minimize the time between reading current values and
updating, to minimize those occasions when a racing thread bumps a count up
and back down in between.

Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
2005-10-29 21:40:39 -07:00
..
bootmem.c [PATCH] core remove PageReserved 2005-10-29 21:40:39 -07:00
fadvise.c
filemap.c [PATCH] mm: page fault handlers tidyup 2005-10-29 21:40:37 -07:00
filemap.h
filemap_xip.c [PATCH] core remove PageReserved 2005-10-29 21:40:39 -07:00
fremap.c [PATCH] mm: update_hiwaters just in time 2005-10-29 21:40:39 -07:00
highmem.c [PATCH] gfp_t: the rest 2005-10-28 08:16:51 -07:00
hugetlb.c [PATCH] mm: update_hiwaters just in time 2005-10-29 21:40:39 -07:00
internal.h
Kconfig
madvise.c [PATCH] core remove PageReserved 2005-10-29 21:40:39 -07:00
Makefile
memory.c [PATCH] mm: update_hiwaters just in time 2005-10-29 21:40:39 -07:00
mempolicy.c [PATCH] core remove PageReserved 2005-10-29 21:40:39 -07:00
mempool.c
mincore.c
mlock.c
mmap.c [PATCH] mm: update_hiwaters just in time 2005-10-29 21:40:39 -07:00
mprotect.c [PATCH] core remove PageReserved 2005-10-29 21:40:39 -07:00
mremap.c [PATCH] mm: update_hiwaters just in time 2005-10-29 21:40:39 -07:00
msync.c [PATCH] core remove PageReserved 2005-10-29 21:40:39 -07:00
nommu.c [PATCH] mm: update_hiwaters just in time 2005-10-29 21:40:39 -07:00
oom_kill.c
page-writeback.c
page_alloc.c [PATCH] core remove PageReserved 2005-10-29 21:40:39 -07:00
page_io.c
pdflush.c
prio_tree.c
readahead.c
rmap.c [PATCH] mm: update_hiwaters just in time 2005-10-29 21:40:39 -07:00
shmem.c [PATCH] core remove PageReserved 2005-10-29 21:40:39 -07:00
slab.c [PATCH] slab: add additional debugging to detect slabs from the wrong node 2005-10-29 21:40:36 -07:00
sparse.c
swap.c [PATCH] core remove PageReserved 2005-10-29 21:40:39 -07:00
swap_state.c
swapfile.c [PATCH] mm: rss = file_rss + anon_rss 2005-10-29 21:40:38 -07:00
thrash.c [PATCH] swaptoken tuning 2005-10-29 21:40:35 -07:00
tiny-shmem.c
truncate.c
vmalloc.c [PATCH] vmalloc_node 2005-10-29 21:40:35 -07:00
vmscan.c [PATCH] shrink_list(): skip anon pages if not may_swap 2005-10-29 21:40:36 -07:00