Index: sys/vm/vm_map.c =================================================================== --- sys/vm/vm_map.c +++ sys/vm/vm_map.c @@ -923,10 +923,12 @@ /* Rotate right and make y root. */ \ root->left = y->right; \ y->right = root; \ - vm_map_entry_set_max_free(root); \ + if (root->max_free == y->max_free) \ + vm_map_entry_set_max_free(root);\ root = y; \ y = root->left; \ } \ + root->max_free = root->right ? root->right->max_free : root->next->start - root->end;\ /* Put root on rlist. */ \ root->left = rlist; \ rlist = root; \ @@ -939,10 +941,12 @@ /* Rotate left and make y root. */ \ root->right = y->left; \ y->left = root; \ - vm_map_entry_set_max_free(root); \ + if (root->max_free == y->max_free) \ + vm_map_entry_set_max_free(root);\ root = y; \ y = root->right; \ } \ + root->max_free = root->left ? root->left->max_free : root->start - root->prev->end;\ /* Put root on llist. */ \ root->right = llist; \ llist = root; \ @@ -1015,18 +1019,31 @@ vm_map_entry_t ltree, vm_map_entry_t rtree) { vm_map_entry_t y; + vm_size_t max_free; + if (llist != NULL) + max_free = (ltree != NULL) ? ltree->max_free : + llist->next->start - llist->end; while (llist != NULL) { y = llist->right; llist->right = ltree; - vm_map_entry_set_max_free(llist); + if (llist->max_free < max_free) + llist->max_free = max_free; + else + max_free = llist->max_free; ltree = llist; llist = y; } + if (rlist != NULL) + max_free = (rtree != NULL) ? rtree->max_free : + rlist->start - rlist->prev->end; while (rlist != NULL) { y = rlist->left; rlist->left = rtree; - vm_map_entry_set_max_free(rlist); + if (rlist->max_free < max_free) + rlist->max_free = max_free; + else + max_free = rlist->max_free; rtree = rlist; rlist = y; } @@ -1132,10 +1149,6 @@ vm_map_entry_t llist, rlist, root, y; VM_MAP_ASSERT_LOCKED(map); - llist = entry->prev; - rlist = entry->next; - llist->next = rlist; - rlist->prev = llist; root = map->root; root = vm_map_splay_split(entry->start, 0, root, &llist, &rlist); KASSERT(root != NULL, @@ -1174,6 +1187,9 @@ root = NULL; break; } + y = entry->next; + y->prev = entry->prev; + y->prev->next = y; if (root != NULL) root = vm_map_splay_merge(root, llist, rlist, root->left, root->right);