svn commit: r207573 - in head/sys: fs/tmpfs kern

Alan Cox alc at FreeBSD.org
Mon May 3 16:41:12 UTC 2010


Author: alc
Date: Mon May  3 16:41:11 2010
New Revision: 207573
URL: http://svn.freebsd.org/changeset/base/207573

Log:
  Acquire the page lock around vm_page_unwire() and vm_page_wire().
  
  Reviewed by:	kib

Modified:
  head/sys/fs/tmpfs/tmpfs_vnops.c
  head/sys/kern/vfs_bio.c

Modified: head/sys/fs/tmpfs/tmpfs_vnops.c
==============================================================================
--- head/sys/fs/tmpfs/tmpfs_vnops.c	Mon May  3 16:08:24 2010	(r207572)
+++ head/sys/fs/tmpfs/tmpfs_vnops.c	Mon May  3 16:41:11 2010	(r207573)
@@ -460,9 +460,11 @@ tmpfs_nocacheread(vm_object_t tobj, vm_p
 	error = uiomove_fromphys(&m, offset, tlen, uio);
 	VM_OBJECT_LOCK(tobj);
 out:
+	vm_page_lock(m);
 	vm_page_lock_queues();
 	vm_page_unwire(m, TRUE);
 	vm_page_unlock_queues();
+	vm_page_unlock(m);
 	vm_page_wakeup(m);
 	vm_object_pip_subtract(tobj, 1);
 	VM_OBJECT_UNLOCK(tobj);
@@ -691,6 +693,7 @@ nocache:
 out:
 	if (vobj != NULL)
 		VM_OBJECT_LOCK(vobj);
+	vm_page_lock(tpg);
 	vm_page_lock_queues();
 	if (error == 0) {
 		KASSERT(tpg->valid == VM_PAGE_BITS_ALL,
@@ -699,6 +702,7 @@ out:
 	}
 	vm_page_unwire(tpg, TRUE);
 	vm_page_unlock_queues();
+	vm_page_unlock(tpg);
 	vm_page_wakeup(tpg);
 	if (vpg != NULL)
 		vm_page_wakeup(vpg);

Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c	Mon May  3 16:08:24 2010	(r207572)
+++ head/sys/kern/vfs_bio.c	Mon May  3 16:41:11 2010	(r207573)
@@ -2942,7 +2942,6 @@ allocbuf(struct buf *bp, int size)
 				vm_page_t m;
 
 				VM_OBJECT_LOCK(bp->b_bufobj->bo_object);
-				vm_page_lock_queues();
 				for (i = desiredpages; i < bp->b_npages; i++) {
 					/*
 					 * the page is not freed here -- it
@@ -2952,13 +2951,17 @@ allocbuf(struct buf *bp, int size)
 					m = bp->b_pages[i];
 					KASSERT(m != bogus_page,
 					    ("allocbuf: bogus page found"));
-					while (vm_page_sleep_if_busy(m, TRUE, "biodep"))
-						vm_page_lock_queues();
+					while (vm_page_sleep_if_busy(m, TRUE,
+					    "biodep"))
+						continue;
 
 					bp->b_pages[i] = NULL;
+					vm_page_lock(m);
+					vm_page_lock_queues();
 					vm_page_unwire(m, 0);
+					vm_page_unlock_queues();
+					vm_page_unlock(m);
 				}
-				vm_page_unlock_queues();
 				VM_OBJECT_UNLOCK(bp->b_bufobj->bo_object);
 				pmap_qremove((vm_offset_t) trunc_page((vm_offset_t)bp->b_data) +
 				    (desiredpages << PAGE_SHIFT), (bp->b_npages - desiredpages));
@@ -3039,9 +3042,11 @@ allocbuf(struct buf *bp, int size)
 				/*
 				 * We have a good page.
 				 */
+				vm_page_lock(m);
 				vm_page_lock_queues();
 				vm_page_wire(m);
 				vm_page_unlock_queues();
+				vm_page_unlock(m);
 				bp->b_pages[bp->b_npages] = m;
 				++bp->b_npages;
 			}


More information about the svn-src-all mailing list