summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/syscall/tasksys.c
diff options
context:
space:
mode:
authorMenno Lageman <Menno.Lageman@Sun.COM>2010-06-29 02:03:28 -0700
committerMenno Lageman <Menno.Lageman@Sun.COM>2010-06-29 02:03:28 -0700
commitff19e029e81c950f4e0f40f1f1ee1f7d8f8d8041 (patch)
tree1dd3e8563f991d5f5525997320033ae6742031ac /usr/src/uts/common/syscall/tasksys.c
parente2449ddf2ae27a6dd79f8605a10fbc4082aba5f7 (diff)
downloadillumos-joyent-ff19e029e81c950f4e0f40f1f1ee1f7d8f8d8041.tar.gz
PSARC 2009/042 max-processes rctl
6631612 non-global zone can overrun the process table of the system 6466380 Project resource set callbacks are needlessly called on every fork() 6516818 task resource callbacks are needlessly called on every fork()
Diffstat (limited to 'usr/src/uts/common/syscall/tasksys.c')
-rw-r--r--usr/src/uts/common/syscall/tasksys.c12
1 files changed, 8 insertions, 4 deletions
diff --git a/usr/src/uts/common/syscall/tasksys.c b/usr/src/uts/common/syscall/tasksys.c
index 7038a19347..bbaaba9f5d 100644
--- a/usr/src/uts/common/syscall/tasksys.c
+++ b/usr/src/uts/common/syscall/tasksys.c
@@ -19,12 +19,9 @@
* CDDL HEADER END
*/
/*
- * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
- * Use is subject to license terms.
+ * Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.
*/
-#pragma ident "%Z%%M% %I% %E% SMI"
-
/*
* System calls for creating and inquiring about tasks and projects
@@ -124,6 +121,11 @@ tasksys_settaskid(projid_t projid, uint_t flags)
1, 0) & RCT_DENY)
rctlfail = 1;
+ if (kpj != proj0p && kpj->kpj_nprocs + 1 > kpj->kpj_nprocs_ctl)
+ if (rctl_test_entity(rc_project_nprocs, kpj->kpj_rctls, p, &e,
+ 1, 0) & RCT_DENY)
+ rctlfail = 1;
+
if (kpj->kpj_data.kpd_locked_mem + p->p_locked_mem >
kpj->kpj_data.kpd_locked_mem_ctl)
if (rctl_test_entity(rc_project_locked_mem, kpj->kpj_rctls, p,
@@ -151,12 +153,14 @@ tasksys_settaskid(projid_t projid, uint_t flags)
kpj->kpj_data.kpd_locked_mem += p->p_locked_mem;
kpj->kpj_nlwps += p->p_lwpcnt;
kpj->kpj_ntasks++;
+ kpj->kpj_nprocs++;
oldpj->kpj_data.kpd_locked_mem -= p->p_locked_mem;
mutex_enter(&(oldpj->kpj_data.kpd_crypto_lock));
oldpj->kpj_data.kpd_crypto_mem -= p->p_crypto_mem;
mutex_exit(&(oldpj->kpj_data.kpd_crypto_lock));
oldpj->kpj_nlwps -= p->p_lwpcnt;
+ oldpj->kpj_nprocs--;
mutex_exit(&zone->zone_mem_lock);
mutex_exit(&zone->zone_nlwps_lock);