summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/os/rctl.c
diff options
context:
space:
mode:
authorVamsi Nagineni <Vamsi.Krishna@Sun.COM>2009-03-20 04:32:37 -0700
committerVamsi Nagineni <Vamsi.Krishna@Sun.COM>2009-03-20 04:32:37 -0700
commitbb5ca623d9cfae0efb343eed949af6d1a9163207 (patch)
tree5241ea9be26c8043adc3a839dce95b4f26d62b84 /usr/src/uts/common/os/rctl.c
parentcbf75e67acb6c32a2f4884f28a839d59f7988d37 (diff)
downloadillumos-joyent-bb5ca623d9cfae0efb343eed949af6d1a9163207.tar.gz
6810086 panic in rctl_incr_swap() due to freed up proc structure
6557272 assertion failed: zone->zone_max_swap >= swap, panic during dism stress test
Diffstat (limited to 'usr/src/uts/common/os/rctl.c')
-rw-r--r--usr/src/uts/common/os/rctl.c20
1 files changed, 19 insertions, 1 deletions
diff --git a/usr/src/uts/common/os/rctl.c b/usr/src/uts/common/os/rctl.c
index 41da98ee02..dee5330bca 100644
--- a/usr/src/uts/common/os/rctl.c
+++ b/usr/src/uts/common/os/rctl.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2009 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -2908,6 +2908,13 @@ rctl_incr_locked_mem(proc_t *p, kproject_t *proj, rctl_qty_t inc,
e.rcep_p.proj = projp;
e.rcep_t = RCENTITY_PROJECT;
+
+ /* check for overflow */
+ if ((projp->kpj_data.kpd_locked_mem + inc) <
+ projp->kpj_data.kpd_locked_mem) {
+ ret = EAGAIN;
+ goto out;
+ }
if (projp->kpj_data.kpd_locked_mem + inc >
projp->kpj_data.kpd_locked_mem_ctl) {
if (rctl_test_entity(rc_project_locked_mem, projp->kpj_rctls,
@@ -2918,6 +2925,12 @@ rctl_incr_locked_mem(proc_t *p, kproject_t *proj, rctl_qty_t inc,
}
e.rcep_p.zone = zonep;
e.rcep_t = RCENTITY_ZONE;
+
+ /* Check for overflow */
+ if ((zonep->zone_locked_mem + inc) < zonep->zone_locked_mem) {
+ ret = EAGAIN;
+ goto out;
+ }
if (zonep->zone_locked_mem + inc > zonep->zone_locked_mem_ctl) {
if (rctl_test_entity(rc_zone_locked_mem, zonep->zone_rctls,
p, &e, inc, 0) & RCT_DENY) {
@@ -3003,6 +3016,11 @@ rctl_incr_swap(proc_t *proc, zone_t *zone, size_t swap)
mutex_enter(&zone->zone_mem_lock);
+ /* Check for overflow */
+ if ((zone->zone_max_swap + swap) < zone->zone_max_swap) {
+ mutex_exit(&zone->zone_mem_lock);
+ return (EAGAIN);
+ }
if ((zone->zone_max_swap + swap) >
zone->zone_max_swap_ctl) {