[SSI] openssi/kernel/cluster/ssi/cfs write.c,1.49,1.50

Roger Tsang <[email protected]> Wed, 16 Nov 2011 07:52:21 +0000
Newsgroups gmane.linux.cluster.ssic.cvs
Message-ID <[email protected]>
Update of /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs
In directory vz-cvs-3.sog:/tmp/cvs-serv3401/cluster/ssi/cfs

Modified Files:
      Tag: OPENSSI-FC
	write.c 
Log Message:
(#ifdef CFS_FILE_WRITE_LIVELOCK_FIX)
cfs_write_rpcsetup: test for PF_MEMALLOC flag instead of sem_flushing(). sem_flushing() is deprecated.
cfs_writepages: revert livelock fixes. real cause was CFS inode using PFS backing_device_info which is fixed in __cfs_hpget()
cfs_wait_on_write_congestion: move ssic-linux-Bugs-686748 fix futher down the stack to cfs_writepage().


Index: write.c
===================================================================
RCS file: /cvsroot/ssic-linux/openssi/kernel/cluster/ssi/cfs/write.c,v
retrieving revision 1.49
retrieving revision 1.50
diff -u -d -r1.49 -r1.50
--- write.c	2 Oct 2011 22:21:45 -0000	1.49
+++ write.c	16 Nov 2011 07:52:18 -0000	1.50
@@ -440,6 +440,30 @@
 		goto out;
 do_it:
 	if (!IS_SYNC(inode) && inode_referenced) {
+#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
+		/* [ ssic-linux-Bugs-686748 ] Filesystem stacking deadlock.
+		 *
+		 *				(pdflush)
+		 * 				...
+		 * BDI_write_congested		(cfs_writepages)
+		 * 				...
+		 * 				(generic_file_buffered_write)
+		 * 				...
+		 * 				(alloc_pages)
+		 * 				...
+		 * 				(shrink_caches)
+		 * 				...
+		 * 				(pageout, may_write_to_queue)
+		 * 				(cfs_writepage)
+		 * 				...
+		 * BDI_write_congested		(cfs_wait_on_write_congestion)
+		 */
+		if (current_is_pdflush() &&
+		    bdi_write_congested(page->mapping->backing_dev_info)) {
+			err = 0;
+			goto out;
+		}
+#endif
 		err = cfs_writepage_async(NULL, inode, page, 0, offset);
 		if (err >= 0) {
 			err = 0;
@@ -476,9 +500,6 @@
 	pgoff_t end;
 	unsigned int npages = 0;
 #endif
-#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
-	int flushing = sem_flushing(&inode->i_sem);
-#endif
 #ifdef CFS_CHARD_SYNC_FIX
 	clusternode_t node;
 #endif
@@ -487,26 +508,8 @@
 	if (err)
 		return err;
 
-#ifdef CFS_WRITEPAGES_AT_SVR_SKIP_BDI
-	/* Don't interfere with backing device's request queue. */
-#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
-	while (!flushing &&
-	       test_and_set_bit(BDI_cfs_write_congested,
-					&bdi->state) != 0) {
-#else
-	while (test_and_set_bit(BDI_cfs_write_congested,
-					&bdi->state) != 0) {
-#endif
-#else /* !CFS_WRITEPAGES_AT_SVR_SKIP_BDI */
-#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
-	while (!flushing &&
-	       test_and_set_bit(BDI_write_congested,
-					&bdi->state) != 0) {
-#else
 	while (test_and_set_bit(BDI_write_congested,
 					&bdi->state) != 0) {
-#endif
-#endif /* !CFS_WRITEPAGES_AT_SVR_SKIP_BDI */
 		if (wbc->nonblocking)
 			return 0;
 		cfs_wait_on_write_congestion(mapping, 0);
@@ -568,15 +571,7 @@
 		err = 0;
 	}
 out:
-#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
-	if (flushing)
-		return err;
-#endif
-#ifdef CFS_WRITEPAGES_AT_SVR_SKIP_BDI
-	clear_bit(BDI_cfs_write_congested, &bdi->state);
-#else
 	clear_bit(BDI_write_congested, &bdi->state);
-#endif
 	wake_up_all(&cfs_write_congestion);
 	return err;
 }
@@ -835,35 +830,9 @@
 	DEFINE_WAIT(wait);
 	int ret = 0;
 
-#ifdef CFS_FILE_WRITE_LIVELOCK_FIX
-	/* RT: [ ssic-linux-Bugs-686748 ] Filesystem stacking deadlock. Part 2.
-	 *
-	 * Deadlock wait on bit:
-	 *				(pdflush)
-	 * 				...
-	 * BDI_cfs_write_congested	(cfs_writepages)
-	 * 				...
-	 * 				(generic_file_buffered_write)
-	 * 				...
-	 * 				(alloc_pages)
-	 * 				...
-	 * 				(shrink_caches)
-	 * 				...
-	 * 				(cfs_writepage)
-	 * 				...
-	 * cfs_write_congestion		(cfs_wait_on_write_congestion)
-	 */
-	if (sem_flushing(&mapping->host->i_sem))
-		return 0;
-#endif
-
 	might_sleep();
 
-#ifdef CFS_WRITEPAGES_AT_SVR_SKIP_BDI
-	if (!bdi_cfs_write_congested(bdi))
-#else
 	if (!bdi_write_congested(bdi))
-#endif
 		return 0;
 #ifdef CFS_INTR
 	if (intr) {
@@ -872,11 +841,7 @@
 
 		cfs_clnt_sigmask(mip, &oldset);
 		prepare_to_wait(&cfs_write_congestion, &wait, TASK_INTERRUPTIBLE);
-#ifdef CFS_WRITEPAGES_AT_SVR_SKIP_BDI
-		if (bdi_cfs_write_congested(bdi)) {
-#else
 		if (bdi_write_congested(bdi)) {
-#endif
 			if (signalled())
 				ret = -ERESTARTSYS;
 			else
@@ -886,11 +851,7 @@
 	} else {
 #endif
 		prepare_to_wait(&cfs_write_congestion, &wait, TASK_UNINTERRUPTIBLE);
-#ifdef CFS_WRITEPAGES_AT_SVR_SKIP_BDI
-		if (bdi_cfs_write_congested(bdi))
-#else
 		if (bdi_write_congested(bdi))
-#endif
 			schedule();
 #ifdef CFS_INTR
 	}
@@ -1505,7 +1466,7 @@
 	/* 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))
+	if (data->is_local && (current->flags & PF_MEMALLOC))
 		data->is_local = 0;
 #endif
 	if (data->is_local) {


------------------------------------------------------------------------------
RSA(R) Conference 2012
Save $700 by Nov 18
Register now
http://p.sf.net/sfu/rsa-sfdev2dev1