diff options
author | Menno Lageman <Menno.Lageman@Sun.COM> | 2010-06-29 02:03:28 -0700 |
---|---|---|
committer | Menno Lageman <Menno.Lageman@Sun.COM> | 2010-06-29 02:03:28 -0700 |
commit | ff19e029e81c950f4e0f40f1f1ee1f7d8f8d8041 (patch) | |
tree | 1dd3e8563f991d5f5525997320033ae6742031ac /usr/src/uts/common/syscall/tasksys.c | |
parent | e2449ddf2ae27a6dd79f8605a10fbc4082aba5f7 (diff) | |
download | illumos-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.c | 12 |
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); |