Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_map.c
Show First 20 Lines • Show All 2,279 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
vm_map_entry_t entry; | vm_map_entry_t entry; | ||||
vm_map_entry_t temp_entry; | vm_map_entry_t temp_entry; | ||||
switch (new_inheritance) { | switch (new_inheritance) { | ||||
case VM_INHERIT_NONE: | case VM_INHERIT_NONE: | ||||
case VM_INHERIT_COPY: | case VM_INHERIT_COPY: | ||||
case VM_INHERIT_SHARE: | case VM_INHERIT_SHARE: | ||||
case VM_INHERIT_ZERO: | |||||
break; | break; | ||||
default: | default: | ||||
return (KERN_INVALID_ARGUMENT); | return (KERN_INVALID_ARGUMENT); | ||||
} | } | ||||
if (start == end) | if (start == end) | ||||
return (KERN_SUCCESS); | return (KERN_SUCCESS); | ||||
vm_map_lock(map); | vm_map_lock(map); | ||||
VM_MAP_RANGE_CHECK(map, start, end); | VM_MAP_RANGE_CHECK(map, start, end); | ||||
▲ Show 20 Lines • Show All 1,141 Lines • ▼ Show 20 Lines | case VM_INHERIT_COPY: | ||||
new_entry->wired_count = 0; | new_entry->wired_count = 0; | ||||
new_entry->object.vm_object = NULL; | new_entry->object.vm_object = NULL; | ||||
new_entry->cred = NULL; | new_entry->cred = NULL; | ||||
vm_map_entry_link(new_map, new_map->header.prev, | vm_map_entry_link(new_map, new_map->header.prev, | ||||
new_entry); | new_entry); | ||||
vmspace_map_entry_forked(vm1, vm2, new_entry); | vmspace_map_entry_forked(vm1, vm2, new_entry); | ||||
vm_map_copy_entry(old_map, new_map, old_entry, | vm_map_copy_entry(old_map, new_map, old_entry, | ||||
new_entry, fork_charge); | new_entry, fork_charge); | ||||
break; | |||||
case VM_INHERIT_ZERO: | |||||
/* | |||||
* Create a new anonymous mapping entry modelled from | |||||
* the old one. | |||||
*/ | |||||
new_entry = vm_map_entry_create(new_map); | |||||
memset(new_entry, 0, sizeof(*new_entry)); | |||||
new_entry->start = old_entry->start; | |||||
new_entry->end = old_entry->end; | |||||
new_entry->avail_ssize = old_entry->avail_ssize; | |||||
new_entry->adj_free = old_entry->adj_free; | |||||
new_entry->max_free = old_entry->max_free; | |||||
new_entry->eflags = old_entry->eflags & | |||||
~(MAP_ENTRY_USER_WIRED | MAP_ENTRY_IN_TRANSITION | | |||||
MAP_ENTRY_VN_WRITECNT); | |||||
new_entry->protection = old_entry->protection; | |||||
new_entry->max_protection = old_entry->max_protection; | |||||
new_entry->inheritance = VM_INHERIT_ZERO; | |||||
vm_map_entry_link(new_map, new_map->header.prev, | |||||
new_entry); | |||||
vmspace_map_entry_forked(vm1, vm2, new_entry); | |||||
new_entry->cred = curthread->td_ucred; | |||||
crhold(new_entry->cred); | |||||
*fork_charge += (new_entry->end - new_entry->start); | |||||
break; | break; | ||||
} | } | ||||
old_entry = old_entry->next; | old_entry = old_entry->next; | ||||
} | } | ||||
/* | /* | ||||
* Use inlined vm_map_unlock() to postpone handling the deferred | * Use inlined vm_map_unlock() to postpone handling the deferred | ||||
* map entries, which cannot be done until both old_map and | * map entries, which cannot be done until both old_map and | ||||
* new_map locks are released. | * new_map locks are released. | ||||
▲ Show 20 Lines • Show All 874 Lines • Show Last 20 Lines |