diff options
author | Alan Cox <alc@FreeBSD.org> | 2002-12-20 18:59:23 +0000 |
---|---|---|
committer | Alan Cox <alc@FreeBSD.org> | 2002-12-20 18:59:23 +0000 |
commit | 671e427ce9efde1b8f39fd87fe11dc0d4654f0e7 (patch) | |
tree | 2bf1355f14df4ab983c3c7b57fa9b23199678c91 /sys/vm/vm_kern.c | |
parent | cc7bab9032f2e57226577e07389b67bd16cd7ede (diff) | |
download | src-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.c | 8 |
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 |