Mercurial > illumos > illumos-gate
changeset 3551:ab90aba6060d
6513610 mstate_aggr_state() can double-count a process's mstate if a child is in fork()
author | johansen |
---|---|
date | Mon, 05 Feb 2007 11:10:45 -0800 |
parents | 031af7ab4635 |
children | ea34919c6784 |
files | usr/src/uts/common/os/lwp.c |
diffstat | 1 files changed, 12 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/usr/src/uts/common/os/lwp.c Mon Feb 05 10:41:52 2007 -0800 +++ b/usr/src/uts/common/os/lwp.c Mon Feb 05 11:10:45 2007 -0800 @@ -20,7 +20,7 @@ */ /* - * Copyright 2006 Sun Microsystems, Inc. All rights reserved. + * Copyright 2007 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -1619,9 +1619,19 @@ tfpu = clwp->lwp_fpu; brand_data = clwp->lwp_brand; - /* copy parent lwp to child lwp */ + /* + * Copy parent lwp to child lwp. Hold child's p_lock to prevent + * mstate_aggr_state() from reading stale mstate entries copied + * from lwp to clwp. + */ + mutex_enter(&cp->p_lock); *clwp = *lwp; + /* clear microstate and resource usage data in new lwp */ + init_mstate(ct, LMS_STOPPED); + bzero(&clwp->lwp_ru, sizeof (clwp->lwp_ru)); + mutex_exit(&cp->p_lock); + /* fix up child's lwp */ #if defined(__i386) || defined(__amd64) @@ -1640,8 +1650,6 @@ clwp->lwp_ap = clwp->lwp_arg; clwp->lwp_procp = cp; bzero(clwp->lwp_timer, sizeof (clwp->lwp_timer)); - init_mstate(ct, LMS_STOPPED); - bzero(&clwp->lwp_ru, sizeof (clwp->lwp_ru)); clwp->lwp_lastfault = 0; clwp->lwp_lastfaddr = 0;