Index: sys/vm/vm_map.c =================================================================== --- sys/vm/vm_map.c +++ sys/vm/vm_map.c @@ -917,36 +917,44 @@ entry->max_free = MAX(max_left, max_right); } -#define SPLAY_LEFT_STEP(root, y, rlist, test) do { \ - y = root->left; \ - if (y != NULL && (test)) { \ - /* Rotate right and make y root. */ \ - root->left = y->right; \ - y->right = root; \ - vm_map_entry_set_max_free(root); \ - root = y; \ - y = root->left; \ - } \ - /* Put root on rlist. */ \ - root->left = rlist; \ - rlist = root; \ - root = y; \ +#define SPLAY_LEFT_STEP(root, y, rlist, test) do { \ + y = root->left; \ + if (y != NULL && (test)) { \ + /* Rotate right and make y root. */ \ + root->left = y->right; \ + y->right = root; \ + if (root->max_free == y->max_free) \ + vm_map_entry_set_max_free(root); \ + root = y; \ + y = root->left; \ + } \ + /* Put root on rlist. */ \ + if (root->max_free == (y != NULL) ? \ + y->max_free : root->start - root->prev->end) \ + root->max_free = 0; \ + root->left = rlist; \ + rlist = root; \ + root = y; \ } while (0) -#define SPLAY_RIGHT_STEP(root, y, llist, test) do { \ - y = root->right; \ - if (y != NULL && (test)) { \ - /* Rotate left and make y root. */ \ - root->right = y->left; \ - y->left = root; \ - vm_map_entry_set_max_free(root); \ - root = y; \ - y = root->right; \ - } \ - /* Put root on llist. */ \ - root->right = llist; \ - llist = root; \ - root = y; \ +#define SPLAY_RIGHT_STEP(root, y, llist, test) do { \ + y = root->right; \ + if (y != NULL && (test)) { \ + /* Rotate left and make y root. */ \ + root->right = y->left; \ + y->left = root; \ + if (root->max_free == y->max_free) \ + vm_map_entry_set_max_free(root); \ + root = y; \ + y = root->right; \ + } \ + /* Put root on llist. */ \ + if (root->max_free == (y != NULL) ? \ + y->max_free : root->next->start - root->end) \ + root->max_free = 0; \ + root->right = llist; \ + llist = root; \ + root = y; \ } while (0) /* @@ -1019,14 +1027,24 @@ while (llist != NULL) { y = llist->right; llist->right = ltree; - vm_map_entry_set_max_free(llist); + if (llist->max_free == 0) + vm_map_entry_set_max_free(llist); + else + llist->max_free = MAX(llist->max_free, + ((ltree != NULL) ? ltree->max_free : + llist->next->start - llist->end)); ltree = llist; llist = y; } while (rlist != NULL) { y = rlist->left; rlist->left = rtree; - vm_map_entry_set_max_free(rlist); + if (rlist->max_free == 0) + vm_map_entry_set_max_free(rlist); + else + rlist->max_free = MAX(rlist->max_free, + ((rtree != NULL) ? rtree->max_free : + rlist->start - rlist->prev->end)); rtree = rlist; rlist = y; }