public inbox for linux-xfs@vger.kernel.org
 help / color / mirror / Atom feed
From: Ben Myers <bpm@sgi.com>
To: stable@vger.kernel.org
Cc: Alex Elder <aelder@sgi.com>, Dave Chinner <dchinner@redhat.com>,
	xfs@oss.sgi.com
Subject: [PATCH 1/6] xfs: don't serialise direct IO reads on page cache checks
Date: Wed, 23 Nov 2011 15:38:08 -0600	[thread overview]
Message-ID: <1322084293-23557-2-git-send-email-bpm@sgi.com> (raw)
In-Reply-To: <1322084293-23557-1-git-send-email-bpm@sgi.com>

From: Dave Chinner <dchinner@redhat.com>

>From c83a4e86f777d08e247592291de429d827c1287a

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@redhat.com>
Tested-by: Joern Engel <joern@logfs.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Alex Elder <aelder@sgi.com>
---
 fs/xfs/xfs_file.c |   17 ++++++++++++++---
 1 files changed, 14 insertions(+), 3 deletions(-)

diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index 7f7b424..8fd4a07 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/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);
 
-- 
1.7.8.rc0.46.g5ae0f

_______________________________________________
xfs mailing list
xfs@oss.sgi.com
http://oss.sgi.com/mailman/listinfo/xfs

  reply	other threads:[~2011-11-23 21:25 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-23 21:38 [PATCH 0/6] XFS update for 3.1-stable Ben Myers
2011-11-23 21:38 ` Ben Myers [this message]
2011-11-23 21:38 ` [PATCH 2/6] xfs: avoid direct I/O write vs buffered I/O race Ben Myers
2011-11-23 21:38 ` [PATCH 3/6] xfs: Return -EIO when xfs_vn_getattr() failed Ben Myers
2011-11-23 21:38 ` [PATCH 4/6] xfs: fix buffer flushing during unmount Ben Myers
2011-11-23 21:38 ` [PATCH 5/6] xfs: Fix possible memory corruption in xfs_readlink Ben Myers
2011-11-23 21:38 ` [PATCH 6/6] xfs: use doalloc flag in xfs_qm_dqattach_one() Ben Myers
2011-11-28 11:00 ` [PATCH 0/6] XFS update for 3.1-stable Christoph Hellwig
2011-11-28 13:48   ` Greg KH
2011-11-28 16:54     ` Ben Myers
2011-11-28 21:40       ` Greg KH
2011-11-30 18:10         ` XFS update for 3.1-stable (resent) Ben Myers
2011-11-30 18:10           ` [PATCH 1/6] xfs: don't serialise direct IO reads on page cache checks Ben Myers
2011-11-30 18:10           ` [PATCH 2/6] xfs: avoid direct I/O write vs buffered I/O race Ben Myers
2011-11-30 18:10           ` [PATCH 3/6] xfs: Return -EIO when xfs_vn_getattr() failed Ben Myers
2011-11-30 18:10           ` [PATCH 4/6] xfs: fix buffer flushing during unmount Ben Myers
2011-11-30 18:10           ` [PATCH 5/6] xfs: Fix possible memory corruption in xfs_readlink Ben Myers
2011-11-30 18:11           ` [PATCH 6/6] xfs: use doalloc flag in xfs_qm_dqattach_one() Ben Myers
  -- strict thread matches above, loose matches on Subject: below --
2011-12-01 23:27 [PATCH 0/6] XFS update for 3.1-stable (again) Ben Myers
2011-12-01 23:27 ` [PATCH 1/6] xfs: don't serialise direct IO reads on page cache checks Ben Myers
2011-08-25  7:17 [PATCH 0/6] xfs: patch queue for Linux 3.2 Dave Chinner
2011-08-25  7:17 ` [PATCH 1/6] xfs: don't serialise direct IO reads on page cache checks Dave Chinner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1322084293-23557-2-git-send-email-bpm@sgi.com \
    --to=bpm@sgi.com \
    --cc=aelder@sgi.com \
    --cc=dchinner@redhat.com \
    --cc=stable@vger.kernel.org \
    --cc=xfs@oss.sgi.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox