Index: vm_map.c =================================================================== --- vm_map.c +++ vm_map.c @@ -2186,8 +2186,19 @@ VM_MAP_ASSERT_LOCKED(map); KASSERT(entry->end > start && entry->start < start, ("_vm_map_clip_start: invalid clip of entry %p", entry)); - vm_map_simplify_entry(map, entry); + if ((entry->eflags & MAP_ENTRY_NOMERGE_MASK) == 0 && + (vm_map_mergeable_neighbors(entry->prev, entry) || + vm_map_mergeable_neighbors(entry, entry->next))) { + printf("%s: simplifying entry start %jx end %jx next_read %jx " + "max_free %jx eflags %jx object-type %d\n", __func__, + (uintmax_t)entry->start, (uintmax_t)entry->end, + (uintmax_t)entry->next_read, (uintmax_t)entry->max_free, + (uintmax_t)entry->eflags, + entry->object.vm_object ? entry->object.vm_object->type : -1); + vm_map_simplify_entry(map, entry); + } + /* * Create a backing object now, if none exists, so that more individual * objects won't be created after the map entry is split. @@ -2472,9 +2483,7 @@ VM_MAP_RANGE_CHECK(map, start, end); - if (vm_map_lookup_entry(map, start, &entry)) { - vm_map_clip_start(map, entry, start); - } else { + if (!vm_map_lookup_entry(map, start, &entry)) { entry = entry->next; } @@ -2515,6 +2524,8 @@ * now will do cow due to allowed write (e.g. debugger sets * breakpoint on text segment) */ + if (entry->start < start) + vm_map_clip_start(map, entry, start); for (current = entry; current->start < end; current = current->next) { vm_map_clip_end(map, current, end);