diff options
author | Hugh Dickins <hugh@veritas.com> | 2005-10-29 21:16:05 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@g5.osdl.org> | 2005-10-30 00:40:38 -0400 |
commit | 4294621f41a85497019fae64341aa5351a1921b7 (patch) | |
tree | fdeb7eb44384a99d0679ffa6de5019bab0ea2166 /fs | |
parent | 404351e67a9facb475abf1492245374a28d13e90 (diff) |
[PATCH] mm: rss = file_rss + anon_rss
I was lazy when we added anon_rss, and chose to change as few places as
possible. So currently each anonymous page has to be counted twice, in rss
and in anon_rss. Which won't be so good if those are atomic counts in some
configurations.
Change that around: keep file_rss and anon_rss separately, and add them
together (with get_mm_rss macro) when the total is needed - reading two
atomics is much cheaper than updating two atomics. And update anon_rss
upfront, typically in memory.c, not tucked away in page_add_anon_rmap.
Signed-off-by: Hugh Dickins <hugh@veritas.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'fs')
-rw-r--r-- | fs/exec.c | 2 | ||||
-rw-r--r-- | fs/proc/array.c | 2 | ||||
-rw-r--r-- | fs/proc/task_mmu.c | 8 |
3 files changed, 5 insertions, 7 deletions
@@ -330,7 +330,7 @@ void install_arg_page(struct vm_area_struct *vma, | |||
330 | pte_unmap(pte); | 330 | pte_unmap(pte); |
331 | goto out; | 331 | goto out; |
332 | } | 332 | } |
333 | inc_mm_counter(mm, rss); | 333 | inc_mm_counter(mm, anon_rss); |
334 | lru_cache_add_active(page); | 334 | lru_cache_add_active(page); |
335 | set_pte_at(mm, address, pte, pte_mkdirty(pte_mkwrite(mk_pte( | 335 | set_pte_at(mm, address, pte, pte_mkdirty(pte_mkwrite(mk_pte( |
336 | page, vma->vm_page_prot)))); | 336 | page, vma->vm_page_prot)))); |
diff --git a/fs/proc/array.c b/fs/proc/array.c index d84eecacbeaf..3e1239e4b303 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c | |||
@@ -438,7 +438,7 @@ static int do_task_stat(struct task_struct *task, char * buffer, int whole) | |||
438 | jiffies_to_clock_t(it_real_value), | 438 | jiffies_to_clock_t(it_real_value), |
439 | start_time, | 439 | start_time, |
440 | vsize, | 440 | vsize, |
441 | mm ? get_mm_counter(mm, rss) : 0, /* you might want to shift this left 3 */ | 441 | mm ? get_mm_rss(mm) : 0, |
442 | rsslim, | 442 | rsslim, |
443 | mm ? mm->start_code : 0, | 443 | mm ? mm->start_code : 0, |
444 | mm ? mm->end_code : 0, | 444 | mm ? mm->end_code : 0, |
diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c index 994612bc72d0..bccee7cf9ccd 100644 --- a/fs/proc/task_mmu.c +++ b/fs/proc/task_mmu.c | |||
@@ -29,7 +29,7 @@ char *task_mem(struct mm_struct *mm, char *buffer) | |||
29 | "VmPTE:\t%8lu kB\n", | 29 | "VmPTE:\t%8lu kB\n", |
30 | (mm->total_vm - mm->reserved_vm) << (PAGE_SHIFT-10), | 30 | (mm->total_vm - mm->reserved_vm) << (PAGE_SHIFT-10), |
31 | mm->locked_vm << (PAGE_SHIFT-10), | 31 | mm->locked_vm << (PAGE_SHIFT-10), |
32 | get_mm_counter(mm, rss) << (PAGE_SHIFT-10), | 32 | get_mm_rss(mm) << (PAGE_SHIFT-10), |
33 | data << (PAGE_SHIFT-10), | 33 | data << (PAGE_SHIFT-10), |
34 | mm->stack_vm << (PAGE_SHIFT-10), text, lib, | 34 | mm->stack_vm << (PAGE_SHIFT-10), text, lib, |
35 | (PTRS_PER_PTE*sizeof(pte_t)*mm->nr_ptes) >> 10); | 35 | (PTRS_PER_PTE*sizeof(pte_t)*mm->nr_ptes) >> 10); |
@@ -44,13 +44,11 @@ unsigned long task_vsize(struct mm_struct *mm) | |||
44 | int task_statm(struct mm_struct *mm, int *shared, int *text, | 44 | int task_statm(struct mm_struct *mm, int *shared, int *text, |
45 | int *data, int *resident) | 45 | int *data, int *resident) |
46 | { | 46 | { |
47 | int rss = get_mm_counter(mm, rss); | 47 | *shared = get_mm_counter(mm, file_rss); |
48 | |||
49 | *shared = rss - get_mm_counter(mm, anon_rss); | ||
50 | *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) | 48 | *text = (PAGE_ALIGN(mm->end_code) - (mm->start_code & PAGE_MASK)) |
51 | >> PAGE_SHIFT; | 49 | >> PAGE_SHIFT; |
52 | *data = mm->total_vm - mm->shared_vm; | 50 | *data = mm->total_vm - mm->shared_vm; |
53 | *resident = rss; | 51 | *resident = *shared + get_mm_counter(mm, anon_rss); |
54 | return mm->total_vm; | 52 | return mm->total_vm; |
55 | } | 53 | } |
56 | 54 | ||