Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_map.c
Show First 20 Lines • Show All 294 Lines • ▼ Show 20 Lines | vmspace_alloc(vm_offset_t min, vm_offset_t max, pmap_pinit_t pinit) | ||||
vm->vm_dsize = 0; | vm->vm_dsize = 0; | ||||
vm->vm_ssize = 0; | vm->vm_ssize = 0; | ||||
vm->vm_taddr = 0; | vm->vm_taddr = 0; | ||||
vm->vm_daddr = 0; | vm->vm_daddr = 0; | ||||
vm->vm_maxsaddr = 0; | vm->vm_maxsaddr = 0; | ||||
return (vm); | return (vm); | ||||
} | } | ||||
#ifdef RACCT | |||||
static void | static void | ||||
vmspace_container_reset(struct proc *p) | vmspace_container_reset(struct proc *p) | ||||
{ | { | ||||
#ifdef RACCT | |||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
racct_set(p, RACCT_DATA, 0); | racct_set(p, RACCT_DATA, 0); | ||||
racct_set(p, RACCT_STACK, 0); | racct_set(p, RACCT_STACK, 0); | ||||
racct_set(p, RACCT_RSS, 0); | racct_set(p, RACCT_RSS, 0); | ||||
racct_set(p, RACCT_MEMLOCK, 0); | racct_set(p, RACCT_MEMLOCK, 0); | ||||
racct_set(p, RACCT_VMEM, 0); | racct_set(p, RACCT_VMEM, 0); | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
#endif | |||||
} | } | ||||
#endif | |||||
static inline void | static inline void | ||||
vmspace_dofree(struct vmspace *vm) | vmspace_dofree(struct vmspace *vm) | ||||
{ | { | ||||
CTR1(KTR_VM, "vmspace_free: %p", vm); | CTR1(KTR_VM, "vmspace_free: %p", vm); | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 85 Lines • ▼ Show 20 Lines | if (refcnt == 1) { | ||||
pmap_remove_pages(vmspace_pmap(vm)); | pmap_remove_pages(vmspace_pmap(vm)); | ||||
/* Switch now since this proc will free vmspace */ | /* Switch now since this proc will free vmspace */ | ||||
PROC_VMSPACE_LOCK(p); | PROC_VMSPACE_LOCK(p); | ||||
p->p_vmspace = &vmspace0; | p->p_vmspace = &vmspace0; | ||||
PROC_VMSPACE_UNLOCK(p); | PROC_VMSPACE_UNLOCK(p); | ||||
pmap_activate(td); | pmap_activate(td); | ||||
vmspace_dofree(vm); | vmspace_dofree(vm); | ||||
} | } | ||||
#ifdef RACCT | |||||
if (racct_enable) | |||||
vmspace_container_reset(p); | vmspace_container_reset(p); | ||||
#endif | |||||
} | } | ||||
/* Acquire reference to vmspace owned by another process. */ | /* Acquire reference to vmspace owned by another process. */ | ||||
struct vmspace * | struct vmspace * | ||||
vmspace_acquire_ref(struct proc *p) | vmspace_acquire_ref(struct proc *p) | ||||
{ | { | ||||
struct vmspace *vm; | struct vmspace *vm; | ||||
▲ Show 20 Lines • Show All 3,220 Lines • ▼ Show 20 Lines | Retry: | ||||
* If this is the main process stack, see if we're over the stack | * If this is the main process stack, see if we're over the stack | ||||
* limit. | * limit. | ||||
*/ | */ | ||||
if (is_procstack && (ctob(vm->vm_ssize) + grow_amount > stacklim)) { | if (is_procstack && (ctob(vm->vm_ssize) + grow_amount > stacklim)) { | ||||
vm_map_unlock_read(map); | vm_map_unlock_read(map); | ||||
return (KERN_NO_SPACE); | return (KERN_NO_SPACE); | ||||
} | } | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
if (is_procstack && | if (is_procstack && racct_set(p, RACCT_STACK, | ||||
racct_set(p, RACCT_STACK, ctob(vm->vm_ssize) + grow_amount)) { | ctob(vm->vm_ssize) + grow_amount)) { | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
vm_map_unlock_read(map); | vm_map_unlock_read(map); | ||||
return (KERN_NO_SPACE); | return (KERN_NO_SPACE); | ||||
} | } | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
} | |||||
#endif | #endif | ||||
/* Round up the grow amount modulo sgrowsiz */ | /* Round up the grow amount modulo sgrowsiz */ | ||||
growsize = sgrowsiz; | growsize = sgrowsiz; | ||||
grow_amount = roundup(grow_amount, growsize); | grow_amount = roundup(grow_amount, growsize); | ||||
if (grow_amount > stack_entry->avail_ssize) | if (grow_amount > stack_entry->avail_ssize) | ||||
grow_amount = stack_entry->avail_ssize; | grow_amount = stack_entry->avail_ssize; | ||||
if (is_procstack && (ctob(vm->vm_ssize) + grow_amount > stacklim)) { | if (is_procstack && (ctob(vm->vm_ssize) + grow_amount > stacklim)) { | ||||
Show All 9 Lines | |||||
#endif | #endif | ||||
if (!old_mlock && map->flags & MAP_WIREFUTURE) { | if (!old_mlock && map->flags & MAP_WIREFUTURE) { | ||||
if (ptoa(pmap_wired_count(map->pmap)) + grow_amount > lmemlim) { | if (ptoa(pmap_wired_count(map->pmap)) + grow_amount > lmemlim) { | ||||
vm_map_unlock_read(map); | vm_map_unlock_read(map); | ||||
rv = KERN_NO_SPACE; | rv = KERN_NO_SPACE; | ||||
goto out; | goto out; | ||||
} | } | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
if (racct_set(p, RACCT_MEMLOCK, | if (racct_set(p, RACCT_MEMLOCK, | ||||
ptoa(pmap_wired_count(map->pmap)) + grow_amount)) { | ptoa(pmap_wired_count(map->pmap)) + grow_amount)) { | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
vm_map_unlock_read(map); | vm_map_unlock_read(map); | ||||
rv = KERN_NO_SPACE; | rv = KERN_NO_SPACE; | ||||
goto out; | goto out; | ||||
} | } | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
} | |||||
#endif | #endif | ||||
} | } | ||||
/* If we would blow our VMEM resource limit, no go */ | /* If we would blow our VMEM resource limit, no go */ | ||||
if (map->size + grow_amount > vmemlim) { | if (map->size + grow_amount > vmemlim) { | ||||
vm_map_unlock_read(map); | vm_map_unlock_read(map); | ||||
rv = KERN_NO_SPACE; | rv = KERN_NO_SPACE; | ||||
goto out; | goto out; | ||||
} | } | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
if (racct_set(p, RACCT_VMEM, map->size + grow_amount)) { | if (racct_set(p, RACCT_VMEM, map->size + grow_amount)) { | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
vm_map_unlock_read(map); | vm_map_unlock_read(map); | ||||
rv = KERN_NO_SPACE; | rv = KERN_NO_SPACE; | ||||
goto out; | goto out; | ||||
} | } | ||||
PROC_UNLOCK(p); | PROC_UNLOCK(p); | ||||
} | |||||
#endif | #endif | ||||
if (vm_map_lock_upgrade(map)) | if (vm_map_lock_upgrade(map)) | ||||
goto Retry; | goto Retry; | ||||
if (stack_entry == next_entry) { | if (stack_entry == next_entry) { | ||||
/* | /* | ||||
* Growing downward. | * Growing downward. | ||||
▲ Show 20 Lines • Show All 82 Lines • ▼ Show 20 Lines | vm_map_wire(map, | ||||
(stack_entry == next_entry) ? stack_entry->start : addr, | (stack_entry == next_entry) ? stack_entry->start : addr, | ||||
(p->p_flag & P_SYSTEM) | (p->p_flag & P_SYSTEM) | ||||
? VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES | ? VM_MAP_WIRE_SYSTEM|VM_MAP_WIRE_NOHOLES | ||||
: VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES); | : VM_MAP_WIRE_USER|VM_MAP_WIRE_NOHOLES); | ||||
} | } | ||||
out: | out: | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (rv != KERN_SUCCESS) { | if (racct_enable && rv != KERN_SUCCESS) { | ||||
PROC_LOCK(p); | PROC_LOCK(p); | ||||
error = racct_set(p, RACCT_VMEM, map->size); | error = racct_set(p, RACCT_VMEM, map->size); | ||||
KASSERT(error == 0, ("decreasing RACCT_VMEM failed")); | KASSERT(error == 0, ("decreasing RACCT_VMEM failed")); | ||||
if (!old_mlock) { | if (!old_mlock) { | ||||
error = racct_set(p, RACCT_MEMLOCK, | error = racct_set(p, RACCT_MEMLOCK, | ||||
ptoa(pmap_wired_count(map->pmap))); | ptoa(pmap_wired_count(map->pmap))); | ||||
KASSERT(error == 0, ("decreasing RACCT_MEMLOCK failed")); | KASSERT(error == 0, ("decreasing RACCT_MEMLOCK failed")); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 461 Lines • Show Last 20 Lines |