diff options
author | alc <alc@FreeBSD.org> | 2003-09-23 04:28:04 +0000 |
---|---|---|
committer | alc <alc@FreeBSD.org> | 2003-09-23 04:28:04 +0000 |
commit | 1adbd0035e01b5e125de7222da250f6c0cb4634a (patch) | |
tree | 27e37e50ee8b55f1b392d753bcdce94d2b34711b /sys/vm/vm_map.c | |
parent | 0414766399840f87486055798dc24ef28705b182 (diff) | |
download | FreeBSD-src-1adbd0035e01b5e125de7222da250f6c0cb4634a.zip FreeBSD-src-1adbd0035e01b5e125de7222da250f6c0cb4634a.tar.gz |
Change the handling of the kernel and kmem objects in vm_map_delete(): In
order to use "unmanaged" pages in the kmem object, vm_map_delete() must
unconditionally perform pmap_remove(). Otherwise, sparc64 has problems.
Tested by: jake
Diffstat (limited to 'sys/vm/vm_map.c')
-rw-r--r-- | sys/vm/vm_map.c | 41 |
1 files changed, 18 insertions, 23 deletions
diff --git a/sys/vm/vm_map.c b/sys/vm/vm_map.c index 31972f5..ebc4040 100644 --- a/sys/vm/vm_map.c +++ b/sys/vm/vm_map.c @@ -2185,32 +2185,27 @@ 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) { + mtx_lock(&Giant); + vm_page_lock_queues(); + pmap_remove(map->pmap, s, e); + vm_page_unlock_queues(); + if (object != NULL) { VM_OBJECT_LOCK(object); - vm_object_page_remove(object, offidxstart, offidxend, FALSE); - VM_OBJECT_UNLOCK(object); - } else { - mtx_lock(&Giant); - vm_page_lock_queues(); - pmap_remove(map->pmap, s, e); - vm_page_unlock_queues(); - if (object != NULL) { - VM_OBJECT_LOCK(object); - if (object->ref_count != 1 && - (object->flags & (OBJ_NOSPLIT|OBJ_ONEMAPPING)) == OBJ_ONEMAPPING && - (object->type == OBJT_DEFAULT || object->type == OBJT_SWAP)) { - vm_object_collapse(object); - vm_object_page_remove(object, offidxstart, offidxend, FALSE); - if (object->type == OBJT_SWAP) - swap_pager_freespace(object, offidxstart, count); - if (offidxend >= object->size && - offidxstart < object->size) - object->size = offidxstart; - } - VM_OBJECT_UNLOCK(object); + if (object->ref_count != 1 && + ((object->flags & (OBJ_NOSPLIT|OBJ_ONEMAPPING)) == OBJ_ONEMAPPING || + object == kernel_object || object == kmem_object) && + (object->type == OBJT_DEFAULT || object->type == OBJT_SWAP)) { + vm_object_collapse(object); + vm_object_page_remove(object, offidxstart, offidxend, FALSE); + if (object->type == OBJT_SWAP) + swap_pager_freespace(object, offidxstart, count); + if (offidxend >= object->size && + offidxstart < object->size) + object->size = offidxstart; } - mtx_unlock(&Giant); + VM_OBJECT_UNLOCK(object); } + mtx_unlock(&Giant); /* * Delete the entry (which may delete the object) only after |