diff options
author | kib <kib@FreeBSD.org> | 2009-02-08 20:39:17 +0000 |
---|---|---|
committer | kib <kib@FreeBSD.org> | 2009-02-08 20:39:17 +0000 |
commit | ae7c4cfa1196d4f42be0f573c827a5dd2d385af9 (patch) | |
tree | 090d271c805930a672a18b2da7d0cd0774d02586 /sys/vm/vm_mmap.c | |
parent | 9a341e28ebd8cb82b35c8eeb849a7607597d399e (diff) | |
download | FreeBSD-src-ae7c4cfa1196d4f42be0f573c827a5dd2d385af9.zip FreeBSD-src-ae7c4cfa1196d4f42be0f573c827a5dd2d385af9.tar.gz |
Do not call vm_object_deallocate() from vm_map_delete(), because we
hold the map lock there, and might need the vnode lock for OBJT_VNODE
objects. Postpone object deallocation until caller of vm_map_delete()
drops the map lock. Link the map entries to be freed into the freelist,
that is released by the new helper function vm_map_entry_free_freelist().
Reviewed by: tegge, alc
Tested by: pho
Diffstat (limited to 'sys/vm/vm_mmap.c')
-rw-r--r-- | sys/vm/vm_mmap.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/sys/vm/vm_mmap.c b/sys/vm/vm_mmap.c index 2d668c4..4ee9dfc 100644 --- a/sys/vm/vm_mmap.c +++ b/sys/vm/vm_mmap.c @@ -552,6 +552,7 @@ munmap(td, uap) vm_offset_t addr; vm_size_t size, pageoff; vm_map_t map; + vm_map_entry_t freelist; addr = (vm_offset_t) uap->addr; size = uap->len; @@ -571,6 +572,7 @@ munmap(td, uap) map = &td->td_proc->p_vmspace->vm_map; if (addr < vm_map_min(map) || addr + size > vm_map_max(map)) return (EINVAL); + freelist = NULL; vm_map_lock(map); #ifdef HWPMC_HOOKS /* @@ -593,8 +595,9 @@ munmap(td, uap) } #endif /* returns nothing but KERN_SUCCESS anyway */ - vm_map_delete(map, addr, addr + size); + vm_map_delete(map, addr, addr + size, &freelist); vm_map_unlock(map); + vm_map_entry_free_freelist(map, freelist); return (0); } |