On Fri, Apr 07, 2023 at 04:58:13PM -0700, Bart Van Assche wrote: > + blk_mq_sched_insert_request(rq, /*at_head=*/true, false, false); The whole usage of at_head in the request_list-related code looks suspicious to me. All callers of blk_mq_add_to_requeue_list except for blk_kick_flush pass at_head=true. So the request_list is basically LIFO except for that one caller. blk_mq_requeue_work than does a HEAD insert for them, unless they are marked RQF_DONTPREP because the driver already did some setup. So except for the RQF_DONTPREP we basically revert the at_head insert. This all feels wrong to me. I think we need to get to a point where the request_list itself is always added to at the tail, processed head to tail, but inserted into the scheduler or the hctx rq_list before other pending requests, probaly using similar code as blk_mq_flush_plug_list / blk_mq_dispatch_plug_list.