summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/syscall/tasksys.c
diff options
context:
space:
mode:
authorkrishna <none@none>2007-03-28 17:57:31 -0700
committerkrishna <none@none>2007-03-28 17:57:31 -0700
commitc1a9a9c34efaa6bfab9cee1552b209991ee2c929 (patch)
tree054345f4f7b819fd59921c5d5d43982d1b457e6a /usr/src/uts/common/syscall/tasksys.c
parent4bd2082ff2d009263265d7de938de336894b6009 (diff)
downloadillumos-gate-c1a9a9c34efaa6bfab9cee1552b209991ee2c929.tar.gz
6533554 crypto_buffer_check() is still expensive
Diffstat (limited to 'usr/src/uts/common/syscall/tasksys.c')
-rw-r--r--usr/src/uts/common/syscall/tasksys.c21
1 files changed, 17 insertions, 4 deletions
diff --git a/usr/src/uts/common/syscall/tasksys.c b/usr/src/uts/common/syscall/tasksys.c
index bec091e61c..7038a19347 100644
--- a/usr/src/uts/common/syscall/tasksys.c
+++ b/usr/src/uts/common/syscall/tasksys.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -124,13 +124,21 @@ tasksys_settaskid(projid_t projid, uint_t flags)
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 (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,
- &e, p->p_locked_mem, 0) &RCT_DENY)
+ &e, p->p_locked_mem, 0) & RCT_DENY)
+ rctlfail = 1;
+
+ mutex_enter(&(kpj->kpj_data.kpd_crypto_lock));
+ if (kpj->kpj_data.kpd_crypto_mem + p->p_crypto_mem >
+ kpj->kpj_data.kpd_crypto_mem_ctl)
+ if (rctl_test_entity(rc_project_crypto_mem, kpj->kpj_rctls, p,
+ &e, p->p_crypto_mem, 0) & RCT_DENY)
rctlfail = 1;
if (rctlfail) {
+ mutex_exit(&(kpj->kpj_data.kpd_crypto_lock));
mutex_exit(&zone->zone_mem_lock);
mutex_exit(&zone->zone_nlwps_lock);
if (curthread != p->p_agenttp)
@@ -138,11 +146,16 @@ tasksys_settaskid(projid_t projid, uint_t flags)
mutex_exit(&p->p_lock);
return (set_errno(EAGAIN));
}
+ kpj->kpj_data.kpd_crypto_mem += p->p_crypto_mem;
+ mutex_exit(&(kpj->kpj_data.kpd_crypto_lock));
kpj->kpj_data.kpd_locked_mem += p->p_locked_mem;
kpj->kpj_nlwps += p->p_lwpcnt;
kpj->kpj_ntasks++;
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;
mutex_exit(&zone->zone_mem_lock);