<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">
From: Nick Piggin &lt;nickpiggin@yahoo.com.au&gt;

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 &lt;npiggin@suse.de&gt;
Signed-off-by: Andrew Morton &lt;akpm@osdl.org&gt;
---

 mm/rmap.c |   21 +++++++++++----------
 1 files changed, 11 insertions(+), 10 deletions(-)

diff -puN mm/rmap.c~mm-micro-optimise-rmap mm/rmap.c
--- 25/mm/rmap.c~mm-micro-optimise-rmap	Tue Jul 26 13:29:10 2005
+++ 25-akpm/mm/rmap.c	Tue Jul 26 13:29:10 2005
@@ -443,22 +443,23 @@ int page_referenced(struct page *page, i
 void page_add_anon_rmap(struct page *page,
 	struct vm_area_struct *vma, unsigned long address)
 {
-	struct anon_vma *anon_vma = vma-&gt;anon_vma;
-	pgoff_t index;
-
 	BUG_ON(PageReserved(page));
-	BUG_ON(!anon_vma);
 
 	inc_mm_counter(vma-&gt;vm_mm, anon_rss);
 
-	anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
-	index = (address - vma-&gt;vm_start) &gt;&gt; PAGE_SHIFT;
-	index += vma-&gt;vm_pgoff;
-	index &gt;&gt;= PAGE_CACHE_SHIFT - PAGE_SHIFT;
-
 	if (atomic_inc_and_test(&amp;page-&gt;_mapcount)) {
-		page-&gt;index = index;
+		struct anon_vma *anon_vma = vma-&gt;anon_vma;
+		pgoff_t index;
+
+		BUG_ON(!anon_vma);
+		anon_vma = (void *) anon_vma + PAGE_MAPPING_ANON;
 		page-&gt;mapping = (struct address_space *) anon_vma;
+
+		index = (address - vma-&gt;vm_start) &gt;&gt; PAGE_SHIFT;
+		index += vma-&gt;vm_pgoff;
+		index &gt;&gt;= PAGE_CACHE_SHIFT - PAGE_SHIFT;
+		page-&gt;index = index;
+
 		inc_page_state(nr_mapped);
 	}
 	/* else checking page index and mapping is racy */
_
</pre></body></html>