summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_mmap.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2009-02-08 20:39:17 +0000
committerkib <kib@FreeBSD.org>2009-02-08 20:39:17 +0000
commitae7c4cfa1196d4f42be0f573c827a5dd2d385af9 (patch)
tree090d271c805930a672a18b2da7d0cd0774d02586 /sys/vm/vm_mmap.c
parent9a341e28ebd8cb82b35c8eeb849a7607597d399e (diff)
downloadFreeBSD-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.c5
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);
}
OpenPOWER on IntegriCloud