It's useless to do bfq_init_rq(rq), if the rq can do merge first. In the patch 5f550ede5edf8, it moved to bfq_init_rq() before blk_mq_sched_try_insert_merge(), but it's pointless, as the fifo_time of next is not set yet, and !list_empty(&next->queuelist) is 0, so it does not need to reposition rq's fifo_time. And for the "hash lookup, try again" situation, as follow, bfq_requests_merged() call can work normally. blk_mq_sched_try_insert_merge elv_attempt_insert_merge elv_rqhash_find Signed-off-by: Yuwei Guan <Yuwei.Guan@xxxxxxxxxxxxx> --- block/bfq-iosched.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index 7ea427817f7f..9845370a701c 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c @@ -6147,7 +6147,7 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq, bfqg_stats_update_legacy_io(q, rq); #endif spin_lock_irq(&bfqd->lock); - bfqq = bfq_init_rq(rq); + if (blk_mq_sched_try_insert_merge(q, rq, &free)) { spin_unlock_irq(&bfqd->lock); blk_mq_free_requests(&free); @@ -6156,6 +6156,7 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq, trace_block_rq_insert(rq); + bfqq = bfq_init_rq(rq); if (!bfqq || at_head) { if (at_head) list_add(&rq->queuelist, &bfqd->dispatch); -- 2.34.1