From: Chengming Zhou <zhouchengming@xxxxxxxxxxxxx> Hello, This series optimize flush handling for non-postflush requests. Now we unconditionally replace rq->end_io to make rq return twice back to the flush state machine for post-flush. Obviously, non-postflush requests don't need it, they don't need to end request twice, so they don't need to replace rq->end_io callback. And the same for requests with the FUA bit on hardware with FUA support. The previous approach [1] we take is to move blk_rq_init_flush() to REQ_FSEQ_DATA stage and only replace rq->end_io if it needs post-flush. But this way add more magic to the already way too magic flush sequence. Christoph suggested that we can kill the flush sequence entirely, and just split the flush_queue into a preflush and a postflush queue. So this series implement the suggested approach that use two queues: preflush and postflush requests have separate pending list and running list, so we know what to do for each request in flush_end_io(), and we don't need the flush sequence entirely. Thanks for comments! [1] https://lore.kernel.org/lkml/20230710133308.GB23157@xxxxxx/ Chengming Zhou (4): blk-flush: flush_rq should inherit first_rq's cmd_flags blk-flush: split queues for preflush and postflush requests blk-flush: kill the flush state machine blk-flush: don't need to end rq twice for non postflush block/blk-flush.c | 181 +++++++++++++++++++++-------------------- block/blk.h | 3 +- include/linux/blk-mq.h | 1 - 3 files changed, 96 insertions(+), 89 deletions(-) -- 2.41.0