summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Piggin <nickpiggin@yahoo.com.au>2005-09-03 15:54:47 -0700
committerLinus Torvalds <torvalds@evo.osdl.org>2005-09-05 00:05:43 -0700
commit2822c1aa574d277b9ba0130b1e71c1a5874bc04a (patch)
tree6a48d5db83831b6521bbc5795a70ea5ab7446b0e
parentc3dce2d89c269d5373a120d4a22fc2426ec992b0 (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>
-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)
void page_add_anon_rmap(struct page *page,
struct vm_area_struct *vma, unsigned long address)
{
- struct anon_vma *anon_vma = vma->anon_vma;
- pgoff_t index;
-
BUG_ON(PageReserved(page));
- BUG_ON(!anon_vma);
inc_mm_counter(vma->vm_mm, anon_rss);
- anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
- index = (address - vma->vm_start) >> PAGE_SHIFT;
- index += vma->vm_pgoff;
- index >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
-
if (atomic_inc_and_test(&page->_mapcount)) {
- page->index = index;
+ struct anon_vma *anon_vma = vma->anon_vma;
+ pgoff_t index;
+
+ BUG_ON(!anon_vma);
+ anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
page->mapping = (struct address_space *) anon_vma;
+
+ index = (address - vma->vm_start) >> PAGE_SHIFT;
+ index += vma->vm_pgoff;
+ index >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
+ page->index = index;
+
inc_page_state(nr_mapped);
}
/* else checking page index and mapping is racy */