aboutsummaryrefslogtreecommitdiff
path: root/sys/vm/vm_kern.c
diff options
context:
space:
mode:
authorAlan Cox <alc@FreeBSD.org>2002-12-20 18:59:23 +0000
committerAlan Cox <alc@FreeBSD.org>2002-12-20 18:59:23 +0000
commit671e427ce9efde1b8f39fd87fe11dc0d4654f0e7 (patch)
tree2bf1355f14df4ab983c3c7b57fa9b23199678c91 /sys/vm/vm_kern.c
parentcc7bab9032f2e57226577e07389b67bd16cd7ede (diff)
downloadsrc-671e427ce9efde1b8f39fd87fe11dc0d4654f0e7.tar.gz
src-671e427ce9efde1b8f39fd87fe11dc0d4654f0e7.zip
Increase the scope of the kmem_object locking in kmem_malloc().
Notes
Notes: svn path=/head/; revision=108138
Diffstat (limited to 'sys/vm/vm_kern.c')
-rw-r--r--sys/vm/vm_kern.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/sys/vm/vm_kern.c b/sys/vm/vm_kern.c
index 2596e1d91054..37010829a7f3 100644
--- a/sys/vm/vm_kern.c
+++ b/sys/vm/vm_kern.c
@@ -359,7 +359,7 @@ kmem_malloc(map, size, flags)
if (flags & M_ZERO)
pflags |= VM_ALLOC_ZERO;
-
+ vm_object_lock(kmem_object);
for (i = 0; i < size; i += PAGE_SIZE) {
retry:
m = vm_page_alloc(kmem_object, OFF_TO_IDX(offset + i), pflags);
@@ -371,9 +371,11 @@ retry:
*/
if (m == NULL) {
if ((flags & M_NOWAIT) == 0) {
+ vm_object_unlock(kmem_object);
vm_map_unlock(map);
VM_WAIT;
vm_map_lock(map);
+ vm_object_lock(kmem_object);
goto retry;
}
/*
@@ -384,14 +386,13 @@ retry:
*/
while (i != 0) {
i -= PAGE_SIZE;
- vm_object_lock(kmem_object);
m = vm_page_lookup(kmem_object,
OFF_TO_IDX(offset + i));
vm_page_lock_queues();
vm_page_free(m);
vm_page_unlock_queues();
- vm_object_unlock(kmem_object);
}
+ vm_object_unlock(kmem_object);
vm_map_delete(map, addr, addr + size);
vm_map_unlock(map);
goto bad;
@@ -401,6 +402,7 @@ retry:
vm_page_flag_clear(m, PG_ZERO);
m->valid = VM_PAGE_BITS_ALL;
}
+ vm_object_unlock(kmem_object);
/*
* Mark map entry as non-pageable. Assert: vm_map_insert() will never