summaryrefslogtreecommitdiffstats
path: root/sys/kern/sysv_shm.c
diff options
context:
space:
mode:
authortrasz <trasz@FreeBSD.org>2011-04-06 18:11:24 +0000
committertrasz <trasz@FreeBSD.org>2011-04-06 18:11:24 +0000
commitd3c78eed8e4f4795db6ffb683782bde3484ce1b4 (patch)
tree2bfe2231d896c9fbc2c3e1f64b8977150af219c3 /sys/kern/sysv_shm.c
parent54a18d388a501f8b9e1a6821af2ef357fa5d2c74 (diff)
downloadFreeBSD-src-d3c78eed8e4f4795db6ffb683782bde3484ce1b4.zip
FreeBSD-src-d3c78eed8e4f4795db6ffb683782bde3484ce1b4.tar.gz
Add accounting for SysV-related resources.
Sponsored by: The FreeBSD Foundation Reviewed by: kib (earlier version)
Diffstat (limited to 'sys/kern/sysv_shm.c')
-rw-r--r--sys/kern/sysv_shm.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/sys/kern/sysv_shm.c b/sys/kern/sysv_shm.c
index 645184c..834fa38 100644
--- a/sys/kern/sysv_shm.c
+++ b/sys/kern/sysv_shm.c
@@ -77,6 +77,7 @@ __FBSDID("$FreeBSD$");
#include <sys/mman.h>
#include <sys/module.h>
#include <sys/mutex.h>
+#include <sys/racct.h>
#include <sys/resourcevar.h>
#include <sys/stat.h>
#include <sys/syscall.h>
@@ -246,6 +247,8 @@ shm_deallocate_segment(shmseg)
#ifdef MAC
mac_sysvshm_cleanup(shmseg);
#endif
+ racct_sub_cred(shmseg->cred, RACCT_NSHM, 1);
+ racct_sub_cred(shmseg->cred, RACCT_SHMSIZE, size);
crfree(shmseg->cred);
shmseg->cred = NULL;
}
@@ -669,6 +672,17 @@ shmget_allocate_segment(td, uap, mode)
shm_last_free = -1;
}
shmseg = &shmsegs[segnum];
+ PROC_LOCK(td->td_proc);
+ if (racct_add(td->td_proc, RACCT_NSHM, 1)) {
+ PROC_UNLOCK(td->td_proc);
+ return (ENOSPC);
+ }
+ if (racct_add(td->td_proc, RACCT_SHMSIZE, size)) {
+ racct_sub(td->td_proc, RACCT_NSHM, 1);
+ PROC_UNLOCK(td->td_proc);
+ return (ENOMEM);
+ }
+ PROC_UNLOCK(td->td_proc);
/*
* In case we sleep in malloc(), mark the segment present but deleted
* so that noone else tries to create the same key.
@@ -684,8 +698,13 @@ shmget_allocate_segment(td, uap, mode)
*/
shm_object = vm_pager_allocate(shm_use_phys ? OBJT_PHYS : OBJT_SWAP,
0, size, VM_PROT_DEFAULT, 0, cred);
- if (shm_object == NULL)
+ if (shm_object == NULL) {
+ PROC_LOCK(td->td_proc);
+ racct_sub(td->td_proc, RACCT_NSHM, 1);
+ racct_sub(td->td_proc, RACCT_SHMSIZE, size);
+ PROC_UNLOCK(td->td_proc);
return (ENOMEM);
+ }
VM_OBJECT_LOCK(shm_object);
vm_object_clear_flag(shm_object, OBJ_ONEMAPPING);
vm_object_set_flag(shm_object, OBJ_NOSPLIT);
OpenPOWER on IntegriCloud