Page MenuHomeFreeBSD

D19826.id55937.diff
No OneTemporary

D19826.id55937.diff

Index: sys/vm/vm_map.c
===================================================================
--- sys/vm/vm_map.c
+++ sys/vm/vm_map.c
@@ -923,10 +923,20 @@
/* 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) \
+ root->max_free = MAX( \
+ (root->left != NULL) ? \
+ root->left->max_free : \
+ root->start - y->end, \
+ (root->right != NULL) ? \
+ root->right->max_free : \
+ rlist->start - root->end); \
root = y; \
y = root->left; \
} \
+ root->max_free = (root->right != NULL) ? \
+ root->right->max_free : \
+ rlist->start - root->end; \
/* Put root on rlist. */ \
root->left = rlist; \
rlist = root; \
@@ -939,10 +949,20 @@
/* 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) \
+ root->max_free = MAX( \
+ (root->left != NULL) ? \
+ root->left->max_free : \
+ root->start - llist->end, \
+ (root->right != NULL) ? \
+ root->right->max_free : \
+ y->start - root->end); \
root = y; \
y = root->right; \
} \
+ root->max_free = (root->left != NULL) ? \
+ root->left->max_free : \
+ root->start - llist->end; \
/* Put root on llist. */ \
root->right = llist; \
llist = root; \
@@ -959,13 +979,13 @@
*/
static vm_map_entry_t
vm_map_splay_split(vm_offset_t addr, vm_size_t length,
- vm_map_entry_t root, vm_map_entry_t *out_llist, vm_map_entry_t *out_rlist)
+ vm_map_entry_t root, vm_map_entry_t *io_llist, vm_map_entry_t *io_rlist)
{
vm_map_entry_t llist, rlist;
vm_map_entry_t y;
- llist = NULL;
- rlist = NULL;
+ llist = *io_llist;
+ rlist = *io_rlist;
while (root != NULL && root->max_free >= length) {
if (addr < root->start) {
SPLAY_LEFT_STEP(root, y, rlist,
@@ -976,8 +996,8 @@
} else
break;
}
- *out_llist = llist;
- *out_rlist = rlist;
+ *io_llist = llist;
+ *io_rlist = rlist;
return (root);
}
@@ -1015,18 +1035,31 @@
vm_map_entry_t ltree, vm_map_entry_t rtree)
{
vm_map_entry_t y;
+ vm_size_t max_free;
- while (llist != NULL) {
+ if ((llist->eflags & MAP_ENTRY_HEADER) == 0)
+ max_free = (ltree != NULL) ? ltree->max_free :
+ root->start - llist->end;
+ while ((llist->eflags & MAP_ENTRY_HEADER) == 0) {
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;
}
- while (rlist != NULL) {
+ if ((rlist->eflags & MAP_ENTRY_HEADER) == 0)
+ max_free = (rtree != NULL) ? rtree->max_free :
+ rlist->start - root->end;
+ while ((rlist->eflags & MAP_ENTRY_HEADER) == 0) {
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;
}
@@ -1059,14 +1092,15 @@
* Returns: the new root.
*/
static vm_map_entry_t
-vm_map_entry_splay(vm_offset_t addr, vm_map_entry_t root)
+vm_map_entry_splay(vm_offset_t addr, vm_map_t map)
{
- vm_map_entry_t llist, rlist;
+ vm_map_entry_t llist, rlist, root;
- root = vm_map_splay_split(addr, 0, root, &llist, &rlist);
+ llist = rlist = &map->header;
+ root = vm_map_splay_split(addr, 0, map->root, &llist, &rlist);
if (root != NULL) {
/* do nothing */
- } else if (llist != NULL) {
+ } else if ((llist->eflags & MAP_ENTRY_HEADER) == 0) {
/*
* Recover the greatest node in the left
* subtree and make it the root.
@@ -1074,7 +1108,7 @@
root = llist;
llist = root->right;
root->right = NULL;
- } else if (rlist != NULL) {
+ } else if ((rlist->eflags & MAP_ENTRY_HEADER) == 0) {
/*
* Recover the least node in the right
* subtree and make it the root.
@@ -1106,13 +1140,13 @@
map->nentries, entry);
VM_MAP_ASSERT_LOCKED(map);
map->nentries++;
- root = map->root;
- root = vm_map_splay_split(entry->start, 0, root, &llist, &rlist);
+ llist = rlist = &map->header;
+ root = vm_map_splay_split(entry->start, 0, map->root, &llist, &rlist);
KASSERT(root == NULL,
("vm_map_entry_link: link object already mapped"));
- entry->prev = (llist == NULL) ? &map->header : llist;
- entry->next = (rlist == NULL) ? &map->header : rlist;
- entry->prev->next = entry->next->prev = entry;
+ entry->prev = llist;
+ entry->next = rlist;
+ llist->next = rlist->prev = entry;
root = vm_map_splay_merge(entry, llist, rlist, NULL, NULL);
map->root = entry;
VM_MAP_ASSERT_CONSISTENT(map);
@@ -1132,12 +1166,8 @@
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);
+ llist = rlist = &map->header;
+ root = vm_map_splay_split(entry->start, 0, map->root, &llist, &rlist);
KASSERT(root != NULL,
("vm_map_entry_unlink: unlink object not mapped"));
@@ -1162,11 +1192,11 @@
case UNLINK_MERGE_NONE:
vm_map_splay_findprev(root, &llist);
vm_map_splay_findnext(root, &rlist);
- if (llist != NULL) {
+ if ((llist->eflags & MAP_ENTRY_HEADER) == 0) {
root = llist;
llist = root->right;
root->right = NULL;
- } else if (rlist != NULL) {
+ } else if ((rlist->eflags & MAP_ENTRY_HEADER) == 0) {
root = rlist;
rlist = root->left;
root->left = NULL;
@@ -1174,6 +1204,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);
@@ -1200,8 +1233,8 @@
vm_map_entry_t llist, rlist, root;
VM_MAP_ASSERT_LOCKED(map);
- root = map->root;
- root = vm_map_splay_split(entry->start, 0, root, &llist, &rlist);
+ llist = rlist = &map->header;
+ root = vm_map_splay_split(entry->start, 0, map->root, &llist, &rlist);
KASSERT(root != NULL,
("vm_map_entry_resize_free: resize_free object not mapped"));
vm_map_splay_findnext(root, &rlist);
@@ -1253,7 +1286,8 @@
* change the map. Thus, the map's timestamp need not change
* on a temporary upgrade.
*/
- map->root = cur = vm_map_entry_splay(address, cur);
+ VM_MAP_ASSERT_CONSISTENT(map);
+ map->root = cur = vm_map_entry_splay(address, map);
VM_MAP_ASSERT_CONSISTENT(map);
if (!locked)
sx_downgrade(&map->lock);
@@ -1538,11 +1572,11 @@
* After splay, if start comes before root node, then there
* must be a gap from start to the root.
*/
- root = vm_map_splay_split(start, length, map->root,
- &llist, &rlist);
+ llist = rlist = &map->header;
+ root = vm_map_splay_split(start, length, map->root, &llist, &rlist);
if (root != NULL)
start = root->end;
- else if (rlist != NULL) {
+ else if ((rlist->eflags & MAP_ENTRY_HEADER) == 0) {
root = rlist;
rlist = root->left;
root->left = NULL;

File Metadata

Mime Type
text/plain
Expires
Fri, Nov 28, 9:26 AM (11 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
26279885
Default Alt Text
D19826.id55937.diff (6 KB)

Event Timeline