From: "Paul E. McKenney" 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); _