svn commit: r191986 - head/sys/kern

Alan Cox alc at FreeBSD.org
Mon May 11 05:16:59 UTC 2009


Author: alc
Date: Mon May 11 05:16:57 2009
New Revision: 191986
URL: http://svn.freebsd.org/changeset/base/191986

Log:
  Revert CVS revision 1.94 (svn r16840).  Current pmap implementations don't
  suffer from the race condition that motivated revision 1.94.  Consequently,
  the work-around that was implemented by revision 1.94 is no longer needed.
  Moreover, reverting this work-around eliminates the need for
  vfs_busy_pages() to acquire the page queues lock when preparing a buffer
  for read.
  
  Reviewed by:	tegge

Modified:
  head/sys/kern/vfs_bio.c

Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c	Mon May 11 04:57:40 2009	(r191985)
+++ head/sys/kern/vfs_bio.c	Mon May 11 05:16:57 2009	(r191986)
@@ -3519,7 +3519,8 @@ retry:
 			goto retry;
 	}
 	bogus = 0;
-	vm_page_lock_queues();
+	if (clear_modify)
+		vm_page_lock_queues();
 	for (i = 0; i < bp->b_npages; i++) {
 		m = bp->b_pages[i];
 
@@ -3542,17 +3543,18 @@ retry:
 		 * It may not work properly with small-block devices.
 		 * We need to find a better way.
 		 */
-		pmap_remove_all(m);
-		if (clear_modify)
+		if (clear_modify) {
+			pmap_remove_write(m);
 			vfs_page_set_valid(bp, foff, m);
-		else if (m->valid == VM_PAGE_BITS_ALL &&
+		} else if (m->valid == VM_PAGE_BITS_ALL &&
 		    (bp->b_flags & B_CACHE) == 0) {
 			bp->b_pages[i] = bogus_page;
 			bogus++;
 		}
 		foff = (foff + PAGE_SIZE) & ~(off_t)PAGE_MASK;
 	}
-	vm_page_unlock_queues();
+	if (clear_modify)
+		vm_page_unlock_queues();
 	VM_OBJECT_UNLOCK(obj);
 	if (bogus)
 		pmap_qenter(trunc_page((vm_offset_t)bp->b_data),


More information about the svn-src-all mailing list