svn commit: r205055 - user/kmacy/head_page_lock/sys/vm

Kip Macy kmacy at FreeBSD.org
Fri Mar 12 00:25:05 UTC 2010


Author: kmacy
Date: Fri Mar 12 00:25:04 2010
New Revision: 205055
URL: http://svn.freebsd.org/changeset/base/205055

Log:
  - we can't assert that the page queue mutex is not owned if we're aliasing the
    page lock to it
  - we need to acquire the page queue lock before calling pmap_enter_object
    on architectures that don't use page lock

Modified:
  user/kmacy/head_page_lock/sys/vm/vm_map.c
  user/kmacy/head_page_lock/sys/vm/vm_page.c
  user/kmacy/head_page_lock/sys/vm/vm_page.h

Modified: user/kmacy/head_page_lock/sys/vm/vm_map.c
==============================================================================
--- user/kmacy/head_page_lock/sys/vm/vm_map.c	Thu Mar 11 23:32:10 2010	(r205054)
+++ user/kmacy/head_page_lock/sys/vm/vm_map.c	Fri Mar 12 00:25:04 2010	(r205055)
@@ -1714,6 +1714,7 @@ vm_map_pmap_enter(vm_map_t map, vm_offse
 	vm_offset_t start;
 	vm_page_t p, p_start;
 	vm_pindex_t psize, tmpidx;
+	boolean_t are_queues_locked;
 
 	if ((prot & (VM_PROT_READ | VM_PROT_EXECUTE)) == 0 || object == NULL)
 		return;
@@ -1735,6 +1736,7 @@ vm_map_pmap_enter(vm_map_t map, vm_offse
 		psize = object->size - pindex;
 	}
 
+	are_queues_locked = FALSE;
 	start = 0;
 	p_start = NULL;
 
@@ -1768,15 +1770,31 @@ vm_map_pmap_enter(vm_map_t map, vm_offse
 				p_start = p;
 			}
 		} else if (p_start != NULL) {
+#ifndef VM_PAGE_LOCK
+			if (!are_queues_locked) {
+				are_queues_locked = TRUE;
+				vm_page_lock_queues();
+			}
+#endif			
 			pmap_enter_object(map->pmap, start, addr +
 			    ptoa(tmpidx), p_start, prot);
 			p_start = NULL;
 		}
 	}
 	if (p_start != NULL) {
+#ifndef VM_PAGE_LOCK
+		if (!are_queues_locked) {
+			are_queues_locked = TRUE;
+			vm_page_lock_queues();
+		}
+#endif		
 		pmap_enter_object(map->pmap, start, addr + ptoa(psize),
 		    p_start, prot);
 	}
+#ifndef VM_PAGE_LOCK
+	if (are_queues_locked)
+		vm_page_unlock_queues();
+#endif	
 unlock_return:
 	VM_OBJECT_UNLOCK(object);
 }

Modified: user/kmacy/head_page_lock/sys/vm/vm_page.c
==============================================================================
--- user/kmacy/head_page_lock/sys/vm/vm_page.c	Thu Mar 11 23:32:10 2010	(r205054)
+++ user/kmacy/head_page_lock/sys/vm/vm_page.c	Fri Mar 12 00:25:04 2010	(r205055)
@@ -1318,7 +1318,7 @@ vm_pageq_remove_locked(vm_page_t m)
 void
 vm_pageq_remove(vm_page_t m)
 {
-	mtx_assert(&vm_page_queue_mtx, MA_NOTOWNED);
+	vm_page_lock_queues_assert_notowned();
 	_vm_pageq_remove(m, FALSE);
 }
 
@@ -1335,7 +1335,7 @@ _vm_page_enqueue(int queue, vm_page_t m,
 	struct vpgqueues *vpq;
 
 	if (locked == FALSE) {
-		mtx_assert(&vm_page_queue_mtx, MA_NOTOWNED);
+		vm_page_lock_queues_assert_notowned();
 		vm_page_lock_queues();
 	}
 #ifdef INVARIANTS

Modified: user/kmacy/head_page_lock/sys/vm/vm_page.h
==============================================================================
--- user/kmacy/head_page_lock/sys/vm/vm_page.h	Thu Mar 11 23:32:10 2010	(r205054)
+++ user/kmacy/head_page_lock/sys/vm/vm_page.h	Fri Mar 12 00:25:04 2010	(r205055)
@@ -275,8 +275,10 @@ extern struct vpglocks vm_page_queue_loc
 
 #ifdef VM_PAGE_LOCK
 #define	vm_page_lockptr(m)		pmap_page_lockptr(m)
+#define	vm_page_lock_queues_assert_notowned()   mtx_assert(vm_page_lockptr((m)), MA_NOTOWNED)
 #else
 #define	vm_page_lockptr(m)		(&vm_page_queue_mtx)
+#define	vm_page_lock_queues_assert_notowned()   
 #endif
 #define	vm_page_lock(m)		mtx_lock(vm_page_lockptr((m)))
 #define	vm_page_unlock(m)	mtx_unlock(vm_page_lockptr((m)))


More information about the svn-src-user mailing list