[SSI] openssi/kernel/cluster/ssi/util load_level.c,1.28,1.29

Roger Tsang <[email protected]> Mon, 25 Oct 2010 05:04:30 +0000
Newsgroups gmane.linux.cluster.ssic.cvs
Message-ID <[email protected]>
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/util
In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv2504/cluster/ssi/util

Modified Files:
      Tag: OPENSSI-FC
	load_level.c 
Log Message:
VPROC (#ifdef TASK_HOLD_VPROC):
- Optimize away extra is_loadlevelable() call in ssi_do_execve() path. Affects execve(2) and rexecve(2).
- In is_loadlevelable() optimize away vproc_is_loadlevelable() call where applicable.

VPROC (#ifdef VPROC_LOCKING_CONTEXT_FIX):
- Reduce FLAG LOCK critical section in vpop_setup_vproc_relations(). Elements inside FLAG LOCK are already protected by VPROC LOCK. This fix places vproc_is_loadlevelable() outside FLAG LOCK.

 cluster/ssi/util/load_level.c |   34 ++++++++++++++++++++++++----------
 cluster/ssi/vproc/dvp_vpops.c |   14 ++++++++++----
 fs/exec.c                     |   12 +++---------
 3 files changed, 37 insertions(+), 23 deletions(-)


Index: load_level.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/util/load_level.c,v
retrieving revision 1.28
retrieving revision 1.29
diff -u -d -r1.28 -r1.29
--- load_level.c	25 Oct 2010 05:01:38 -0000	1.28
+++ load_level.c	25 Oct 2010 05:04:28 -0000	1.29
@@ -693,9 +693,10 @@
 is_loadlevelable(struct task_struct *p, char *fname)
 {
 #ifdef TASK_HOLD_VPROC
-	int ret;
 	struct vproc *vp = p->p_vproc;
 	struct pvproc *pvp;
+	int ret;
+
 	extern int vproc_is_loadlevelable(struct vproc *, char *);
 
 	if (!loadlist_lockinit || (p->exit_state >= EXIT_ZOMBIE) ||
@@ -713,22 +714,30 @@
 		goto out;
 	}
 
+	if (!fname) {
+		/* Cannot sleep while in choose() / mchoose() */
+		ret = 0;
+		goto out;
+	} else {
+		/* reset so that it can be resolved since process is
+		 * about to exec
+		 */
+		pvp->pvp_loadlevel = -1;
+	}
+
 	ret = vproc_is_loadlevelable(vp, fname);
 out:
 	VPROC_RELE(vp, "is_loadlevelable");
 	return ret;
 }
 
-/*
- * Cannot sleep in following path...
- * child FLAG LOCK	(vpop_setup_vproc_relations)
- * 			(vproc_is_loadlevelable)
- */
 /* May acquire following locks:
- *	task_lock
- *	mmap_sem [sem]
+ * alloc_lock			(VPROC_LOCK_COMM, task_lock)
+ * TRY mmap_sem
+ * loadlevellist_lock [sem]	(TRY_LOADLIST_LOCK_SHARED)
+ */
+/* Called functions may acquire following locks:
  *	fs->lock
- *	loadlevellist_lock [sem]
  *	dcache_lock, d_lock
  *	sb_lock, s_umount [sem]
  */
@@ -747,6 +756,8 @@
 	int held;
 #endif
 
+	might_sleep();
+
 #ifdef TASK_HOLD_VPROC
 	if (!loadlist_lockinit || (PVP(vp)->pvp_flag & PV_EXITING) ||
 	    !(PVP(vp)->pvp_flag & PV_IS_LOCAL) ||
@@ -848,15 +859,18 @@
 			LOADLIST_UNLOCK_SHARED();
 		}
 		set_mb(pvp->pvp_loadlevel, 0);
+#ifndef TASK_HOLD_VPROC
 	} else if ((pvp->pvp_loadlevel == 0) && fname) {
 		/* reset so that it can be resolved again since process is
 		 * about to exec
 		 */
 		set_mb(pvp->pvp_loadlevel, -1);
+#endif
 	}
 
 out_nolock:
-	dput(dentry);
+	if (dentry)
+		dput(dentry);
 	mntput(mnt);
 
 	return (pvp->pvp_loadlevel < 0) ? 0 : pvp->pvp_loadlevel;


------------------------------------------------------------------------------
Nokia and AT&T present the 2010 Calling All Innovators-North America contest
Create new apps & games for the Nokia N8 for consumers in  U.S. and Canada
$10 million total in prizes - $4M cash, 500 devices, nearly $6M in marketing
Develop with Nokia Qt SDK, Web Runtime, or Java and Publish to Ovi Store 
http://p.sf.net/sfu/nokia-dev2dev