blk-mq: pass correct hctx to blk_mq_try_issue_directly
authorMing Lei <ming.lei@redhat.com>
Tue, 6 Jun 2017 15:21:59 +0000 (23:21 +0800)
committerJens Axboe <axboe@fb.com>
Tue, 6 Jun 2017 16:00:33 +0000 (10:00 -0600)
When direct issue is done on request picked up from plug list,
the hctx need to be updated with the actual hw queue, otherwise
wrong hctx is used and may hurt performance, especially when
wrong SRCU readlock is acquired/released

Reported-by: Bart Van Assche <bart.vanassche@sandisk.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-mq.c

index 1bcccedcc74f0b48f58363640acb1eae04704800..4ddfa019face15ae45a7ae7beb9cb4943e658bfc 100644 (file)
@@ -1619,9 +1619,12 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio)
 
                blk_mq_put_ctx(data.ctx);
 
-               if (same_queue_rq)
+               if (same_queue_rq) {
+                       data.hctx = blk_mq_map_queue(q,
+                                       same_queue_rq->mq_ctx->cpu);
                        blk_mq_try_issue_directly(data.hctx, same_queue_rq,
                                        &cookie);
+               }
        } else if (q->nr_hw_queues > 1 && is_sync) {
                blk_mq_put_ctx(data.ctx);
                blk_mq_bio_to_request(rq, bio);