diff options
Diffstat (limited to 'mm/rmap.c')
-rw-r--r-- | mm/rmap.c | 21 |
1 files changed, 11 insertions, 10 deletions
@@ -439,22 +439,23 @@ int page_referenced(struct page *page, int is_locked, int ignore_token) | |||
439 | void page_add_anon_rmap(struct page *page, | 439 | void 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 */ |