aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mm/rmap.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/mm/rmap.c b/mm/rmap.c
index f5a6966b7eb0..7e975ca24c78 100644
--- a/mm/rmap.c
+++ b/mm/rmap.c
@@ -439,22 +439,23 @@ int page_referenced(struct page *page, int is_locked, int ignore_token)
439void page_add_anon_rmap(struct page *page, 439void page_add_anon_rmap(struct page *page,
440 struct vm_area_struct *vma, unsigned long address) 440 struct vm_area_struct *vma, unsigned long address)
441{ 441{
442 struct anon_vma *anon_vma = vma->anon_vma;
443 pgoff_t index;
444
445 BUG_ON(PageReserved(page)); 442 BUG_ON(PageReserved(page));
446 BUG_ON(!anon_vma);
447 443
448 inc_mm_counter(vma->vm_mm, anon_rss); 444 inc_mm_counter(vma->vm_mm, anon_rss);
449 445
450 anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
451 index = (address - vma->vm_start) >> PAGE_SHIFT;
452 index += vma->vm_pgoff;
453 index >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
454
455 if (atomic_inc_and_test(&page->_mapcount)) { 446 if (atomic_inc_and_test(&page->_mapcount)) {
456 page->index = index; 447 struct anon_vma *anon_vma = vma->anon_vma;
448 pgoff_t index;
449
450 BUG_ON(!anon_vma);
451 anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
457 page->mapping = (struct address_space *) anon_vma; 452 page->mapping = (struct address_space *) anon_vma;
453
454 index = (address - vma->vm_start) >> PAGE_SHIFT;
455 index += vma->vm_pgoff;
456 index >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
457 page->index = index;
458
458 inc_page_state(nr_mapped); 459 inc_page_state(nr_mapped);
459 } 460 }
460 /* else checking page index and mapping is racy */ 461 /* else checking page index and mapping is racy */