aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vm/vm_map.c12
-rw-r--r--vm/vm_object.c22
2 files changed, 23 insertions, 11 deletions
diff --git a/vm/vm_map.c b/vm/vm_map.c
index 23c4c296..f701a4cf 100644
--- a/vm/vm_map.c
+++ b/vm/vm_map.c
@@ -1048,8 +1048,7 @@ kern_return_t vm_map_enter(
* extend from below.]
*/
- if ((object == VM_OBJECT_NULL) &&
- (entry != vm_map_to_entry(map)) &&
+ if ((entry != vm_map_to_entry(map)) &&
(entry->vme_end == start) &&
(!entry->is_shared) &&
(!entry->is_sub_map) &&
@@ -1059,20 +1058,21 @@ kern_return_t vm_map_enter(
(entry->wired_count == 0) &&
(entry->projected_on == 0)) {
if (vm_object_coalesce(entry->object.vm_object,
- VM_OBJECT_NULL,
+ object,
entry->offset,
- (vm_offset_t) 0,
+ offset,
(vm_size_t)(entry->vme_end - entry->vme_start),
- (vm_size_t)(end - entry->vme_end))) {
+ size)) {
/*
* Coalesced the two objects - can extend
* the previous map entry to include the
* new range.
*/
- map->size += (end - entry->vme_end);
+ map->size += size;
entry->vme_end = end;
vm_map_gap_update(&map->hdr, entry);
+ vm_object_deallocate(object);
RETURN(KERN_SUCCESS);
}
}
diff --git a/vm/vm_object.c b/vm/vm_object.c
index b5be3f81..b00e90d2 100644
--- a/vm/vm_object.c
+++ b/vm/vm_object.c
@@ -2693,7 +2693,8 @@ void vm_object_page_remove(
* returns TRUE if objects were combined.
*
* NOTE: Only works at the moment if the second object is NULL -
- * if it's not, which object do we lock first?
+ * or if the objects are the same - otherwise, which
+ * object do we lock first?
*
* Parameters:
* prev_object First object to coalesce
@@ -2718,12 +2719,23 @@ boolean_t vm_object_coalesce(
{
vm_size_t newsize;
- if (next_object != VM_OBJECT_NULL) {
- return FALSE;
+ if (prev_object == next_object) {
+ /*
+ * If neither object actually exists,
+ * the offsets don't matter.
+ */
+ if (prev_object == VM_OBJECT_NULL)
+ return TRUE;
+
+ return prev_offset + prev_size == next_offset;
}
- if (prev_object == VM_OBJECT_NULL) {
- return TRUE;
+ if (next_object != VM_OBJECT_NULL) {
+ /*
+ * Don't know how to merge two different
+ * objects yet.
+ */
+ return FALSE;
}
vm_object_lock(prev_object);