[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