Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_mmap.c
Show First 20 Lines • Show All 1,116 Lines • ▼ Show 20 Lines | vm_mlock(struct proc *proc, struct ucred *cred, const void *addr0, size_t len) | ||||
if (nsize > lim_cur(proc, RLIMIT_MEMLOCK)) { | if (nsize > lim_cur(proc, RLIMIT_MEMLOCK)) { | ||||
PROC_UNLOCK(proc); | PROC_UNLOCK(proc); | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | } | ||||
PROC_UNLOCK(proc); | PROC_UNLOCK(proc); | ||||
if (npages + vm_cnt.v_wire_count > vm_page_max_wired) | if (npages + vm_cnt.v_wire_count > vm_page_max_wired) | ||||
return (EAGAIN); | return (EAGAIN); | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(proc); | PROC_LOCK(proc); | ||||
error = racct_set(proc, RACCT_MEMLOCK, nsize); | error = racct_set(proc, RACCT_MEMLOCK, nsize); | ||||
PROC_UNLOCK(proc); | PROC_UNLOCK(proc); | ||||
if (error != 0) | if (error != 0) | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | |||||
#endif | #endif | ||||
error = vm_map_wire(map, start, end, | error = vm_map_wire(map, start, end, | ||||
VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES); | VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES); | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (error != KERN_SUCCESS) { | if (racct_enable && error != KERN_SUCCESS) { | ||||
PROC_LOCK(proc); | PROC_LOCK(proc); | ||||
racct_set(proc, RACCT_MEMLOCK, | racct_set(proc, RACCT_MEMLOCK, | ||||
ptoa(pmap_wired_count(map->pmap))); | ptoa(pmap_wired_count(map->pmap))); | ||||
PROC_UNLOCK(proc); | PROC_UNLOCK(proc); | ||||
} | } | ||||
#endif | #endif | ||||
return (error == KERN_SUCCESS ? 0 : ENOMEM); | return (error == KERN_SUCCESS ? 0 : ENOMEM); | ||||
} | } | ||||
Show All 31 Lines | if (!old_mlock && uap->how & MCL_CURRENT) { | ||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
if (map->size > lim_cur(td->td_proc, RLIMIT_MEMLOCK)) { | if (map->size > lim_cur(td->td_proc, RLIMIT_MEMLOCK)) { | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | } | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
} | } | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (racct_enable) { | |||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
error = racct_set(td->td_proc, RACCT_MEMLOCK, map->size); | error = racct_set(td->td_proc, RACCT_MEMLOCK, map->size); | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
if (error != 0) | if (error != 0) | ||||
return (ENOMEM); | return (ENOMEM); | ||||
} | |||||
#endif | #endif | ||||
if (uap->how & MCL_FUTURE) { | if (uap->how & MCL_FUTURE) { | ||||
vm_map_lock(map); | vm_map_lock(map); | ||||
vm_map_modflags(map, MAP_WIREFUTURE, 0); | vm_map_modflags(map, MAP_WIREFUTURE, 0); | ||||
vm_map_unlock(map); | vm_map_unlock(map); | ||||
error = 0; | error = 0; | ||||
} | } | ||||
if (uap->how & MCL_CURRENT) { | if (uap->how & MCL_CURRENT) { | ||||
/* | /* | ||||
* P1003.1-2001 mandates that all currently mapped pages | * P1003.1-2001 mandates that all currently mapped pages | ||||
* will be memory resident and locked (wired) upon return | * will be memory resident and locked (wired) upon return | ||||
* from mlockall(). vm_map_wire() will wire pages, by | * from mlockall(). vm_map_wire() will wire pages, by | ||||
* calling vm_fault_wire() for each page in the region. | * calling vm_fault_wire() for each page in the region. | ||||
*/ | */ | ||||
error = vm_map_wire(map, vm_map_min(map), vm_map_max(map), | error = vm_map_wire(map, vm_map_min(map), vm_map_max(map), | ||||
VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK); | VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK); | ||||
error = (error == KERN_SUCCESS ? 0 : EAGAIN); | error = (error == KERN_SUCCESS ? 0 : EAGAIN); | ||||
} | } | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (error != KERN_SUCCESS) { | if (racct_enable && error != KERN_SUCCESS) { | ||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
racct_set(td->td_proc, RACCT_MEMLOCK, | racct_set(td->td_proc, RACCT_MEMLOCK, | ||||
ptoa(pmap_wired_count(map->pmap))); | ptoa(pmap_wired_count(map->pmap))); | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
} | } | ||||
#endif | #endif | ||||
return (error); | return (error); | ||||
Show All 25 Lines | sys_munlockall(td, uap) | ||||
vm_map_lock(map); | vm_map_lock(map); | ||||
vm_map_modflags(map, 0, MAP_WIREFUTURE); | vm_map_modflags(map, 0, MAP_WIREFUTURE); | ||||
vm_map_unlock(map); | vm_map_unlock(map); | ||||
/* Forcibly unwire all pages. */ | /* Forcibly unwire all pages. */ | ||||
error = vm_map_unwire(map, vm_map_min(map), vm_map_max(map), | error = vm_map_unwire(map, vm_map_min(map), vm_map_max(map), | ||||
VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK); | VM_MAP_WIRE_USER|VM_MAP_WIRE_HOLESOK); | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (error == KERN_SUCCESS) { | if (racct_enable && error == KERN_SUCCESS) { | ||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
racct_set(td->td_proc, RACCT_MEMLOCK, 0); | racct_set(td->td_proc, RACCT_MEMLOCK, 0); | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
} | } | ||||
#endif | #endif | ||||
return (error); | return (error); | ||||
} | } | ||||
Show All 27 Lines | #endif | ||||
last = addr + size; | last = addr + size; | ||||
start = trunc_page(addr); | start = trunc_page(addr); | ||||
end = round_page(last); | end = round_page(last); | ||||
if (last < addr || end < addr) | if (last < addr || end < addr) | ||||
return (EINVAL); | return (EINVAL); | ||||
error = vm_map_unwire(&td->td_proc->p_vmspace->vm_map, start, end, | error = vm_map_unwire(&td->td_proc->p_vmspace->vm_map, start, end, | ||||
VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES); | VM_MAP_WIRE_USER | VM_MAP_WIRE_NOHOLES); | ||||
#ifdef RACCT | #ifdef RACCT | ||||
if (error == KERN_SUCCESS) { | if (racct_enable && error == KERN_SUCCESS) { | ||||
PROC_LOCK(td->td_proc); | PROC_LOCK(td->td_proc); | ||||
map = &td->td_proc->p_vmspace->vm_map; | map = &td->td_proc->p_vmspace->vm_map; | ||||
racct_set(td->td_proc, RACCT_MEMLOCK, | racct_set(td->td_proc, RACCT_MEMLOCK, | ||||
ptoa(pmap_wired_count(map->pmap))); | ptoa(pmap_wired_count(map->pmap))); | ||||
PROC_UNLOCK(td->td_proc); | PROC_UNLOCK(td->td_proc); | ||||
} | } | ||||
#endif | #endif | ||||
return (error == KERN_SUCCESS ? 0 : ENOMEM); | return (error == KERN_SUCCESS ? 0 : ENOMEM); | ||||
▲ Show 20 Lines • Show All 426 Lines • Show Last 20 Lines |