From: Dave Chinner <[email protected]>
To: Jens Axboe <[email protected]>
Cc: [email protected], [email protected], [email protected],
[email protected]
Subject: Re: [PATCH 8/8] iomap: support IOCB_DIO_DEFER
Date: Sat, 22 Jul 2023 08:05:36 +1000 [thread overview]
Message-ID: <ZLsBMGe/[email protected]> (raw)
In-Reply-To: <[email protected]>
On Thu, Jul 20, 2023 at 12:13:10PM -0600, Jens Axboe wrote:
> If IOCB_DIO_DEFER is set, utilize that to set kiocb->dio_complete handler
> and data for that callback. Rather than punt the completion to a
> workqueue, we pass back the handler and data to the issuer and will get a
> callback from a safe task context.
....
> @@ -288,12 +319,17 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
> * after IO completion such as unwritten extent conversion) and
> * the underlying device either supports FUA or doesn't have
> * a volatile write cache. This allows us to avoid cache flushes
> - * on IO completion.
> + * on IO completion. If we can't use stable writes and need to
> + * sync, disable in-task completions as dio completion will
> + * need to call generic_write_sync() which will do a blocking
> + * fsync / cache flush call.
> */
> if (!(iomap->flags & (IOMAP_F_SHARED|IOMAP_F_DIRTY)) &&
> (dio->flags & IOMAP_DIO_STABLE_WRITE) &&
> (bdev_fua(iomap->bdev) || !bdev_write_cache(iomap->bdev)))
> use_fua = true;
> + else if (dio->flags & IOMAP_DIO_NEED_SYNC)
> + dio->flags &= ~IOMAP_DIO_DEFER_COMP;
> }
>
> /*
> @@ -319,6 +355,13 @@ static loff_t iomap_dio_bio_iter(const struct iomap_iter *iter,
> pad = pos & (fs_block_size - 1);
> if (pad)
> iomap_dio_zero(iter, dio, pos - pad, pad);
> +
> + /*
> + * If need_zeroout is set, then this is a new or unwritten
> + * extent. These need extra handling at completion time, so
> + * disable in-task deferred completion for those.
> + */
> + dio->flags &= ~IOMAP_DIO_DEFER_COMP;
> }
I don't think these are quite right. They miss the file extension
case that I pointed out in an earlier patch (i.e. where IOCB_HIPRI
gets cleared).
Fundamentally, I don't like have three different sets of logic which
all end up being set/cleared for the same situation - polled bios
and defered completion should only be used in situations where
inline iomap completion can be run.
IOWs, I think the iomap_dio_bio_iter() code needs to first decide
whether IOMAP_DIO_INLINE_COMP can be set, and if it cannot be set,
we then clear both IOCB_HIPRI and IOMAP_DIO_DEFER_COMP, because
neither should be used for an IO that can not do inline completion.
i.e. this all comes down to something like this:
- /*
- * We can only poll for single bio I/Os.
- */
- if (need_zeroout ||
- ((dio->flags & IOMAP_DIO_WRITE) && pos >= i_size_read(inode)))
- dio->iocb->ki_flags &= ~IOCB_HIPRI;
+ /*
+ * We can only do inline completion for pure overwrites that
+ * don't require additional IO at completion. This rules out
+ * writes that need zeroing or extent conversion, extend
+ * the file size, or issue journal IO or cache flushes
+ * during completion processing.
+ */
+ if (need_zeroout ||
+ ((dio->flags & IOMAP_DIO_NEED_SYNC) && !use_fua) ||
+ ((dio->flags & IOMAP_DIO_WRITE) && pos >= i_size_read(inode)))
+ dio->flags &= ~IOMAP_DIO_INLINE_COMP;
+
+ /*
+ * We can only used polled for single bio IOs or defer
+ * completion for IOs that will run inline completion.
+ */
+ if (!(dio->flags & IOMAP_DIO_INLINE_COMP) {
+ dio->iocb->ki_flags &= ~IOCB_HIPRI;
+ dio->flags &= ~IOMAP_DIO_DEFER_COMP;
+ }
This puts the iomap inline completion decision logic all in one
place in the submission code and clearly keys the fast path IO
completion cases to the inline completion paths.
Cheers,
Dave.
--
Dave Chinner
[email protected]
next prev parent reply other threads:[~2023-07-21 22:05 UTC|newest]
Thread overview: 38+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-07-20 18:13 [PATCHSET v4 0/8] Improve async iomap DIO performance Jens Axboe
2023-07-20 18:13 ` [PATCH 1/8] iomap: cleanup up iomap_dio_bio_end_io() Jens Axboe
2023-07-21 6:14 ` Christoph Hellwig
2023-07-21 15:13 ` Darrick J. Wong
2023-07-20 18:13 ` [PATCH 2/8] iomap: add IOMAP_DIO_INLINE_COMP Jens Axboe
2023-07-21 6:14 ` Christoph Hellwig
2023-07-21 15:16 ` Darrick J. Wong
2023-07-20 18:13 ` [PATCH 3/8] iomap: treat a write through cache the same as FUA Jens Axboe
2023-07-21 6:15 ` Christoph Hellwig
2023-07-21 14:04 ` Jens Axboe
2023-07-21 15:55 ` Darrick J. Wong
2023-07-21 16:03 ` Jens Axboe
2023-07-20 18:13 ` [PATCH 4/8] iomap: completed polled IO inline Jens Axboe
2023-07-21 6:16 ` Christoph Hellwig
2023-07-21 15:19 ` Darrick J. Wong
2023-07-21 21:43 ` Dave Chinner
2023-07-22 3:10 ` Jens Axboe
2023-07-22 23:05 ` Dave Chinner
2023-07-24 22:35 ` Jens Axboe
2023-07-22 16:54 ` Jens Axboe
2023-07-20 18:13 ` [PATCH 5/8] iomap: only set iocb->private for polled bio Jens Axboe
2023-07-21 6:18 ` Christoph Hellwig
2023-07-21 15:35 ` Darrick J. Wong
2023-07-21 15:37 ` Jens Axboe
2023-07-20 18:13 ` [PATCH 6/8] fs: add IOCB flags related to passing back dio completions Jens Axboe
2023-07-21 6:18 ` Christoph Hellwig
2023-07-21 15:48 ` Darrick J. Wong
2023-07-21 15:53 ` Jens Axboe
2023-07-20 18:13 ` [PATCH 7/8] io_uring/rw: add write support for IOCB_DIO_DEFER Jens Axboe
2023-07-21 6:19 ` Christoph Hellwig
2023-07-21 15:50 ` Darrick J. Wong
2023-07-21 15:53 ` Jens Axboe
2023-07-20 18:13 ` [PATCH 8/8] iomap: support IOCB_DIO_DEFER Jens Axboe
2023-07-21 6:19 ` Christoph Hellwig
2023-07-21 16:01 ` Darrick J. Wong
2023-07-21 16:30 ` Jens Axboe
2023-07-21 22:05 ` Dave Chinner [this message]
2023-07-22 3:12 ` Jens Axboe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=ZLsBMGe/[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
[email protected] \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox