Changeset View
Changeset View
Standalone View
Standalone View
head/sys/vm/vm_glue.c
Show First 20 Lines • Show All 175 Lines • ▼ Show 20 Lines | vslock(void *addr, size_t len) | ||||
int error; | int error; | ||||
last = (vm_offset_t)addr + len; | last = (vm_offset_t)addr + len; | ||||
start = trunc_page((vm_offset_t)addr); | start = trunc_page((vm_offset_t)addr); | ||||
end = round_page(last); | end = round_page(last); | ||||
if (last < (vm_offset_t)addr || end < (vm_offset_t)addr) | if (last < (vm_offset_t)addr || end < (vm_offset_t)addr) | ||||
return (EINVAL); | return (EINVAL); | ||||
npages = atop(end - start); | npages = atop(end - start); | ||||
if (npages > vm_page_max_wired) | if (npages > vm_page_max_user_wired) | ||||
return (ENOMEM); | return (ENOMEM); | ||||
#if 0 | |||||
/* | |||||
* XXX - not yet | |||||
* | |||||
* The limit for transient usage of wired pages should be | |||||
* larger than for "permanent" wired pages (mlock()). | |||||
* | |||||
* Also, the sysctl code, which is the only present user | |||||
* of vslock(), does a hard loop on EAGAIN. | |||||
*/ | |||||
if (npages + vm_wire_count() > vm_page_max_wired) | |||||
return (EAGAIN); | |||||
#endif | |||||
error = vm_map_wire(&curproc->p_vmspace->vm_map, start, end, | error = vm_map_wire(&curproc->p_vmspace->vm_map, start, end, | ||||
VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES); | VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES); | ||||
if (error == KERN_SUCCESS) { | if (error == KERN_SUCCESS) { | ||||
curthread->td_vslock_sz += len; | curthread->td_vslock_sz += len; | ||||
return (0); | return (0); | ||||
} | } | ||||
/* | /* | ||||
▲ Show 20 Lines • Show All 405 Lines • Show Last 20 Lines |