Index: sys/vm/vm_map.c =================================================================== --- sys/vm/vm_map.c +++ sys/vm/vm_map.c @@ -1033,27 +1033,39 @@ map->root = entry; } +enum unlink_merge_type {UNLINK_MERGE_PREV, UNLINK_MERGE_NONE, UNLINK_MERGE_NEXT}; + static void vm_map_entry_unlink(vm_map_t map, - vm_map_entry_t entry) + vm_map_entry_t entry, + unlink_merge_type op) { vm_map_entry_t next, prev, root; VM_MAP_ASSERT_LOCKED(map); + prev = entry->prev; + next = entry->next; if (entry != map->root) vm_map_entry_splay(entry->start, map->root); - if (entry->left == NULL) + if (prev == &map->header) root = entry->right; else { - root = vm_map_entry_splay(entry->start, entry->left); + root = vm_map_entry_splay(prev->start, entry->left); root->right = entry->right; - root->adj_free = entry->next->start - root->end; + switch(op) { + case UNLINK_MERGE_PREV: + prev->end = entry->end; + break; + case UNLINK_MERGE_NONE: + break; + case UNLINK_MERGE_NEXT: + next->start = entry->start; + break; + } + prev->adj_free = next->start - prev->end; vm_map_entry_set_max_free(root); } map->root = root; - - prev = entry->prev; - next = entry->next; next->prev = prev; prev->next = next; map->nentries--; @@ -1710,20 +1722,15 @@ prev = entry->prev; if (prev != &map->header && vm_map_mergeable_neighbors(prev, entry)) { - vm_map_entry_unlink(map, prev); - entry->start = prev->start; + vm_map_entry_unlink(map, prev, UNLINK_MERGE_NEXT); entry->offset = prev->offset; - if (entry->prev != &map->header) - vm_map_entry_resize_free(map, entry->prev); vm_map_merged_neighbor_dispose(map, prev); } next = entry->next; if (next != &map->header && vm_map_mergeable_neighbors(entry, next)) { - vm_map_entry_unlink(map, next); - entry->end = next->end; - vm_map_entry_resize_free(map, entry); + vm_map_entry_unlink(map, next, UNLINK_MERGE_PREV); vm_map_merged_neighbor_dispose(map, next); } } @@ -3007,7 +3014,7 @@ vm_pindex_t offidxstart, offidxend, count, size1; vm_size_t size; - vm_map_entry_unlink(map, entry); + vm_map_entry_unlink(map, entry, UNLINK_MERGE_NONE); object = entry->object.vm_object; if ((entry->eflags & MAP_ENTRY_GUARD) != 0) {