[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