On 11/28/18 12:26 AM, Christoph Hellwig wrote: >> + } else if (plug && q->mq_ops->commit_rqs) { >> + /* >> + * If we have a ->commit_rqs(), then we know the driver can >> + * batch submission doorbell updates. Add rq to plug list, >> + * and flush if we exceed the plug count only. >> + */ >> + blk_mq_bio_to_request(rq, bio); >> + blk_mq_put_ctx(data.ctx); >> + >> + /* >> + * If we have requests for more than one queue here, we >> + * should sort the list when it's flushed. >> + */ >> + if (!plug->do_sort && !list_empty(&plug->mq_list)) { >> + same_queue_rq = list_first_entry(&plug->mq_list, >> + struct request, queuelist); >> + if (same_queue_rq->q != q) >> + plug->do_sort = true; >> + } >> + >> + list_add_tail(&rq->queuelist, &plug->mq_list); >> + plug->rq_count++; >> + if (plug->rq_count >= BLK_MAX_REQUEST_COUNT) { >> + blk_flush_plug_list(plug, false); >> + trace_block_plug(q); >> + } > > This seems like a slight variation of the the single queue plug > case. Can we share the code instead of having slightly differing > logic? I'll see if I can fold them. > Also that should this respect blk_queue_nomerges? It doesn't do any merging at all, it's just batching for the list inserts. In terms of plug merging, if nomerges isn't true, then we would have done that further up. -- Jens Axboe