svn commit: r207617 - in head/sys: dev/drm kern net vm

Alan Cox alc at FreeBSD.org
Tue May 4 15:55:42 UTC 2010


Author: alc
Date: Tue May  4 15:55:41 2010
New Revision: 207617
URL: http://svn.freebsd.org/changeset/base/207617

Log:
  Add page locking to the vm_page_cow* functions.
  
  Push down the acquisition and release of the page queues lock into
  vm_page_wire().
  
  Reviewed by:	kib

Modified:
  head/sys/dev/drm/via_dmablit.c
  head/sys/kern/uipc_cow.c
  head/sys/kern/vfs_bio.c
  head/sys/net/bpf_zerocopy.c
  head/sys/vm/vm_fault.c
  head/sys/vm/vm_page.c

Modified: head/sys/dev/drm/via_dmablit.c
==============================================================================
--- head/sys/dev/drm/via_dmablit.c	Tue May  4 15:52:17 2010	(r207616)
+++ head/sys/dev/drm/via_dmablit.c	Tue May  4 15:55:41 2010	(r207617)
@@ -251,10 +251,8 @@ via_lock_all_dma_pages(drm_via_sg_info_t
 		if (m == NULL)
 			break;
 		vm_page_lock(m);
-		vm_page_lock_queues();
 		vm_page_wire(m);
 		vm_page_unhold(m);
-		vm_page_unlock_queues();
 		vm_page_unlock(m);
 		vsg->pages[i] = m;
 	}

Modified: head/sys/kern/uipc_cow.c
==============================================================================
--- head/sys/kern/uipc_cow.c	Tue May  4 15:52:17 2010	(r207616)
+++ head/sys/kern/uipc_cow.c	Tue May  4 15:55:41 2010	(r207617)
@@ -131,10 +131,8 @@ socow_setup(struct mbuf *m0, struct uio 
 	 * set up COW
 	 */
 	vm_page_lock(pp);
-	vm_page_lock_queues();
 	if (vm_page_cowsetup(pp) != 0) {
 		vm_page_unhold(pp);
-		vm_page_unlock_queues();
 		vm_page_unlock(pp);
 		return (0);
 	}
@@ -144,7 +142,6 @@ socow_setup(struct mbuf *m0, struct uio 
 	 */
 	vm_page_wire(pp);
 	vm_page_unhold(pp);
-	vm_page_unlock_queues();
 	vm_page_unlock(pp);
 	/*
 	 * Allocate an sf buf

Modified: head/sys/kern/vfs_bio.c
==============================================================================
--- head/sys/kern/vfs_bio.c	Tue May  4 15:52:17 2010	(r207616)
+++ head/sys/kern/vfs_bio.c	Tue May  4 15:55:41 2010	(r207617)
@@ -3043,9 +3043,7 @@ 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;

Modified: head/sys/net/bpf_zerocopy.c
==============================================================================
--- head/sys/net/bpf_zerocopy.c	Tue May  4 15:52:17 2010	(r207616)
+++ head/sys/net/bpf_zerocopy.c	Tue May  4 15:55:41 2010	(r207617)
@@ -171,10 +171,8 @@ zbuf_sfbuf_get(struct vm_map *map, vm_of
 	if (pp == NULL)
 		return (NULL);
 	vm_page_lock(pp);
-	vm_page_lock_queues();
 	vm_page_wire(pp);
 	vm_page_unhold(pp);
-	vm_page_unlock_queues();
 	vm_page_unlock(pp);
 	sf = sf_buf_alloc(pp, SFB_NOWAIT);
 	if (sf == NULL) {

Modified: head/sys/vm/vm_fault.c
==============================================================================
--- head/sys/vm/vm_fault.c	Tue May  4 15:52:17 2010	(r207616)
+++ head/sys/vm/vm_fault.c	Tue May  4 15:55:41 2010	(r207617)
@@ -315,8 +315,6 @@ RetryFault:;
 			    (fault_type & VM_PROT_WRITE) &&
 			    (fs.object == fs.first_object)) {
 				vm_page_cowfault(fs.m);
-				vm_page_unlock_queues();
-				vm_page_unlock(fs.m);
 				unlock_and_deallocate(&fs);
 				goto RetryFault;
 			}
@@ -797,9 +795,7 @@ vnode_locked:
 				if (wired && (fault_flags &
 				    VM_FAULT_CHANGE_WIRING) == 0) {
 					vm_page_lock(fs.first_m);
-					vm_page_lock_queues();
 					vm_page_wire(fs.first_m);
-					vm_page_unlock_queues();
 					vm_page_unlock(fs.first_m);
 					
 					vm_page_lock(fs.m);
@@ -1285,9 +1281,7 @@ vm_fault_copy_entry(vm_map_t dst_map, vm
 			vm_page_unlock(src_m);
 
 			vm_page_lock(dst_m);
-			vm_page_lock_queues();
 			vm_page_wire(dst_m);
-			vm_page_unlock_queues();
 			vm_page_unlock(dst_m);
 		} else {
 			vm_page_lock(dst_m);

Modified: head/sys/vm/vm_page.c
==============================================================================
--- head/sys/vm/vm_page.c	Tue May  4 15:52:17 2010	(r207616)
+++ head/sys/vm/vm_page.c	Tue May  4 15:55:41 2010	(r207617)
@@ -1544,13 +1544,15 @@ vm_page_wire(vm_page_t m)
 	 * and only unqueue the page if it is on some queue (if it is unmanaged
 	 * it is already off the queues).
 	 */
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
 	vm_page_lock_assert(m, MA_OWNED);
 	if (m->flags & PG_FICTITIOUS)
 		return;
 	if (m->wire_count == 0) {
-		if ((m->flags & PG_UNMANAGED) == 0)
+		if ((m->flags & PG_UNMANAGED) == 0) {
+			vm_page_lock_queues();
 			vm_pageq_remove(m);
+			vm_page_unlock_queues();
+		}
 		atomic_add_int(&cnt.v_wire_count, 1);
 	}
 	m->wire_count++;
@@ -1922,9 +1924,7 @@ retrylookup:
 		} else {
 			if ((allocflags & VM_ALLOC_WIRED) != 0) {
 				vm_page_lock(m);
-				vm_page_lock_queues();
 				vm_page_wire(m);
-				vm_page_unlock_queues();
 				vm_page_unlock(m);
 			}
 			if ((allocflags & VM_ALLOC_NOBUSY) == 0)
@@ -2224,6 +2224,7 @@ vm_page_cowfault(vm_page_t m)
 	vm_object_t object;
 	vm_pindex_t pindex;
 
+	vm_page_lock_assert(m, MA_OWNED);
 	object = m->object;
 	VM_OBJECT_LOCK_ASSERT(object, MA_OWNED);
 	KASSERT(object->paging_in_progress != 0,
@@ -2238,17 +2239,18 @@ vm_page_cowfault(vm_page_t m)
 	if (mnew == NULL) {
 		vm_page_insert(m, object, pindex);
 		vm_page_unlock_queues();
+		vm_page_unlock(m);
 		VM_OBJECT_UNLOCK(object);
 		VM_WAIT;
 		VM_OBJECT_LOCK(object);
 		if (m == vm_page_lookup(object, pindex)) {
+			vm_page_lock(m);
 			vm_page_lock_queues();
 			goto retry_alloc;
 		} else {
 			/*
 			 * Page disappeared during the wait.
 			 */
-			vm_page_lock_queues();
 			return;
 		}
 	}
@@ -2269,13 +2271,15 @@ vm_page_cowfault(vm_page_t m)
 		mnew->wire_count = m->wire_count - m->cow;
 		m->wire_count = m->cow;
 	}
+	vm_page_unlock_queues();
+	vm_page_unlock(m);
 }
 
 void 
 vm_page_cowclear(vm_page_t m)
 {
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	vm_page_lock_assert(m, MA_OWNED);
 	if (m->cow) {
 		m->cow--;
 		/* 
@@ -2291,11 +2295,13 @@ int
 vm_page_cowsetup(vm_page_t m)
 {
 
-	mtx_assert(&vm_page_queue_mtx, MA_OWNED);
+	vm_page_lock_assert(m, MA_OWNED);
 	if (m->cow == USHRT_MAX - 1)
 		return (EBUSY);
 	m->cow++;
+	vm_page_lock_queues();
 	pmap_remove_write(m);
+	vm_page_unlock_queues();
 	return (0);
 }
 


More information about the svn-src-head mailing list