Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_map.c
Show First 20 Lines • Show All 790 Lines • ▼ Show 20 Lines | |||||
* Initialize an existing vm_map structure | * Initialize an existing vm_map structure | ||||
* such as that in the vmspace structure. | * such as that in the vmspace structure. | ||||
*/ | */ | ||||
static void | static void | ||||
_vm_map_init(vm_map_t map, pmap_t pmap, vm_offset_t min, vm_offset_t max) | _vm_map_init(vm_map_t map, pmap_t pmap, vm_offset_t min, vm_offset_t max) | ||||
{ | { | ||||
map->header.next = map->header.prev = &map->header; | map->header.next = map->header.prev = &map->header; | ||||
map->header.eflags = MAP_ENTRY_HEADER; | |||||
map->needs_wakeup = FALSE; | map->needs_wakeup = FALSE; | ||||
map->system_map = 0; | map->system_map = 0; | ||||
map->pmap = pmap; | map->pmap = pmap; | ||||
map->header.end = min; | map->header.end = min; | ||||
map->header.start = max; | map->header.start = max; | ||||
map->flags = 0; | map->flags = 0; | ||||
map->root = NULL; | map->root = NULL; | ||||
map->timestamp = 0; | map->timestamp = 0; | ||||
▲ Show 20 Lines • Show All 465 Lines • ▼ Show 20 Lines | if (object != NULL) { | ||||
* of the object's pages. (Object granularity | * of the object's pages. (Object granularity | ||||
* reference counting is insufficient to recognize | * reference counting is insufficient to recognize | ||||
* aliases with precision.) | * aliases with precision.) | ||||
*/ | */ | ||||
VM_OBJECT_WLOCK(object); | VM_OBJECT_WLOCK(object); | ||||
if (object->ref_count > 1 || object->shadow_count != 0) | if (object->ref_count > 1 || object->shadow_count != 0) | ||||
vm_object_clear_flag(object, OBJ_ONEMAPPING); | vm_object_clear_flag(object, OBJ_ONEMAPPING); | ||||
VM_OBJECT_WUNLOCK(object); | VM_OBJECT_WUNLOCK(object); | ||||
} else if (prev_entry != &map->header && | } else if ((prev_entry->eflags & ~MAP_ENTRY_USER_WIRED) == | ||||
(prev_entry->eflags & ~MAP_ENTRY_USER_WIRED) == protoeflags && | protoeflags && | ||||
(cow & (MAP_STACK_GROWS_DOWN | MAP_STACK_GROWS_UP)) == 0 && | (cow & (MAP_STACK_GROWS_DOWN | MAP_STACK_GROWS_UP)) == 0 && | ||||
prev_entry->end == start && (prev_entry->cred == cred || | prev_entry->end == start && (prev_entry->cred == cred || | ||||
(prev_entry->object.vm_object != NULL && | (prev_entry->object.vm_object != NULL && | ||||
prev_entry->object.vm_object->cred == cred)) && | prev_entry->object.vm_object->cred == cred)) && | ||||
vm_object_coalesce(prev_entry->object.vm_object, | vm_object_coalesce(prev_entry->object.vm_object, | ||||
prev_entry->offset, | prev_entry->offset, | ||||
(vm_size_t)(prev_entry->end - prev_entry->start), | (vm_size_t)(prev_entry->end - prev_entry->start), | ||||
(vm_size_t)(end - prev_entry->end), cred != NULL && | (vm_size_t)(end - prev_entry->end), cred != NULL && | ||||
▲ Show 20 Lines • Show All 413 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
vm_map_entry_t next, prev; | vm_map_entry_t next, prev; | ||||
if ((entry->eflags & (MAP_ENTRY_GROWS_DOWN | MAP_ENTRY_GROWS_UP | | if ((entry->eflags & (MAP_ENTRY_GROWS_DOWN | MAP_ENTRY_GROWS_UP | | ||||
MAP_ENTRY_IN_TRANSITION | MAP_ENTRY_IS_SUB_MAP)) != 0) | MAP_ENTRY_IN_TRANSITION | MAP_ENTRY_IS_SUB_MAP)) != 0) | ||||
return; | return; | ||||
prev = entry->prev; | prev = entry->prev; | ||||
if (prev != &map->header && | if (vm_map_mergeable_neighbors(prev, entry)) { | ||||
vm_map_mergeable_neighbors(prev, entry)) { | |||||
vm_map_entry_unlink(map, prev); | vm_map_entry_unlink(map, prev); | ||||
entry->start = prev->start; | entry->start = prev->start; | ||||
entry->offset = prev->offset; | entry->offset = prev->offset; | ||||
if (entry->prev != &map->header) | if (entry->prev != &map->header) | ||||
vm_map_entry_resize_free(map, entry->prev); | vm_map_entry_resize_free(map, entry->prev); | ||||
vm_map_merged_neighbor_dispose(map, prev); | vm_map_merged_neighbor_dispose(map, prev); | ||||
} | } | ||||
next = entry->next; | next = entry->next; | ||||
if (next != &map->header && | if (vm_map_mergeable_neighbors(entry, next)) { | ||||
vm_map_mergeable_neighbors(entry, next)) { | |||||
vm_map_entry_unlink(map, next); | vm_map_entry_unlink(map, next); | ||||
entry->end = next->end; | entry->end = next->end; | ||||
vm_map_entry_resize_free(map, entry); | vm_map_entry_resize_free(map, entry); | ||||
vm_map_merged_neighbor_dispose(map, next); | vm_map_merged_neighbor_dispose(map, next); | ||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* vm_map_clip_start: [ internal use only ] | * vm_map_clip_start: [ internal use only ] | ||||
▲ Show 20 Lines • Show All 2,710 Lines • Show Last 20 Lines |