Index: sys/vm/vm_map.c =================================================================== --- sys/vm/vm_map.c +++ sys/vm/vm_map.c @@ -898,7 +898,7 @@ { vm_map_entry_t llist, rlist; vm_map_entry_t ltree, rtree; - vm_map_entry_t y; + vm_map_entry_t y, z; /* Special case of empty tree. */ if (root == NULL) @@ -914,46 +914,74 @@ */ llist = NULL; rlist = NULL; - for (;;) { + for (;; root = z) { /* root is never NULL in here. */ if (addr < root->start) { y = root->left; if (y == NULL) break; - if (addr < y->start && y->left != NULL) { - /* Rotate right and put y on rlist. */ - root->left = y->right; - y->right = root; - vm_map_entry_set_max_free(root); - root = y->left; - y->left = rlist; - rlist = y; - } else { - /* Put root on rlist. */ - root->left = rlist; - rlist = root; - root = y; + if (addr < y->start) { + z = y->left; + if (z != NULL) { + /* Put y on rlist. */ + y->left = rlist; + rlist = y; + /* Rotate right. */ + root->left = y->right; + y->right = root; + vm_map_entry_set_max_free(root); + continue; + } + } else if (addr >= y->end) { + z = y->right; + if (z != NULL) { + /* Put y on llist. */ + y->right = llist; + llist = y; + /* Put root on rlist. */ + root->left = rlist; + rlist = root; + continue; + } } + /* Put root on rlist. */ + root->left = rlist; + rlist = root; + root = y; } else if (addr >= root->end) { y = root->right; if (y == NULL) break; - if (addr >= y->end && y->right != NULL) { - /* Rotate left and put y on llist. */ - root->right = y->left; - y->left = root; - vm_map_entry_set_max_free(root); - root = y->right; - y->right = llist; - llist = y; - } else { - /* Put root on llist. */ - root->right = llist; - llist = root; - root = y; + if (addr >= y->end) { + z = y->right; + if (z != NULL) { + /* Put y on llist. */ + y->right = llist; + llist = y; + /* Rotate left. */ + root->right = y->left; + y->left = root; + vm_map_entry_set_max_free(root); + continue; + } + } else if (addr < y->start) { + z = y->left; + if (z != NULL) { + /* Put y on rlist */ + y->left = rlist; + rlist = y; + /* Put root on llist. */ + root->right = llist; + llist = root; + continue; + } } - } else - break; + /* Put root on llist. */ + root->right = llist; + llist = root; + root = y; + } + break; } /*