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 /mm/hugetlb.c | |
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 'mm/hugetlb.c')
-rw-r--r-- | mm/hugetlb.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/mm/hugetlb.c b/mm/hugetlb.c index 61d380678030..094455bcbbf7 100644 --- a/mm/hugetlb.c +++ b/mm/hugetlb.c | |||
@@ -286,7 +286,7 @@ int copy_hugetlb_page_range(struct mm_struct *dst, struct mm_struct *src, | |||
286 | entry = *src_pte; | 286 | entry = *src_pte; |
287 | ptepage = pte_page(entry); | 287 | ptepage = pte_page(entry); |
288 | get_page(ptepage); | 288 | get_page(ptepage); |
289 | add_mm_counter(dst, rss, HPAGE_SIZE / PAGE_SIZE); | 289 | add_mm_counter(dst, file_rss, HPAGE_SIZE / PAGE_SIZE); |
290 | set_huge_pte_at(dst, addr, dst_pte, entry); | 290 | set_huge_pte_at(dst, addr, dst_pte, entry); |
291 | } | 291 | } |
292 | spin_unlock(&src->page_table_lock); | 292 | spin_unlock(&src->page_table_lock); |
@@ -324,7 +324,7 @@ void unmap_hugepage_range(struct vm_area_struct *vma, unsigned long start, | |||
324 | 324 | ||
325 | page = pte_page(pte); | 325 | page = pte_page(pte); |
326 | put_page(page); | 326 | put_page(page); |
327 | add_mm_counter(mm, rss, - (HPAGE_SIZE / PAGE_SIZE)); | 327 | add_mm_counter(mm, file_rss, (int) -(HPAGE_SIZE / PAGE_SIZE)); |
328 | } | 328 | } |
329 | flush_tlb_range(vma, start, end); | 329 | flush_tlb_range(vma, start, end); |
330 | } | 330 | } |
@@ -386,7 +386,7 @@ int hugetlb_prefault(struct address_space *mapping, struct vm_area_struct *vma) | |||
386 | goto out; | 386 | goto out; |
387 | } | 387 | } |
388 | } | 388 | } |
389 | add_mm_counter(mm, rss, HPAGE_SIZE / PAGE_SIZE); | 389 | add_mm_counter(mm, file_rss, HPAGE_SIZE / PAGE_SIZE); |
390 | set_huge_pte_at(mm, addr, pte, make_huge_pte(vma, page)); | 390 | set_huge_pte_at(mm, addr, pte, make_huge_pte(vma, page)); |
391 | } | 391 | } |
392 | out: | 392 | out: |