> 2) NFS commit stops pipeline because it sleep&wait inside i_mutex, > which blocks all other NFSDs trying to write/writeback the inode. > > nfsd_sync: > take i_mutex > filemap_fdatawrite > filemap_fdatawait > drop i_mutex I believe this is unrelated to the problem Steve is trying to solve. When we get to doing sync writes the performance is busted so we better shouldn't get to that (unless user asked for that of course). > If filemap_fdatawait() can be moved out of i_mutex (or just remove > the lock), we solve the root problem: > > nfsd_sync: > [take i_mutex] > filemap_fdatawrite => can also be blocked, but less a problem > [drop i_mutex] > filemap_fdatawait > > Maybe it's a dumb question, but what's the purpose of i_mutex here? > For correctness or to prevent livelock? I can imagine some livelock > problem here (current implementation can easily wait for extra > pages), however not too hard to fix. Generally, most filesystems take i_mutex during fsync to a) avoid all sorts of livelocking problems b) serialize fsyncs for one inode (mostly for simplicity) I don't see what advantage would it bring that we get rid of i_mutex for fdatawait - only that maybe writers could proceed while we are waiting but is that really the problem? Honza -- Jan Kara <jack@xxxxxxx> SuSE CR Labs -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html