diff options
author | Nick Piggin <nickpiggin@yahoo.com.au> | 2005-09-03 18:54:47 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@evo.osdl.org> | 2005-09-05 03:05:43 -0400 |
commit | 2822c1aa574d277b9ba0130b1e71c1a5874bc04a (patch) | |
tree | 6a48d5db83831b6521bbc5795a70ea5ab7446b0e /mm/rmap.c | |
parent | c3dce2d89c269d5373a120d4a22fc2426ec992b0 (diff) |
[PATCH] mm: micro-optimise rmap
Microoptimise page_add_anon_rmap. Although these expressions are used only in
the taken branch of the if() statement, the compiler can't reorder them inside
because atomic_inc_and_test is a barrier.
Signed-off-by: Nick Piggin <npiggin@suse.de>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
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 */ |