From: Suparna Bhattacharya DESC aio O_DIRECT no readahead EDESC From: Daniel McNeil 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 #include #include +#include #include #include @@ -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: _