summaryrefslogtreecommitdiffstats
path: root/sys/vm/vm_glue.c
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2011-04-05 20:23:59 +0000
committertrasz <trasz@FreeBSD.org>2011-04-05 20:23:59 +0000
commit92bec9b84c91c81031aecc423fd62e9a9b27b631 (patch)
treeff083b539865dc2215b27827e89a3109487e5979 /sys/vm/vm_glue.c
parentfffd1b22a504ec96e5bf538ba769d4ea4f5c8ded (diff)
downloadFreeBSD-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.c23
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);
}
/*
OpenPOWER on IntegriCloud