Index: sys/vm/vm_map.c =================================================================== --- sys/vm/vm_map.c +++ sys/vm/vm_map.c @@ -2346,22 +2346,28 @@ static void _vm_map_clip_start(vm_map_t map, vm_map_entry_t entry, vm_offset_t start) { - vm_map_entry_t new_entry; + vm_map_entry_t new_entry, prev_entry; VM_MAP_ASSERT_LOCKED(map); KASSERT(entry->end > start && entry->start < start, ("_vm_map_clip_start: invalid clip of entry %p", entry)); - new_entry = vm_map_entry_clone(map, entry); - /* * Split off the front portion. Insert the new entry BEFORE this one, * so that this entry has the specified starting address. */ - new_entry->end = start; - entry->offset += (start - entry->start); - entry->start = start; - vm_map_entry_link(map, new_entry); + new_entry = vm_map_entry_clone(map, entry); + prev_entry = vm_map_entry_pred(entry); + if (prev_entry->right == entry) + prev_entry->right = new_entry; + if (entry->left == prev_entry) + entry->left = new_entry; + else + new_entry->left = prev_entry; + new_entry->right = entry; + entry->offset += start - entry->start; + new_entry->end = entry->start = start; + new_entry->max_free = new_entry->start - prev_entry->end; } /* @@ -2384,21 +2390,28 @@ static void _vm_map_clip_end(vm_map_t map, vm_map_entry_t entry, vm_offset_t end) { - vm_map_entry_t new_entry; + vm_map_entry_t next_entry, new_entry; VM_MAP_ASSERT_LOCKED(map); KASSERT(entry->start < end && entry->end > end, ("_vm_map_clip_end: invalid clip of entry %p", entry)); - new_entry = vm_map_entry_clone(map, entry); - /* * Split off the back portion. Insert the new entry AFTER this one, * so that this entry has the specified ending address. */ + new_entry = vm_map_entry_clone(map, entry); + next_entry = vm_map_entry_succ(entry); + if (next_entry->left == entry) + next_entry->left = new_entry; + if (entry->right == next_entry) + entry->right = new_entry; + else + new_entry->right = next_entry; + new_entry->left = entry; + new_entry->offset += end - entry->start; new_entry->start = entry->end = end; - new_entry->offset += (end - entry->start); - vm_map_entry_link(map, new_entry); + new_entry->max_free = next_entry->start - new_entry->end; } /*