[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[RFC PATCH 4/7] vm: Allow coalescing entries forward
From: |
Sergey Bugaev |
Subject: |
[RFC PATCH 4/7] vm: Allow coalescing entries forward |
Date: |
Mon, 26 Jun 2023 14:26:53 +0300 |
When entering an object into a map, try to extend the next entry
backward, in addition to the previously existing attempt to extend the
previous entry forward.
---
vm/vm_map.c | 39 +++++++++++++++++++++++++++++++++++----
1 file changed, 35 insertions(+), 4 deletions(-)
diff --git a/vm/vm_map.c b/vm/vm_map.c
index a41e6434..0d3b11f2 100644
--- a/vm/vm_map.c
+++ b/vm/vm_map.c
@@ -992,6 +992,7 @@ kern_return_t vm_map_enter(
vm_inherit_t inheritance)
{
vm_map_entry_t entry;
+ vm_map_entry_t next_entry;
vm_offset_t start;
vm_offset_t end;
kern_return_t result = KERN_SUCCESS;
@@ -1012,6 +1013,7 @@ kern_return_t vm_map_enter(
end = start + size;
*address = start;
+ next_entry = entry->vme_next;
} else {
vm_map_entry_t temp_entry;
@@ -1046,14 +1048,15 @@ kern_return_t vm_map_enter(
RETURN(KERN_NO_SPACE);
entry = temp_entry;
+ next_entry = entry->vme_next;
/*
* ... the next region doesn't overlap the
* end point.
*/
- if ((entry->vme_next != vm_map_to_entry(map)) &&
- (entry->vme_next->vme_start < end))
+ if ((next_entry != vm_map_to_entry(map)) &&
+ (next_entry->vme_start < end))
RETURN(KERN_NO_SPACE);
}
@@ -1069,8 +1072,7 @@ kern_return_t vm_map_enter(
/*
* See whether we can avoid creating a new entry (and object) by
- * extending one of our neighbors. [So far, we only attempt to
- * extend from below.]
+ * extending one of our neighbors.
*/
if ((entry != vm_map_to_entry(map)) &&
@@ -1101,6 +1103,35 @@ kern_return_t vm_map_enter(
RETURN(KERN_SUCCESS);
}
}
+ if ((next_entry != vm_map_to_entry(map)) &&
+ (next_entry->vme_start == end) &&
+ (!next_entry->is_shared) &&
+ (!next_entry->is_sub_map) &&
+ (next_entry->inheritance == inheritance) &&
+ (next_entry->protection == cur_protection) &&
+ (next_entry->max_protection == max_protection) &&
+ (next_entry->wired_count == 0) &&
+ (next_entry->projected_on == 0)) {
+ if (vm_object_coalesce(object,
+ next_entry->object.vm_object,
+ offset,
+ next_entry->offset,
+ size,
+ (vm_size_t)(next_entry->vme_end -
next_entry->vme_start))) {
+
+ /*
+ * Coalesced the two objects - can extend
+ * the next map entry to include the
+ * new range.
+ */
+ map->size += size;
+ next_entry->vme_start = start;
+ next_entry->offset -= size;
+ vm_map_gap_update(&map->hdr, entry);
+ vm_object_deallocate(object);
+ RETURN(KERN_SUCCESS);
+ }
+ }
/*
* Create a new entry
--
2.41.0
- [RFC PATCH 0/7] Forward merging entries and other VM shenanigans, Sergey Bugaev, 2023/06/26
- [RFC PATCH 2/7] vm: Allow coalescing a VM object with itself, Sergey Bugaev, 2023/06/26
- [RFC PATCH 1/7] Shrink struct vm_page size, Sergey Bugaev, 2023/06/26
- [RFC PATCH 4/7] vm: Allow coalescing entries forward,
Sergey Bugaev <=
- [RFC PATCH 3/7] vm: Allow coalescing null object with an internal object, Sergey Bugaev, 2023/06/26
- [RFC PATCH 7/7] vm: Coalesce map entries, Sergey Bugaev, 2023/06/26
- [RFC PATCH 6/7] vm: Add vm_map_coalesce_entry, Sergey Bugaev, 2023/06/26
- [RFC PATCH 5/7] vm: Eagerly release deallocated pages, Sergey Bugaev, 2023/06/26