On 07/16/2015 10:37 AM, Ming Lei wrote: > When direct read IO is submitted from kernel, it is often > unnecessary to dirty pages, for example of loop, dirtying pages > have been considered in the upper filesystem(over loop) side > already, and they don't need to be dirtied again. > > So this patch doesn't dirtying pages for ITER_BVEC/ITER_KVEC > direct read, and loop should be the 1st case to use ITER_BVEC/ITER_KVEC > for direct read I/O. > > The patch is based on previous Dave's patch. > > Cc: Dave Kleikamp <[email protected]> > Reviewed-by: Christoph Hellwig <[email protected]> > Signed-off-by: Ming Lei <[email protected]>
Reviewed-by: Dave Kleikamp <[email protected]> > --- > fs/direct-io.c | 9 ++++++--- > 1 file changed, 6 insertions(+), 3 deletions(-) > > diff --git a/fs/direct-io.c b/fs/direct-io.c > index 745d234..07e4b28 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -120,6 +120,7 @@ struct dio { > int page_errors; /* errno from get_user_pages() */ > int is_async; /* is IO async ? */ > bool defer_completion; /* defer AIO completion to workqueue? */ > + bool should_dirty; /* if pages should be dirtied */ > int io_error; /* IO error in completion path */ > unsigned long refcount; /* direct_io_worker() and bios */ > struct bio *bio_list; /* singly linked via bi_private */ > @@ -393,7 +394,7 @@ static inline void dio_bio_submit(struct dio *dio, struct > dio_submit *sdio) > dio->refcount++; > spin_unlock_irqrestore(&dio->bio_lock, flags); > > - if (dio->is_async && dio->rw == READ) > + if (dio->is_async && dio->rw == READ && dio->should_dirty) > bio_set_pages_dirty(bio); > > if (sdio->submit_io) > @@ -464,13 +465,14 @@ static int dio_bio_complete(struct dio *dio, struct bio > *bio) > if (!uptodate) > dio->io_error = -EIO; > > - if (dio->is_async && dio->rw == READ) { > + if (dio->is_async && dio->rw == READ && dio->should_dirty) { > bio_check_pages_dirty(bio); /* transfers ownership */ > } else { > bio_for_each_segment_all(bvec, bio, i) { > struct page *page = bvec->bv_page; > > - if (dio->rw == READ && !PageCompound(page)) > + if (dio->rw == READ && !PageCompound(page) && > + dio->should_dirty) > set_page_dirty_lock(page); > page_cache_release(page); > } > @@ -1217,6 +1219,7 @@ do_blockdev_direct_IO(struct kiocb *iocb, struct inode > *inode, > spin_lock_init(&dio->bio_lock); > dio->refcount = 1; > > + dio->should_dirty = (iter->type == ITER_IOVEC); > sdio.iter = iter; > sdio.final_block_in_request = > (offset + iov_iter_count(iter)) >> blkbits; > -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/

