[SSI] openssi/kernel/cluster/ssi/cfs proc.c, 1.26, 1.27 vfs.c, 1.35, 1.36 write.c, 1.46, 1.47

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

Modified Files:
      Tag: OPENSSI-FC
	proc.c vfs.c write.c 
Log Message:
- Hide i_sem flusher. Add new functions set_sem_flusher() and unset_sem_flusher().
- When setting sem_flushing() for PFS inode do the same for CFS inode because cfs_writepages() and cfs_wait_on_write_congestion() tests sem_flushing() on CFS inode. (#ifdef CFS_FILE_WRITE_LIVELOCK_FIX)

 cluster/ssi/cfs/proc.c       |   37 ++++++++++++++++++++++++++++++++++-
 cluster/ssi/cfs/vfs.c        |   32 ------------------------------
 cluster/ssi/cfs/write.c      |    8 ++++++-
 include/asm-i386/semaphore.h |   10 +++++++++
 4 files changed, 53 insertions(+), 34 deletions(-)


Index: proc.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/proc.c,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -d -r1.26 -r1.27
--- proc.c	25 Oct 2010 05:53:39 -0000	1.26
+++ proc.c	25 Oct 2010 05:56:23 -0000	1.27
@@ -703,12 +703,47 @@
 #endif
 	if (CFS_AT_SERVER(data->inode)) {
 		struct kvec *vec;
+#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
+		struct inode *ip = itoc(data->inode)->c_hp->sct_ip;
+		int stacked = 0;
 
+		/* RT: [ ssic-linux-Bugs-686748 ] Filesystem stacking deadlock.
+		 *
+		 * Lock ordering:
+		 * 		(__cfs_file_write)
+		 *		...
+		 *		(generic_file_buffered_write)
+		 *		(cfs_updatepage)
+		 *		...
+		 * ->i_sem	(generic_file_writev)
+		 *		...
+		 *		(generic_file_buffered_write)
+		 *		...
+		 *		(balance_dirty_pages)
+		 *		...
+		 *		(cfs_writepages)
+		 *		...
+		 * ->i_sem	(generic_file_writev)
+		 */
+		if (unlikely(sem_owned(&ip->i_sem) &&
+				!sem_flushing(&ip->i_sem))) {
+			set_sem_flushing(&ip->i_sem);
+			set_sem_flushing(&data->inode->i_sem);
+			stacked = 1;
+		}
+#endif
 		MAP_CFS_PAGEVEC(data, vec, vlen);
+
 		status = cfsd_write(itoc(data->inode)->c_hp, data->offset,
 				    vec, vlen, (unsigned long)data->count,
 				    data->stable);
 		UNMAP_CFS_PAGEVEC(data, vec, vlen);
+#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
+		if (unlikely(stacked)) {
+			unset_sem_flushing(&ip->i_sem);
+			unset_sem_flushing(&data->inode->i_sem);
+		}
+#endif
 
 		if (status == 0)
 			cfs_update_attr(itoc(data->inode)->c_hp, data->inode, 1);

Index: vfs.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/vfs.c,v
retrieving revision 1.35
retrieving revision 1.36
diff -u -d -r1.35 -r1.36
--- vfs.c	13 Mar 2010 10:02:41 -0000	1.35
+++ vfs.c	25 Oct 2010 05:56:23 -0000	1.36
@@ -765,9 +765,6 @@
 #ifdef CFS_GATHERWRITES
 	int gathered_writes = ssi_isremote();
 #endif
-#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
-	int stacked;
-#endif
 
 	err = cfsd_open(hp, S_IFREG, MAY_WRITE, &file);
 	if (err)
@@ -803,31 +800,6 @@
 			file->f_flags |= O_SYNC;
 
 	/* Write the data. */
-#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
-	/* RT: [ ssic-linux-Bugs-686748 ] Filesystem stacking deadlock.
-	 *
-	 * Lock ordering:
-	 * 		(__cfs_file_write)
-	 *		...
-	 *		(generic_file_buffered_write)
-	 *		(cfs_updatepage)
-	 *		...
-	 * ->i_sem	(generic_file_writev)
-	 *		...
-	 *		(generic_file_buffered_write)
-	 *		...
-	 *		(balance_dirty_pages)
-	 *		...
-	 *		(cfs_writepages)
-	 *		...
-	 * ->i_sem	(generic_file_writev)
-	 */
-	if (sem_owned(&inode->i_sem) && !sem_flushing(&inode->i_sem)) {
-		inode->i_sem.flusher = current;
-		stacked = 1;
-	} else
-		stacked = 0;
-#endif
 	oldfs = get_fs(); set_fs(KERNEL_DS);
 
 #ifdef CFS_PAGEVEC
@@ -838,10 +810,6 @@
 	err = file->f_op->write(file, buf, cnt, file->f_pos);
 #endif /* !CFS_PAGEVEC */
 	set_fs(oldfs);
-#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
-	if (stacked)
-		inode->i_sem.flusher = NULL;
-#endif
 	if (err > 0)
 		dnotify_parent(file->f_dentry, DN_MODIFY);
 

Index: write.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/write.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- write.c	25 Oct 2010 05:53:39 -0000	1.46
+++ write.c	25 Oct 2010 05:56:23 -0000	1.47
@@ -1504,7 +1504,13 @@
 	if (!(how & FLUSH_SYNC) &&
 	    (!data->is_local || !CFS_SB_UP_SB(inode->i_sb)))
 		data->flags = RPC_TASK_ASYNC;
-
+#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
+	/* If we are under memory pressure unset is_local
+	 * so that we don't call alloc_pages()
+	 */
+	if (data->is_local && sem_flushing(&inode->i_sem))
+		data->is_local = 0;
+#endif
 	if (data->is_local) {
 		struct cfs_page *cp;
 		/* Unset is_local, do zero-copy if page cache is not virtual */


------------------------------------------------------------------------------
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