[PATCH] mm: rss = file_rss + anon_rss
[linux-block.git] / mm / rmap.c
index 450f5241b5a525282ae7eb150fe322423b01e570..504757624cce720f2cd424c13d6448111c86e6ca 100644 (file)
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -298,7 +298,11 @@ static int page_referenced_one(struct page *page,
                if (ptep_clear_flush_young(vma, address, pte))
                        referenced++;
 
-               if (mm != current->mm && !ignore_token && has_swap_token(mm))
+               /* Pretend the page is referenced if the task has the
+                  swap token and is in the middle of a page fault. */
+               if (mm != current->mm && !ignore_token &&
+                               has_swap_token(mm) &&
+                               rwsem_is_locked(&mm->mmap_sem))
                        referenced++;
 
                (*mapcount)--;
@@ -441,8 +445,6 @@ void page_add_anon_rmap(struct page *page,
 {
        BUG_ON(PageReserved(page));
 
-       inc_mm_counter(vma->vm_mm, anon_rss);
-
        if (atomic_inc_and_test(&page->_mapcount)) {
                struct anon_vma *anon_vma = vma->anon_vma;
 
@@ -557,9 +559,9 @@ static int try_to_unmap_one(struct page *page, struct vm_area_struct *vma)
                set_pte_at(mm, address, pte, swp_entry_to_pte(entry));
                BUG_ON(pte_file(*pte));
                dec_mm_counter(mm, anon_rss);
-       }
+       } else
+               dec_mm_counter(mm, file_rss);
 
-       dec_mm_counter(mm, rss);
        page_remove_rmap(page);
        page_cache_release(page);
 
@@ -663,7 +665,7 @@ static void try_to_unmap_cluster(unsigned long cursor,
 
                page_remove_rmap(page);
                page_cache_release(page);
-               dec_mm_counter(mm, rss);
+               dec_mm_counter(mm, file_rss);
                (*mapcount)--;
        }