summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_map.c
diff options
context:
space:
mode:
authoralc <alc@FreeBSD.org>2003-04-20 04:35:47 +0000
committeralc <alc@FreeBSD.org>2003-04-20 04:35:47 +0000
commit4b5c8b175773d037d7ef7063aa757dea8d0d620d (patch)
tree326137925ca7d52e7c48c4ef73b2cd4f276d110a /sys/vm/vm_map.c
parent5990076d783520423f3e4ee52281b37b3482e6c2 (diff)
downloadFreeBSD-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.c14
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);
}
/*
OpenPOWER on IntegriCloud