Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2822c1aa authored by Nick Piggin's avatar Nick Piggin Committed by Linus Torvalds
Browse files

[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: default avatarNick Piggin <npiggin@suse.de>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent c3dce2d8
Loading
Loading
Loading
Loading
+11 −10
Original line number Original line Diff line number Diff line
@@ -439,22 +439,23 @@ int page_referenced(struct page *page, int is_locked, int ignore_token)
void page_add_anon_rmap(struct page *page,
void page_add_anon_rmap(struct page *page,
	struct vm_area_struct *vma, unsigned long address)
	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(PageReserved(page));
	BUG_ON(!anon_vma);


	inc_mm_counter(vma->vm_mm, anon_rss);
	inc_mm_counter(vma->vm_mm, anon_rss);


	if (atomic_inc_and_test(&page->_mapcount)) {
		struct anon_vma *anon_vma = vma->anon_vma;
		pgoff_t index;

		BUG_ON(!anon_vma);
		anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
		anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
		page->mapping = (struct address_space *) anon_vma;

		index = (address - vma->vm_start) >> PAGE_SHIFT;
		index = (address - vma->vm_start) >> PAGE_SHIFT;
		index += vma->vm_pgoff;
		index += vma->vm_pgoff;
		index >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;
		index >>= PAGE_CACHE_SHIFT - PAGE_SHIFT;

	if (atomic_inc_and_test(&page->_mapcount)) {
		page->index = index;
		page->index = index;
		page->mapping = (struct address_space *) anon_vma;

		inc_page_state(nr_mapped);
		inc_page_state(nr_mapped);
	}
	}
	/* else checking page index and mapping is racy */
	/* else checking page index and mapping is racy */