diff options
author | alc <alc@FreeBSD.org> | 2003-04-20 04:35:47 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-04-20 04:35:47 +0000 |
commit | 4b5c8b175773d037d7ef7063aa757dea8d0d620d (patch) | |
tree | 326137925ca7d52e7c48c4ef73b2cd4f276d110a /sys/vm/vm_map.c | |
parent | 5990076d783520423f3e4ee52281b37b3482e6c2 (diff) | |
download | FreeBSD-src-4b5c8b175773d037d7ef7063aa757dea8d0d620d.zip FreeBSD-src-4b5c8b175773d037d7ef7063aa757dea8d0d620d.tar.gz |
Update vm_object locking in vm_map_delete().
Diffstat (limited to 'sys/vm/vm_map.c')
-rw-r--r-- | sys/vm/vm_map.c | 14 |
1 files changed, 9 insertions, 5 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index ca1cac5..0450ee5 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -2119,12 +2119,14 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end) offidxend = offidxstart + count; - if ((object == kernel_object) || (object == kmem_object)) { - vm_object_lock(object); + if (object == kernel_object || object == kmem_object) { + if (object == kernel_object) + GIANT_REQUIRED; + VM_OBJECT_LOCK(object); vm_object_page_remove(object, offidxstart, offidxend, FALSE); - vm_object_unlock(object); + VM_OBJECT_UNLOCK(object); } else { - vm_object_lock(object); + mtx_lock(&Giant); vm_page_lock_queues(); pmap_remove(map->pmap, s, e); vm_page_unlock_queues(); @@ -2133,7 +2135,9 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end) (object->flags & (OBJ_NOSPLIT|OBJ_ONEMAPPING)) == OBJ_ONEMAPPING && (object->type == OBJT_DEFAULT || object->type == OBJT_SWAP)) { vm_object_collapse(object); + VM_OBJECT_LOCK(object); vm_object_page_remove(object, offidxstart, offidxend, FALSE); + VM_OBJECT_UNLOCK(object); if (object->type == OBJT_SWAP) { swap_pager_freespace(object, offidxstart, count); } @@ -2142,7 +2146,7 @@ vm_map_delete(vm_map_t map, vm_offset_t start, vm_offset_t end) object->size = offidxstart; } } - vm_object_unlock(object); + mtx_unlock(&Giant); } /* |