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;