MCPcopy Create free account
hub / github.com/F-Stack/f-stack / vm_map_entry_delete

Function vm_map_entry_delete

freebsd/vm/vm_map.c:3852–3923  ·  view source on GitHub ↗

* vm_map_entry_delete: [ internal use only ] * * Deallocate the given entry from the target map. */

Source from the content-addressed store, hash-verified

3850 * Deallocate the given entry from the target map.
3851 */
3852static void
3853vm_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),

Callers 2

vm_map_deleteFunction · 0.85
vm_map_growstackFunction · 0.85

Calls 6

vm_map_entry_unlinkFunction · 0.85
vm_map_entry_deallocateFunction · 0.85
swap_release_by_credFunction · 0.85
vm_object_collapseFunction · 0.85
vm_object_page_removeFunction · 0.85
crfreeFunction · 0.50

Tested by

no test coverage detected