Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_map.c
Show First 20 Lines • Show All 3,638 Lines • ▼ Show 20 Lines | |||||
* vm_map_entry_delete: [ internal use only ] | * vm_map_entry_delete: [ internal use only ] | ||||
* | * | ||||
* Deallocate the given entry from the target map. | * Deallocate the given entry from the target map. | ||||
*/ | */ | ||||
static void | static void | ||||
vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry) | vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry) | ||||
{ | { | ||||
vm_object_t object; | vm_object_t object; | ||||
vm_pindex_t offidxstart, offidxend, count, size1; | vm_pindex_t offidxstart, offidxend, size1; | ||||
vm_size_t size; | vm_size_t size; | ||||
vm_map_entry_unlink(map, entry, UNLINK_MERGE_NONE); | vm_map_entry_unlink(map, entry, UNLINK_MERGE_NONE); | ||||
object = entry->object.vm_object; | object = entry->object.vm_object; | ||||
if ((entry->eflags & MAP_ENTRY_GUARD) != 0) { | if ((entry->eflags & MAP_ENTRY_GUARD) != 0) { | ||||
MPASS(entry->cred == NULL); | MPASS(entry->cred == NULL); | ||||
MPASS((entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0); | MPASS((entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0); | ||||
Show All 12 Lines | vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry) | ||||
if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0 || object == NULL) { | if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0 || object == NULL) { | ||||
entry->object.vm_object = NULL; | entry->object.vm_object = NULL; | ||||
} else if ((object->flags & OBJ_ANON) != 0 || | } else if ((object->flags & OBJ_ANON) != 0 || | ||||
object == kernel_object) { | object == kernel_object) { | ||||
KASSERT(entry->cred == NULL || object->cred == NULL || | KASSERT(entry->cred == NULL || object->cred == NULL || | ||||
(entry->eflags & MAP_ENTRY_NEEDS_COPY), | (entry->eflags & MAP_ENTRY_NEEDS_COPY), | ||||
("OVERCOMMIT vm_map_entry_delete: both cred %p", entry)); | ("OVERCOMMIT vm_map_entry_delete: both cred %p", entry)); | ||||
count = atop(size); | |||||
offidxstart = OFF_TO_IDX(entry->offset); | offidxstart = OFF_TO_IDX(entry->offset); | ||||
offidxend = offidxstart + count; | offidxend = offidxstart + atop(size); | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
if (object->ref_count != 1 && | if (object->ref_count != 1 && | ||||
((object->flags & OBJ_ONEMAPPING) != 0 || | ((object->flags & OBJ_ONEMAPPING) != 0 || | ||||
object == kernel_object)) { | object == kernel_object)) { | ||||
vm_object_collapse(object); | vm_object_collapse(object); | ||||
/* | /* | ||||
* The option OBJPR_NOTMAPPED can be passed here | * The option OBJPR_NOTMAPPED can be passed here | ||||
* because vm_map_delete() already performed | * because vm_map_delete() already performed | ||||
* pmap_remove() on the only mapping to this range | * pmap_remove() on the only mapping to this range | ||||
* of pages. | * of pages. | ||||
*/ | */ | ||||
vm_object_page_remove(object, offidxstart, offidxend, | vm_object_page_remove(object, offidxstart, offidxend, | ||||
OBJPR_NOTMAPPED); | OBJPR_NOTMAPPED); | ||||
if (object->type == OBJT_SWAP) | |||||
swap_pager_freespace(object, offidxstart, | |||||
count); | |||||
if (offidxend >= object->size && | if (offidxend >= object->size && | ||||
offidxstart < object->size) { | offidxstart < object->size) { | ||||
size1 = object->size; | size1 = object->size; | ||||
object->size = offidxstart; | object->size = offidxstart; | ||||
if (object->cred != NULL) { | if (object->cred != NULL) { | ||||
size1 -= object->size; | size1 -= object->size; | ||||
KASSERT(object->charge >= ptoa(size1), | KASSERT(object->charge >= ptoa(size1), | ||||
("object %p charge < 0", object)); | ("object %p charge < 0", object)); | ||||
▲ Show 20 Lines • Show All 1,469 Lines • Show Last 20 Lines |