Skip to content

Commit 5e3d02b

Browse files
Ming Leiaxboe
authored andcommitted
blk-mq-sched: dispatch from scheduler IFF progress is made in ->dispatch
When the hw queue is busy, we shouldn't take requests from the scheduler queue any more, otherwise it is difficult to do IO merge. This patch fixes the awful IO performance on some SCSI devices(lpfc, qla2xxx, ...) when mq-deadline/kyber is used by not taking requests if hw queue is busy. Reviewed-by: Omar Sandoval <osandov@fb.com> Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
1 parent 0e7d3a8 commit 5e3d02b

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

block/blk-mq-sched.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ void blk_mq_sched_dispatch_requests(struct blk_mq_hw_ctx *hctx)
9494
struct request_queue *q = hctx->queue;
9595
struct elevator_queue *e = q->elevator;
9696
const bool has_sched_dispatch = e && e->type->ops.mq.dispatch_request;
97-
bool did_work = false;
97+
bool do_sched_dispatch = true;
9898
LIST_HEAD(rq_list);
9999

100100
/* RCU or SRCU read lock is needed before checking quiesced flag */
@@ -125,18 +125,18 @@ void blk_mq_sched_dispatch_requests(struct blk_mq_hw_ctx *hctx)
125125
*/
126126
if (!list_empty(&rq_list)) {
127127
blk_mq_sched_mark_restart_hctx(hctx);
128-
did_work = blk_mq_dispatch_rq_list(q, &rq_list);
128+
do_sched_dispatch = blk_mq_dispatch_rq_list(q, &rq_list);
129129
} else if (!has_sched_dispatch) {
130130
blk_mq_flush_busy_ctxs(hctx, &rq_list);
131131
blk_mq_dispatch_rq_list(q, &rq_list);
132132
}
133133

134134
/*
135-
* We want to dispatch from the scheduler if we had no work left
136-
* on the dispatch list, OR if we did have work but weren't able
137-
* to make progress.
135+
* We want to dispatch from the scheduler if there was nothing
136+
* on the dispatch list or we were able to dispatch from the
137+
* dispatch list.
138138
*/
139-
if (!did_work && has_sched_dispatch) {
139+
if (do_sched_dispatch && has_sched_dispatch) {
140140
do {
141141
struct request *rq;
142142

0 commit comments

Comments
 (0)