Page MenuHomeFreeBSD

D17635.id49419.diff
No OneTemporary

D17635.id49419.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,15 +1657,13 @@
}
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;
- prevsize = prev->end - prev->start;
return (prev->end == entry->start &&
prev->object.vm_object == entry->object.vm_object &&
(prev->object.vm_object == NULL ||
- prev->offset + prevsize == entry->offset) &&
+ prev->offset + prev->end - prev->start == entry->offset) &&
prev->eflags == entry->eflags &&
prev->protection == entry->protection &&
prev->max_protection == entry->max_protection &&
@@ -1662,22 +1673,20 @@
}
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, entry, op);
+
/*
- * If the backing object is a vnode object,
- * vm_object_deallocate() calls vrele().
- * However, vrele() does not lock the vnode
- * because the vnode has additional
- * references. Thus, the map lock can be kept
- * without causing a lock-order reversal with
- * the vnode lock.
+ * If the backing object is a vnode object, vm_object_deallocate() calls
+ * vrele(). However, vrele() does not lock the vnode because the vnode
+ * has additional references. Thus, the map lock can be kept without
+ * causing a lock-order reversal with the vnode lock.
*
- * Since we count the number of virtual page
- * mappings in object->un_pager.vnp.writemappings,
- * the writemappings value should not be adjusted
- * when the entry is disposed of.
+ * Since we count the number of virtual page mappings in
+ * object->un_pager.vnp.writemappings, the writemappings value should
+ * not be adjusted when the entry is disposed of.
*/
if (entry->object.vm_object != NULL)
vm_object_deallocate(entry->object.vm_object);
@@ -1709,22 +1718,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);
}
}
/*
@@ -3001,13 +3002,14 @@
* Deallocate the given entry from the target map.
*/
static void
-vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry)
+vm_map_entry_delete(vm_map_t map, vm_map_entry_t entry,
+ unlink_merge_type op)
{
vm_object_t object;
vm_pindex_t offidxstart, offidxend, count, size1;
vm_size_t size;
- vm_map_entry_unlink(map, entry);
+ vm_map_entry_unlink(map, entry, op);
object = entry->object.vm_object;
if ((entry->eflags & MAP_ENTRY_GUARD) != 0) {
@@ -3169,7 +3171,7 @@
* page frames may be reallocated, and any modify bits
* will be set in the wrong object!)
*/
- vm_map_entry_delete(map, entry);
+ vm_map_entry_delete(map, entry, UNLINK_MERGE_NONE);
entry = next;
}
return (KERN_SUCCESS);
@@ -3880,7 +3882,7 @@
if (gap_entry->start + grow_amount == gap_entry->end) {
gap_start = gap_entry->start;
gap_end = gap_entry->end;
- vm_map_entry_delete(map, gap_entry);
+ vm_map_entry_delete(map, gap_entry, UNLINK_MERGE_NONE);
gap_deleted = true;
} else {
MPASS(gap_entry->start < gap_entry->end - grow_amount);
@@ -3917,12 +3919,13 @@
(vm_size_t)(stack_entry->end - stack_entry->start),
(vm_size_t)grow_amount, cred != NULL)) {
if (gap_entry->start + grow_amount == gap_entry->end)
- vm_map_entry_delete(map, gap_entry);
- else
+ vm_map_entry_delete(map, gap_entry, UNLINK_MERGE_PREV);
+ else {
gap_entry->start += grow_amount;
- stack_entry->end += grow_amount;
+ stack_entry->end += grow_amount;
+ vm_map_entry_resize_free(map, stack_entry);
+ }
map->size += grow_amount;
- vm_map_entry_resize_free(map, stack_entry);
rv = KERN_SUCCESS;
} else
rv = KERN_FAILURE;

File Metadata

Mime Type
text/plain
Expires
Fri, Jan 16, 10:15 AM (7 h, 54 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
27659969
Default Alt Text
D17635.id49419.diff (5 KB)

Event Timeline