On Mon, Jul 10, 2023 at 02:47:05PM +0800, chengming.zhou@xxxxxxxxx wrote: > From: Chengming Zhou <zhouchengming@xxxxxxxxxxxxx> > > Now we unconditionally blk_rq_init_flush() to replace rq->end_io to > make rq return twice back to the flush state machine for post-flush. > > Obviously, non post-flush 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. > > So we move blk_rq_init_flush() to REQ_FSEQ_DATA stage and only replace > rq->end_io if it needs post-flush. Otherwise, it can end like normal > request and doesn't need to return back to the flush state machine. I really like the idea behind this optimization, but I kinda hate adding more magic to the already way too magic flush sequence. I wonder if a better idea would be to kill the flush sequence entirely, and just split the flush_queue into a preflush and a postflush queue. This would remove a field from struct request and lead to more readable code as well.