Page MenuHomeFreeBSD

D17635.id49413.diff
No OneTemporary

D17635.id49413.diff

Index: sys/vm/vm_map.c
===================================================================
--- sys/vm/vm_map.c
+++ sys/vm/vm_map.c
@@ -1033,27 +1033,40 @@
map->root = entry;
}
+enum unlink_merge_type {UNLINK_MERGE_PREV, UNLINK_MERGE_NONE, UNLINK_MERGE_NEXT};
+
static void
vm_map_entry_unlink(vm_map_t map,
- vm_map_entry_t entry)
+ vm_map_entry_t entry,
+ unlink_merge_type op)
{
vm_map_entry_t next, prev, root;
VM_MAP_ASSERT_LOCKED(map);
+ prev = entry->prev;
+ next = entry->next;
if (entry != map->root)
vm_map_entry_splay(entry->start, map->root);
- if (entry->left == NULL)
+ if (prev == &map->header)
root = entry->right;
else {
- root = vm_map_entry_splay(entry->start, entry->left);
+ root = vm_map_entry_splay(prev->start, entry->left);
root->right = entry->right;
- root->adj_free = entry->next->start - root->end;
+ switch (op) {
+ case UNLINK_MERGE_PREV:
+ prev->end = entry->end;
+ break;
+ case UNLINK_MERGE_NONE:
+ break;
+ case UNLINK_MERGE_NEXT:
+ next->start = entry->start;
+ next->offset = entry->offset;
+ break;
+ }
+ prev->adj_free = next->start - prev->end;
vm_map_entry_set_max_free(root);
}
map->root = root;
-
- prev = entry->prev;
- next = entry->next;
next->prev = prev;
prev->next = next;
map->nentries--;
@@ -1644,7 +1657,7 @@
}
static bool
-vm_map_mergeable_neighbors(vm_map_entry_t prev, vm_map_entry_t entry)
+vm_map_entries_mergeable(vm_map_entry_t prev, vm_map_entry_t entry)
{
vm_size_t prevsize;
@@ -1662,9 +1675,11 @@
}
static void
-vm_map_merged_neighbor_dispose(vm_map_t map, vm_map_entry_t entry)
+vm_map_entry_merge(vm_map_t map, vm_map_entry_t entry, unlink_merge_type op)
{
+ vm_map_entry_unlink(map, next, op);
+
/*
* If the backing object is a vnode object,
* vm_object_deallocate() calls vrele().
@@ -1709,22 +1724,14 @@
prev = entry->prev;
if (prev != &map->header &&
- vm_map_mergeable_neighbors(prev, entry)) {
- vm_map_entry_unlink(map, prev);
- entry->start = prev->start;
- entry->offset = prev->offset;
- if (entry->prev != &map->header)
- vm_map_entry_resize_free(map, entry->prev);
- vm_map_merged_neighbor_dispose(map, prev);
+ vm_map_entries_mergeable(prev, entry)) {
+ vm_map_entry_merge(map, prev, UNLINK_MERGE_NEXT);
}
next = entry->next;
if (next != &map->header &&
- vm_map_mergeable_neighbors(entry, next)) {
- vm_map_entry_unlink(map, next);
- entry->end = next->end;
- vm_map_entry_resize_free(map, entry);
- vm_map_merged_neighbor_dispose(map, next);
+ vm_map_entries_mergeable(entry, next)) {
+ vm_map_entry_merge(map, next, UNLINK_MERGE_PREV);
}
}
/*
@@ -3007,7 +3014,7 @@
vm_pindex_t offidxstart, offidxend, count, size1;
vm_size_t size;
- vm_map_entry_unlink(map, entry);
+ vm_map_entry_unlink(map, entry, UNLINK_MERGE_NONE);
object = entry->object.vm_object;
if ((entry->eflags & MAP_ENTRY_GUARD) != 0) {

File Metadata

Mime Type
text/plain
Expires
Sat, Jan 17, 4:35 PM (19 h, 8 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27696975
Default Alt Text
D17635.id49413.diff (2 KB)

Event Timeline