| 1478 | }; |
| 1479 | |
| 1480 | static void |
| 1481 | vm_map_entry_unlink(vm_map_t map, vm_map_entry_t entry, |
| 1482 | enum unlink_merge_type op) |
| 1483 | { |
| 1484 | vm_map_entry_t header, llist, rlist, root; |
| 1485 | vm_size_t max_free_left, max_free_right; |
| 1486 | |
| 1487 | VM_MAP_ASSERT_LOCKED(map); |
| 1488 | header = &map->header; |
| 1489 | root = vm_map_splay_split(map, entry->start, 0, &llist, &rlist); |
| 1490 | KASSERT(root != NULL, |
| 1491 | ("vm_map_entry_unlink: unlink object not mapped")); |
| 1492 | |
| 1493 | vm_map_splay_findprev(root, &llist); |
| 1494 | vm_map_splay_findnext(root, &rlist); |
| 1495 | if (op == UNLINK_MERGE_NEXT) { |
| 1496 | rlist->start = root->start; |
| 1497 | rlist->offset = root->offset; |
| 1498 | } |
| 1499 | if (llist != header) { |
| 1500 | root = llist; |
| 1501 | llist = root->right; |
| 1502 | max_free_left = vm_map_splay_merge_left(header, root, llist); |
| 1503 | max_free_right = vm_map_splay_merge_succ(header, root, rlist); |
| 1504 | } else if (rlist != header) { |
| 1505 | root = rlist; |
| 1506 | rlist = root->left; |
| 1507 | max_free_left = vm_map_splay_merge_pred(header, root, llist); |
| 1508 | max_free_right = vm_map_splay_merge_right(header, root, rlist); |
| 1509 | } else { |
| 1510 | header->left = header->right = header; |
| 1511 | root = NULL; |
| 1512 | } |
| 1513 | if (root != NULL) |
| 1514 | root->max_free = vm_size_max(max_free_left, max_free_right); |
| 1515 | map->root = root; |
| 1516 | VM_MAP_ASSERT_CONSISTENT(map); |
| 1517 | map->nentries--; |
| 1518 | CTR3(KTR_VM, "vm_map_entry_unlink: map %p, nentries %d, entry %p", map, |
| 1519 | map->nentries, entry); |
| 1520 | } |
| 1521 | |
| 1522 | /* |
| 1523 | * vm_map_entry_resize: |
no test coverage detected