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