
From: "Paul E. McKenney" <paulmck@us.ibm.com>

A memory barrier is required, since a spin_unlock() orders writes but not
reads.

(This may come as a surprise to code that expects to read a consistent set
of values under a lock, then access them outside the lock...  But I am sure
that this topic has been chewed over many times before...  In such cases,
you would of course need an smp_rmb() preceding the spin_unlock().)




 25-akpm/mm/memory.c |    3 ++-
 1 files changed, 2 insertions(+), 1 deletion(-)

diff -puN mm/memory.c~no_page-memory-barriers mm/memory.c
--- 25/mm/memory.c~no_page-memory-barriers	Mon Jul 28 15:39:05 2003
+++ 25-akpm/mm/memory.c	Mon Jul 28 15:39:05 2003
@@ -1390,10 +1390,11 @@ do_no_page(struct mm_struct *mm, struct 
 		return do_anonymous_page(mm, vma, page_table,
 					pmd, write_access, address);
 	pte_unmap(page_table);
+	spin_unlock(&mm->page_table_lock);
 
 	mapping = vma->vm_file->f_dentry->d_inode->i_mapping;
 	sequence = atomic_read(&mapping->truncate_count);
-	spin_unlock(&mm->page_table_lock);
+	smp_rmb();  /* Prevent CPU from reordering lock-free ->nopage() */
 retry:
 	new_page = vma->vm_ops->nopage(vma, address & PAGE_MASK, 0);
 

_
