From: Suparna Bhattacharya <suparna@in.ibm.com>


DESC
aio O_DIRECT no readahead
EDESC
From: Daniel McNeil <daniel@osdl.org>

More testing on AIO with O_DIRECT and /dev/raw/.  Doing AIO reads was
using a lot more cpu time than using dd on the raw partition even with
the io_queue_wait patch.  Found out that aio is doing readahead even
for O_DIRECT.  Here's a patch that fixes it.



 fs/aio.c     |   20 +++++++++++++++++++-
 mm/filemap.c |    3 ++-
 2 files changed, 21 insertions(+), 2 deletions(-)

diff -puN fs/aio.c~aio-12-readahead fs/aio.c
--- 25/fs/aio.c~aio-12-readahead	2003-09-26 22:22:49.000000000 -0700
+++ 25-akpm/fs/aio.c	2003-09-26 22:22:49.000000000 -0700
@@ -28,6 +28,7 @@
 #include <linux/highmem.h>
 #include <linux/workqueue.h>
 #include <linux/writeback.h>
+#include <linux/pagemap.h>
 
 #include <asm/kmap_types.h>
 #include <asm/uaccess.h>
@@ -1350,8 +1351,25 @@ ssize_t aio_setup_iocb(struct kiocb *kio
 			kiocb->ki_left)))
 			break;
 		ret = -EINVAL;
-		if (file->f_op->aio_read)
+		if (file->f_op->aio_read) {
+			/*
+			 * Do not do readahead for DIRECT i/o
+			 */
+			if (!(file->f_flags & O_DIRECT)) {
+				struct address_space *mapping;
+				unsigned long index;
+				unsigned long end;
+
+				mapping = file->f_dentry->d_inode->i_mapping;
+				index = kiocb->ki_pos >> PAGE_CACHE_SHIFT;
+				end = (kiocb->ki_pos + kiocb->ki_left) >>
+						PAGE_CACHE_SHIFT;
+				for (; index < end; index++)
+					page_cache_readahead(mapping,
+						&file->f_ra, file, index);
+			}
 			kiocb->ki_retry = aio_pread;
+		}
 		break;
 	case IOCB_CMD_PWRITE:
 		ret = -EBADF;
diff -puN mm/filemap.c~aio-12-readahead mm/filemap.c
--- 25/mm/filemap.c~aio-12-readahead	2003-09-26 22:22:49.000000000 -0700
+++ 25-akpm/mm/filemap.c	2003-09-26 22:22:49.000000000 -0700
@@ -663,7 +663,8 @@ void do_generic_mapping_read(struct addr
 		}
 
 		cond_resched();
-		page_cache_readahead(mapping, ra, filp, index);
+		if (is_sync_wait(current->io_wait))
+			page_cache_readahead(mapping, ra, filp, index);
 
 		nr = nr - offset;
 find_page:

_