packages: kernel/kernel-small_fixes.patch - speedup regression issue solved

arekm arekm at pld-linux.org
Sat Sep 10 21:08:08 CEST 2011


Author: arekm                        Date: Sat Sep 10 19:08:08 2011 GMT
Module: packages                      Tag: HEAD
---- Log message:
- speedup regression issue solved

---- Files affected:
packages/kernel:
   kernel-small_fixes.patch (1.35 -> 1.36) 

---- Diffs:

================================================================
Index: packages/kernel/kernel-small_fixes.patch
diff -u packages/kernel/kernel-small_fixes.patch:1.35 packages/kernel/kernel-small_fixes.patch:1.36
--- packages/kernel/kernel-small_fixes.patch:1.35	Thu Sep  8 17:54:07 2011
+++ packages/kernel/kernel-small_fixes.patch	Sat Sep 10 21:08:02 2011
@@ -743,3 +743,61 @@
  					struct xfs_ail_cursor *cur);
  void			xfs_trans_ail_cursor_done(struct xfs_ail *ailp,
  					struct xfs_ail_cursor *cur);
+commit 37b652ec6445be99d0193047d1eda129a1a315d3
+Author: Dave Chinner <dchinner at redhat.com>
+Date:   Thu Aug 25 07:17:01 2011 +0000
+
+    xfs: don't serialise direct IO reads on page cache checks
+    
+    There is no need to grab the i_mutex of the IO lock in exclusive
+    mode if we don't need to invalidate the page cache. Taking these
+    locks on every direct IO effective serialises them as taking the IO
+    lock in exclusive mode has to wait for all shared holders to drop
+    the lock. That only happens when IO is complete, so effective it
+    prevents dispatch of concurrent direct IO reads to the same inode.
+    
+    Fix this by taking the IO lock shared to check the page cache state,
+    and only then drop it and take the IO lock exclusively if there is
+    work to be done. Hence for the normal direct IO case, no exclusive
+    locking will occur.
+    
+    Signed-off-by: Dave Chinner <dchinner at redhat.com>
+    Tested-by: Joern Engel <joern at logfs.org>
+    Reviewed-by: Christoph Hellwig <hch at lst.de>
+    Signed-off-by: Alex Elder <aelder at sgi.com>
+
+diff --git a/fs/xfs/linux-2.6/xfs_file.c b/fs/xfs/linux-2.6/xfs_file.c
+index 7f7b424..8fd4a07 100644
+--- a/fs/xfs/linux-2.6/xfs_file.c
++++ b/fs/xfs/linux-2.6/xfs_file.c
+@@ -317,7 +317,19 @@ xfs_file_aio_read(
+ 	if (XFS_FORCED_SHUTDOWN(mp))
+ 		return -EIO;
+ 
+-	if (unlikely(ioflags & IO_ISDIRECT)) {
++	/*
++	 * Locking is a bit tricky here. If we take an exclusive lock
++	 * for direct IO, we effectively serialise all new concurrent
++	 * read IO to this file and block it behind IO that is currently in
++	 * progress because IO in progress holds the IO lock shared. We only
++	 * need to hold the lock exclusive to blow away the page cache, so
++	 * only take lock exclusively if the page cache needs invalidation.
++	 * This allows the normal direct IO case of no page cache pages to
++	 * proceeed concurrently without serialisation.
++	 */
++	xfs_rw_ilock(ip, XFS_IOLOCK_SHARED);
++	if ((ioflags & IO_ISDIRECT) && inode->i_mapping->nrpages) {
++		xfs_rw_iunlock(ip, XFS_IOLOCK_SHARED);
+ 		xfs_rw_ilock(ip, XFS_IOLOCK_EXCL);
+ 
+ 		if (inode->i_mapping->nrpages) {
+@@ -330,8 +342,7 @@ xfs_file_aio_read(
+ 			}
+ 		}
+ 		xfs_rw_ilock_demote(ip, XFS_IOLOCK_EXCL);
+-	} else
+-		xfs_rw_ilock(ip, XFS_IOLOCK_SHARED);
++	}
+ 
+ 	trace_xfs_file_read(ip, size, iocb->ki_pos, ioflags);
+ 
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/cgi-bin/cvsweb.cgi/packages/kernel/kernel-small_fixes.patch?r1=1.35&r2=1.36&f=u



More information about the pld-cvs-commit mailing list