@@ -477,9 +477,9 @@ static void __blk_mq_free_request(struct request *rq)
477477 blk_pm_mark_last_busy (rq );
478478 rq -> mq_hctx = NULL ;
479479 if (rq -> tag != -1 )
480- blk_mq_put_tag (hctx , hctx -> tags , ctx , rq -> tag );
480+ blk_mq_put_tag (hctx -> tags , ctx , rq -> tag );
481481 if (sched_tag != -1 )
482- blk_mq_put_tag (hctx , hctx -> sched_tags , ctx , sched_tag );
482+ blk_mq_put_tag (hctx -> sched_tags , ctx , sched_tag );
483483 blk_mq_sched_restart (hctx );
484484 blk_queue_exit (q );
485485}
@@ -735,7 +735,7 @@ static void blk_mq_requeue_work(struct work_struct *work)
735735 * merge.
736736 */
737737 if (rq -> rq_flags & RQF_DONTPREP )
738- blk_mq_request_bypass_insert (rq , false);
738+ blk_mq_request_bypass_insert (rq , false, false );
739739 else
740740 blk_mq_sched_insert_request (rq , true, false, false);
741741 }
@@ -1286,7 +1286,7 @@ bool blk_mq_dispatch_rq_list(struct request_queue *q, struct list_head *list,
12861286 q -> mq_ops -> commit_rqs (hctx );
12871287
12881288 spin_lock (& hctx -> lock );
1289- list_splice_init (list , & hctx -> dispatch );
1289+ list_splice_tail_init (list , & hctx -> dispatch );
12901290 spin_unlock (& hctx -> lock );
12911291
12921292 /*
@@ -1677,12 +1677,16 @@ void __blk_mq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,
16771677 * Should only be used carefully, when the caller knows we want to
16781678 * bypass a potential IO scheduler on the target device.
16791679 */
1680- void blk_mq_request_bypass_insert (struct request * rq , bool run_queue )
1680+ void blk_mq_request_bypass_insert (struct request * rq , bool at_head ,
1681+ bool run_queue )
16811682{
16821683 struct blk_mq_hw_ctx * hctx = rq -> mq_hctx ;
16831684
16841685 spin_lock (& hctx -> lock );
1685- list_add_tail (& rq -> queuelist , & hctx -> dispatch );
1686+ if (at_head )
1687+ list_add (& rq -> queuelist , & hctx -> dispatch );
1688+ else
1689+ list_add_tail (& rq -> queuelist , & hctx -> dispatch );
16861690 spin_unlock (& hctx -> lock );
16871691
16881692 if (run_queue )
@@ -1849,7 +1853,7 @@ static blk_status_t __blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
18491853 if (bypass_insert )
18501854 return BLK_STS_RESOURCE ;
18511855
1852- blk_mq_request_bypass_insert (rq , run_queue );
1856+ blk_mq_request_bypass_insert (rq , false, run_queue );
18531857 return BLK_STS_OK ;
18541858}
18551859
@@ -1876,7 +1880,7 @@ static void blk_mq_try_issue_directly(struct blk_mq_hw_ctx *hctx,
18761880
18771881 ret = __blk_mq_try_issue_directly (hctx , rq , cookie , false, true);
18781882 if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE )
1879- blk_mq_request_bypass_insert (rq , true);
1883+ blk_mq_request_bypass_insert (rq , false, true);
18801884 else if (ret != BLK_STS_OK )
18811885 blk_mq_end_request (rq , ret );
18821886
@@ -1910,7 +1914,7 @@ void blk_mq_try_issue_list_directly(struct blk_mq_hw_ctx *hctx,
19101914 if (ret != BLK_STS_OK ) {
19111915 if (ret == BLK_STS_RESOURCE ||
19121916 ret == BLK_STS_DEV_RESOURCE ) {
1913- blk_mq_request_bypass_insert (rq ,
1917+ blk_mq_request_bypass_insert (rq , false,
19141918 list_empty (list ));
19151919 break ;
19161920 }
@@ -3398,7 +3402,6 @@ static void blk_mq_poll_stats_fn(struct blk_stat_callback *cb)
33983402}
33993403
34003404static unsigned long blk_mq_poll_nsecs (struct request_queue * q ,
3401- struct blk_mq_hw_ctx * hctx ,
34023405 struct request * rq )
34033406{
34043407 unsigned long ret = 0 ;
@@ -3431,7 +3434,6 @@ static unsigned long blk_mq_poll_nsecs(struct request_queue *q,
34313434}
34323435
34333436static bool blk_mq_poll_hybrid_sleep (struct request_queue * q ,
3434- struct blk_mq_hw_ctx * hctx ,
34353437 struct request * rq )
34363438{
34373439 struct hrtimer_sleeper hs ;
@@ -3451,7 +3453,7 @@ static bool blk_mq_poll_hybrid_sleep(struct request_queue *q,
34513453 if (q -> poll_nsec > 0 )
34523454 nsecs = q -> poll_nsec ;
34533455 else
3454- nsecs = blk_mq_poll_nsecs (q , hctx , rq );
3456+ nsecs = blk_mq_poll_nsecs (q , rq );
34553457
34563458 if (!nsecs )
34573459 return false;
@@ -3506,7 +3508,7 @@ static bool blk_mq_poll_hybrid(struct request_queue *q,
35063508 return false;
35073509 }
35083510
3509- return blk_mq_poll_hybrid_sleep (q , hctx , rq );
3511+ return blk_mq_poll_hybrid_sleep (q , rq );
35103512}
35113513
35123514/**
0 commit comments