diff options
author | Vamsi Nagineni <Vamsi.Krishna@Sun.COM> | 2009-03-20 04:32:37 -0700 |
---|---|---|
committer | Vamsi Nagineni <Vamsi.Krishna@Sun.COM> | 2009-03-20 04:32:37 -0700 |
commit | bb5ca623d9cfae0efb343eed949af6d1a9163207 (patch) | |
tree | 5241ea9be26c8043adc3a839dce95b4f26d62b84 /usr/src/uts/common/os/rctl.c | |
parent | cbf75e67acb6c32a2f4884f28a839d59f7988d37 (diff) | |
download | illumos-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.c | 20 |
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) { |