Skip to content

Commit

Permalink
[PATCH] mm: micro-optimise rmap
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Nick Piggin authored and Linus Torvalds committed Sep 5, 2005
1 parent c3dce2d commit 2822c1a
Showing 1 changed file with 11 additions and 10 deletions.
21 changes: 11 additions & 10 deletions mm/rmap.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 */
Expand Down

0 comments on commit 2822c1a

Please sign in to comment.