diff options
author | trasz <trasz@FreeBSD.org> | 2011-04-05 20:23:59 +0000 |
---|---|---|
committer | trasz <trasz@FreeBSD.org> | 2011-04-05 20:23:59 +0000 |
commit | 92bec9b84c91c81031aecc423fd62e9a9b27b631 (patch) | |
tree | ff083b539865dc2215b27827e89a3109487e5979 /sys/vm/vm_glue.c | |
parent | fffd1b22a504ec96e5bf538ba769d4ea4f5c8ded (diff) | |
download | FreeBSD-src-92bec9b84c91c81031aecc423fd62e9a9b27b631.zip FreeBSD-src-92bec9b84c91c81031aecc423fd62e9a9b27b631.tar.gz |
Add accounting for most of the memory-related resources.
Sponsored by: The FreeBSD Foundation
Reviewed by: kib (earlier version)
Diffstat (limited to 'sys/vm/vm_glue.c')
-rw-r--r-- | sys/vm/vm_glue.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/sys/vm/vm_glue.c b/sys/vm/vm_glue.c index 69576d5..3ad8fe1 100644 --- a/sys/vm/vm_glue.c +++ b/sys/vm/vm_glue.c @@ -69,6 +69,7 @@ __FBSDID("$FreeBSD$"); #include <sys/lock.h> #include <sys/mutex.h> #include <sys/proc.h> +#include <sys/racct.h> #include <sys/resourcevar.h> #include <sys/sched.h> #include <sys/sf_buf.h> @@ -182,6 +183,7 @@ int vslock(void *addr, size_t len) { vm_offset_t end, last, start; + unsigned long nsize; vm_size_t npages; int error; @@ -194,9 +196,13 @@ vslock(void *addr, size_t len) if (npages > vm_page_max_wired) return (ENOMEM); PROC_LOCK(curproc); - if (ptoa(npages + - pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map))) > - lim_cur(curproc, RLIMIT_MEMLOCK)) { + nsize = ptoa(npages + + pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map))); + if (nsize > lim_cur(curproc, RLIMIT_MEMLOCK)) { + PROC_UNLOCK(curproc); + return (ENOMEM); + } + if (racct_set(curproc, RACCT_MEMLOCK, nsize)) { PROC_UNLOCK(curproc); return (ENOMEM); } @@ -216,6 +222,12 @@ vslock(void *addr, size_t len) #endif error = vm_map_wire(&curproc->p_vmspace->vm_map, start, end, VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES); + if (error != KERN_SUCCESS) { + PROC_LOCK(curproc); + racct_set(curproc, RACCT_MEMLOCK, + ptoa(pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map)))); + PROC_UNLOCK(curproc); + } /* * Return EFAULT on error to match copy{in,out}() behaviour * rather than returning ENOMEM like mlock() would. @@ -231,6 +243,11 @@ vsunlock(void *addr, size_t len) (void)vm_map_unwire(&curproc->p_vmspace->vm_map, trunc_page((vm_offset_t)addr), round_page((vm_offset_t)addr + len), VM_MAP_WIRE_SYSTEM | VM_MAP_WIRE_NOHOLES); + + PROC_LOCK(curproc); + racct_set(curproc, RACCT_MEMLOCK, + ptoa(pmap_wired_count(vm_map_pmap(&curproc->p_vmspace->vm_map)))); + PROC_UNLOCK(curproc); } /* |