aboutsummaryrefslogtreecommitdiffstats
path: root/mm/rmap.c
diff options
context:
space:
mode:
authorRik van Riel <riel@redhat.com>2010-08-09 20:19:48 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2010-08-09 23:45:02 -0400
commitad8c2ee801ad7a52d919b478d9b2c7b39a72d295 (patch)
treebc56cc023da3467447b0aecd30c0516881d53992 /mm/rmap.c
parent51b1bd2ace1595b72956224deda349efa880b693 (diff)
rmap: add exclusive page to private anon_vma on swapin
On swapin it is fairly common for a page to be owned exclusively by one process. In that case we want to add the page to the anon_vma of that process's VMA, instead of to the root anon_vma. This will reduce the amount of rmap searching that the swapout code needs to do. Signed-off-by: Rik van Riel <riel@redhat.com> Cc: Andrea Arcangeli <aarcange@redhat.com> Cc: KOSAKI Motohiro <kosaki.motohiro@jp.fujitsu.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'mm/rmap.c')
-rw-r--r--mm/rmap.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/mm/rmap.c b/mm/rmap.c
index 4d152a6d3a89..a7d0f5482634 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -830,6 +830,17 @@ static void __page_check_anon_rmap(struct page *page,
830void page_add_anon_rmap(struct page *page, 830void page_add_anon_rmap(struct page *page,
831 struct vm_area_struct *vma, unsigned long address) 831 struct vm_area_struct *vma, unsigned long address)
832{ 832{
833 do_page_add_anon_rmap(page, vma, address, 0);
834}
835
836/*
837 * Special version of the above for do_swap_page, which often runs
838 * into pages that are exclusively owned by the current process.
839 * Everybody else should continue to use page_add_anon_rmap above.
840 */
841void do_page_add_anon_rmap(struct page *page,
842 struct vm_area_struct *vma, unsigned long address, int exclusive)
843{
833 int first = atomic_inc_and_test(&page->_mapcount); 844 int first = atomic_inc_and_test(&page->_mapcount);
834 if (first) 845 if (first)
835 __inc_zone_page_state(page, NR_ANON_PAGES); 846 __inc_zone_page_state(page, NR_ANON_PAGES);
@@ -839,7 +850,7 @@ void page_add_anon_rmap(struct page *page,
839 VM_BUG_ON(!PageLocked(page)); 850 VM_BUG_ON(!PageLocked(page));
840 VM_BUG_ON(address < vma->vm_start || address >= vma->vm_end); 851 VM_BUG_ON(address < vma->vm_start || address >= vma->vm_end);
841 if (first) 852 if (first)
842 __page_set_anon_rmap(page, vma, address, 0); 853 __page_set_anon_rmap(page, vma, address, exclusive);
843 else 854 else
844 __page_check_anon_rmap(page, vma, address); 855 __page_check_anon_rmap(page, vma, address);
845} 856}