* vm_map_entry_delete: [ internal use only ] * * Deallocate the given entry from the target map. */
| 3850 | * Deallocate the given entry from the target map. |
| 3851 | */ |
| 3852 | static void |
| 3853 | vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry) |
| 3854 | { |
| 3855 | vm_object_t object; |
| 3856 | vm_pindex_t offidxstart, offidxend, size1; |
| 3857 | vm_size_t size; |
| 3858 | |
| 3859 | vm_map_entry_unlink(map, entry, UNLINK_MERGE_NONE); |
| 3860 | object = entry->object.vm_object; |
| 3861 | |
| 3862 | if ((entry->eflags & MAP_ENTRY_GUARD) != 0) { |
| 3863 | MPASS(entry->cred == NULL); |
| 3864 | MPASS((entry->eflags & MAP_ENTRY_IS_SUB_MAP) == 0); |
| 3865 | MPASS(object == NULL); |
| 3866 | vm_map_entry_deallocate(entry, map->system_map); |
| 3867 | return; |
| 3868 | } |
| 3869 | |
| 3870 | size = entry->end - entry->start; |
| 3871 | map->size -= size; |
| 3872 | |
| 3873 | if (entry->cred != NULL) { |
| 3874 | swap_release_by_cred(size, entry->cred); |
| 3875 | crfree(entry->cred); |
| 3876 | } |
| 3877 | |
| 3878 | if ((entry->eflags & MAP_ENTRY_IS_SUB_MAP) != 0 || object == NULL) { |
| 3879 | entry->object.vm_object = NULL; |
| 3880 | } else if ((object->flags & OBJ_ANON) != 0 || |
| 3881 | object == kernel_object) { |
| 3882 | KASSERT(entry->cred == NULL || object->cred == NULL || |
| 3883 | (entry->eflags & MAP_ENTRY_NEEDS_COPY), |
| 3884 | ("OVERCOMMIT vm_map_entry_delete: both cred %p", entry)); |
| 3885 | offidxstart = OFF_TO_IDX(entry->offset); |
| 3886 | offidxend = offidxstart + atop(size); |
| 3887 | VM_OBJECT_WLOCK(object); |
| 3888 | if (object->ref_count != 1 && |
| 3889 | ((object->flags & OBJ_ONEMAPPING) != 0 || |
| 3890 | object == kernel_object)) { |
| 3891 | vm_object_collapse(object); |
| 3892 | |
| 3893 | /* |
| 3894 | * The option OBJPR_NOTMAPPED can be passed here |
| 3895 | * because vm_map_delete() already performed |
| 3896 | * pmap_remove() on the only mapping to this range |
| 3897 | * of pages. |
| 3898 | */ |
| 3899 | vm_object_page_remove(object, offidxstart, offidxend, |
| 3900 | OBJPR_NOTMAPPED); |
| 3901 | if (offidxend >= object->size && |
| 3902 | offidxstart < object->size) { |
| 3903 | size1 = object->size; |
| 3904 | object->size = offidxstart; |
| 3905 | if (object->cred != NULL) { |
| 3906 | size1 -= object->size; |
| 3907 | KASSERT(object->charge >= ptoa(size1), |
| 3908 | ("object %p charge < 0", object)); |
| 3909 | swap_release_by_cred(ptoa(size1), |
no test coverage detected