On Thu, Jul 20, 2023 at 12:13:04PM -0600, Jens Axboe wrote: > Rather than gate whether or not we need to punt a dio completion to a > workqueue on whether the IO is a write or not, add an explicit flag for > it. For now we treat them the same, reads always set the flags and async > writes do not. > > No functional changes in this patch. > > Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> Looks good, Reviewed-by: Darrick J. Wong <djwong@xxxxxxxxxx> --D > --- > fs/iomap/direct-io.c | 10 ++++++++-- > 1 file changed, 8 insertions(+), 2 deletions(-) > > diff --git a/fs/iomap/direct-io.c b/fs/iomap/direct-io.c > index 0ce60e80c901..c654612b24e5 100644 > --- a/fs/iomap/direct-io.c > +++ b/fs/iomap/direct-io.c > @@ -20,6 +20,7 @@ > * Private flags for iomap_dio, must not overlap with the public ones in > * iomap.h: > */ > +#define IOMAP_DIO_INLINE_COMP (1 << 27) > #define IOMAP_DIO_WRITE_FUA (1 << 28) > #define IOMAP_DIO_NEED_SYNC (1 << 29) > #define IOMAP_DIO_WRITE (1 << 30) > @@ -171,8 +172,10 @@ void iomap_dio_bio_end_io(struct bio *bio) > goto release_bio; > } > > - /* Read completion can always complete inline. */ > - if (!(dio->flags & IOMAP_DIO_WRITE)) { > + /* > + * Flagged with IOMAP_DIO_INLINE_COMP, we can complete it inline > + */ > + if (dio->flags & IOMAP_DIO_INLINE_COMP) { > WRITE_ONCE(iocb->private, NULL); > iomap_dio_complete_work(&dio->aio.work); > goto release_bio; > @@ -527,6 +530,9 @@ __iomap_dio_rw(struct kiocb *iocb, struct iov_iter *iter, > iomi.flags |= IOMAP_NOWAIT; > > if (iov_iter_rw(iter) == READ) { > + /* reads can always complete inline */ > + dio->flags |= IOMAP_DIO_INLINE_COMP; > + > if (iomi.pos >= dio->i_size) > goto out_free_dio; > > -- > 2.40.1 >