Index: sys/vm/vm_map.c =================================================================== --- sys/vm/vm_map.c +++ sys/vm/vm_map.c @@ -1665,6 +1665,8 @@ vm_map_merged_neighbor_dispose(vm_map_t map, vm_map_entry_t entry) { + vm_map_entry_unlink(map, entry); + /* * If the backing object is a vnode object, * vm_object_deallocate() calls vrele(). @@ -1710,20 +1712,15 @@ prev = entry->prev; if (prev != &map->header && vm_map_mergeable_neighbors(prev, entry)) { - vm_map_entry_unlink(map, prev); entry->start = prev->start; 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_merged_neighbor_dispose(map, next); } } @@ -3916,13 +3913,14 @@ stack_entry->offset, (vm_size_t)(stack_entry->end - stack_entry->start), (vm_size_t)grow_amount, cred != NULL)) { + stack_entry->end += grow_amount; + map->size += grow_amount; if (gap_entry->start + grow_amount == gap_entry->end) vm_map_entry_delete(map, gap_entry); - else + else { gap_entry->start += grow_amount; - stack_entry->end += grow_amount; - map->size += grow_amount; - vm_map_entry_resize_free(map, stack_entry); + vm_map_entry_resize_free(map, stack_entry); + } rv = KERN_SUCCESS; } else rv = KERN_FAILURE;