[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