From mboxrd@z Thu Jan 1 00:00:00 1970 From: Dave Kleikamp Subject: Re: [PATCH v2 1/5] direct-io: don't dirty ITER_BVEC pages on read Date: Fri, 21 Nov 2014 09:39:04 -0600 Message-ID: <546F5C98.4030202@oracle.com> References: Mime-Version: 1.0 Content-Type: text/plain; charset=windows-1252 Content-Transfer-Encoding: quoted-printable Cc: Ming Lei To: Omar Sandoval , Alexander Viro , Andrew Morton , Chris Mason , Josef Bacik , linux-btrfs@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, linux-nfs@vger.kernel.org, Trond Myklebust , Mel Gorman Return-path: In-Reply-To: Sender: owner-linux-mm@kvack.org List-Id: linux-fsdevel.vger.kernel.org On 11/21/2014 04:08 AM, Omar Sandoval wrote: > Reads through the iov_iter infrastructure for kernel pages shouldn't be= dirtied > by the direct I/O code. >=20 > This is based on Dave Kleikamp's and Ming Lei's previously posted patch= es. Acked-by: Dave Kleikamp > Cc: Ming Lei > Signed-off-by: Omar Sandoval > --- > fs/direct-io.c | 8 +++++--- > 1 file changed, 5 insertions(+), 3 deletions(-) >=20 > diff --git a/fs/direct-io.c b/fs/direct-io.c > index e181b6b..e542ce4 100644 > --- a/fs/direct-io.c > +++ b/fs/direct-io.c > @@ -120,6 +120,7 @@ struct dio { > spinlock_t bio_lock; /* protects BIO fields below */ > int page_errors; /* errno from get_user_pages() */ > int is_async; /* is IO async ? */ > + int should_dirty; /* should we mark read pages dirty? */ > bool defer_completion; /* defer AIO completion to workqueue? */ > int io_error; /* IO error in completion path */ > unsigned long refcount; /* direct_io_worker() and bios */ > @@ -392,7 +393,7 @@ static inline void dio_bio_submit(struct dio *dio, = struct dio_submit *sdio) > dio->refcount++; > spin_unlock_irqrestore(&dio->bio_lock, flags); > =20 > - if (dio->is_async && dio->rw =3D=3D READ) > + if (dio->is_async && dio->rw =3D=3D READ && dio->should_dirty) > bio_set_pages_dirty(bio); > =20 > if (sdio->submit_io) > @@ -463,13 +464,13 @@ static int dio_bio_complete(struct dio *dio, stru= ct bio *bio) > if (!uptodate) > dio->io_error =3D -EIO; > =20 > - if (dio->is_async && dio->rw =3D=3D READ) { > + if (dio->is_async && dio->rw =3D=3D READ && dio->should_dirty) { > bio_check_pages_dirty(bio); /* transfers ownership */ > } else { > bio_for_each_segment_all(bvec, bio, i) { > struct page *page =3D bvec->bv_page; > =20 > - if (dio->rw =3D=3D READ && !PageCompound(page)) > + if (dio->rw =3D=3D READ && !PageCompound(page) && dio->should_dirty= ) > set_page_dirty_lock(page); > page_cache_release(page); > } > @@ -1177,6 +1178,7 @@ do_blockdev_direct_IO(int rw, struct kiocb *iocb,= struct inode *inode, > =20 > dio->inode =3D inode; > dio->rw =3D rw; > + dio->should_dirty =3D !(iter->type & ITER_BVEC); > =20 > /* > * For AIO O_(D)SYNC writes we need to defer completions to a workque= ue >=20 -- To unsubscribe, send a message with 'unsubscribe linux-mm' in the body to majordomo@kvack.org. For more info on Linux MM, see: http://www.linux-mm.org/ . Don't email: email@kvack.org