Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_map.c
Show First 20 Lines • Show All 1,244 Lines • ▼ Show 20 Lines | vm_map_entry_link(vm_map_t map, vm_map_entry_t entry) | ||||
entry->next = rlist; | entry->next = rlist; | ||||
llist->next = rlist->prev = entry; | llist->next = rlist->prev = entry; | ||||
entry->left = entry->right = NULL; | entry->left = entry->right = NULL; | ||||
vm_map_splay_merge(map, entry, llist, rlist); | vm_map_splay_merge(map, entry, llist, rlist); | ||||
VM_MAP_ASSERT_CONSISTENT(map); | VM_MAP_ASSERT_CONSISTENT(map); | ||||
} | } | ||||
enum unlink_merge_type { | enum unlink_merge_type { | ||||
UNLINK_MERGE_PREV, | |||||
UNLINK_MERGE_NONE, | UNLINK_MERGE_NONE, | ||||
UNLINK_MERGE_NEXT | UNLINK_MERGE_NEXT | ||||
}; | }; | ||||
static void | static void | ||||
vm_map_entry_unlink(vm_map_t map, vm_map_entry_t entry, | vm_map_entry_unlink(vm_map_t map, vm_map_entry_t entry, | ||||
enum unlink_merge_type op) | enum unlink_merge_type op) | ||||
{ | { | ||||
vm_map_entry_t llist, rlist, root, y; | vm_map_entry_t llist, rlist, root, y; | ||||
VM_MAP_ASSERT_LOCKED(map); | VM_MAP_ASSERT_LOCKED(map); | ||||
root = vm_map_splay_split(map, entry->start, 0, &llist, &rlist); | root = vm_map_splay_split(map, entry->start, 0, &llist, &rlist); | ||||
KASSERT(root != NULL, | KASSERT(root != NULL, | ||||
("vm_map_entry_unlink: unlink object not mapped")); | ("vm_map_entry_unlink: unlink object not mapped")); | ||||
vm_map_splay_findnext(root, &rlist); | |||||
switch (op) { | switch (op) { | ||||
case UNLINK_MERGE_PREV: | |||||
vm_map_splay_findprev(root, &llist); | |||||
llist->end = root->end; | |||||
y = root->right; | |||||
root = llist; | |||||
llist = root->right; | |||||
root->right = y; | |||||
break; | |||||
case UNLINK_MERGE_NEXT: | case UNLINK_MERGE_NEXT: | ||||
vm_map_splay_findnext(root, &rlist); | |||||
rlist->start = root->start; | rlist->start = root->start; | ||||
rlist->offset = root->offset; | rlist->offset = root->offset; | ||||
y = root->left; | y = root->left; | ||||
root = rlist; | root = rlist; | ||||
rlist = root->left; | rlist = root->left; | ||||
root->left = y; | root->left = y; | ||||
break; | break; | ||||
case UNLINK_MERGE_NONE: | case UNLINK_MERGE_NONE: | ||||
vm_map_splay_findprev(root, &llist); | vm_map_splay_findprev(root, &llist); | ||||
vm_map_splay_findnext(root, &rlist); | |||||
if (llist != &map->header) { | if (llist != &map->header) { | ||||
root = llist; | root = llist; | ||||
llist = root->right; | llist = root->right; | ||||
root->right = NULL; | root->right = NULL; | ||||
} else if (rlist != &map->header) { | } else if (rlist != &map->header) { | ||||
root = rlist; | root = rlist; | ||||
rlist = root->left; | rlist = root->left; | ||||
root->left = NULL; | root->left = NULL; | ||||
▲ Show 20 Lines • Show All 3,638 Lines • Show Last 20 Lines |