On Mon, 2017-03-13 at 09:48 -0600, Christoph Hellwig wrote: > @@ -1534,7 +1529,36 @@ static blk_qc_t blk_mq_make_request(struct request_queue *q, struct bio *bio) > } > > plug = current->plug; > - if (((plug && !blk_queue_nomerges(q)) || is_sync)) { > + if (plug && q->nr_hw_queues == 1) { > + struct request *last = NULL; > + > + blk_mq_bio_to_request(rq, bio); > + > + /* > + * @request_count may become stale because of schedule > + * out, so check the list again. > + */ The above comment was relevant as long as there was a request_count assignment above blk_mq_sched_get_request(). This patch moves that assignment inside if (plug && q->nr_hw_queues == 1). Does that mean that the above comment should be removed entirely? > + if (list_empty(&plug->mq_list)) > + request_count = 0; > + else if (blk_queue_nomerges(q)) > + request_count = blk_plug_queued_count(q); > + > + if (!request_count) > + trace_block_plug(q); > + else > + last = list_entry_rq(plug->mq_list.prev); > + > + blk_mq_put_ctx(data.ctx); > + > + if (request_count >= BLK_MAX_REQUEST_COUNT || (last && > + blk_rq_bytes(last) >= BLK_PLUG_FLUSH_SIZE)) { > + blk_flush_plug_list(plug, false); > + trace_block_plug(q); > + } > + > + list_add_tail(&rq->queuelist, &plug->mq_list); > + goto done; > + } else if (((plug && !blk_queue_nomerges(q)) || is_sync)) { > struct request *old_rq = NULL; > > blk_mq_bio_to_request(rq, bio); Bart.