smaps: add clear_refs file to clear reference
authorDavid Rientjes <rientjes@google.com>
Sun, 6 May 2007 21:49:24 +0000 (14:49 -0700)
committerLinus Torvalds <torvalds@woody.linux-foundation.org>
Mon, 7 May 2007 19:12:52 +0000 (12:12 -0700)
commitb813e931b4c8235bb42e301096ea97dbdee3e8fe
treef8182687bffe8e3b95bac69b2cc7fdfe674ddc53
parentf79f177c25016647cc92ffac8afa7cb96ce47011
smaps: add clear_refs file to clear reference

Adds /proc/pid/clear_refs.  When any non-zero number is written to this file,
pte_mkold() and ClearPageReferenced() is called for each pte and its
corresponding page, respectively, in that task's VMAs.  This file is only
writable by the user who owns the task.

It is now possible to measure _approximately_ how much memory a task is using
by clearing the reference bits with

echo 1 > /proc/pid/clear_refs

and checking the reference count for each VMA from the /proc/pid/smaps output
at a measured time interval.  For example, to observe the approximate change
in memory footprint for a task, write a script that clears the references
(echo 1 > /proc/pid/clear_refs), sleeps, and then greps for Pgs_Referenced and
extracts the size in kB.  Add the sizes for each VMA together for the total
referenced footprint.  Moments later, repeat the process and observe the
difference.

For example, using an efficient Mozilla:

accumulated time referenced memory
---------------- -----------------
 0 s  408 kB
 1 s  408 kB
 2 s  556 kB
 3 s 1028 kB
 4 s  872 kB
 5 s 1956 kB
 6 s  416 kB
 7 s 1560 kB
 8 s 2336 kB
 9 s 1044 kB
10 s  416 kB

This is a valuable tool to get an approximate measurement of the memory
footprint for a task.

Cc: Hugh Dickins <hugh@veritas.com>
Cc: Paul Mundt <lethal@linux-sh.org>
Cc: Christoph Lameter <clameter@sgi.com>
Signed-off-by: David Rientjes <rientjes@google.com>
[akpm@linux-foundation.org: build fixes]
[mpm@selenic.com: rename for_each_pmd]
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Documentation/filesystems/proc.txt
fs/proc/base.c
fs/proc/task_mmu.c
include/linux/proc_fs.h