blk-mq: immediately dispatch big size request
authorShaohua Li <shli@fb.com>
Fri, 4 Nov 2016 00:03:54 +0000 (17:03 -0700)
committerJens Axboe <axboe@fb.com>
Fri, 4 Nov 2016 04:00:38 +0000 (22:00 -0600)
This is corresponding part for blk-mq. Disk with multiple hardware
queues doesn't need this as we only hold 1 request at most.

Signed-off-by: Shaohua Li <shli@fb.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-mq.c

index 8d3de5bd4d6f937c695f5ce8e456907c2e4cb045..077c2416a9556549ad035f2d4af5b852958edbd0 100644 (file)
@@ -1453,13 +1453,18 @@ static blk_qc_t blk_sq_make_request(struct request_queue *q, struct bio *bio)
         */
        plug = current->plug;
        if (plug) {
+               struct request *last = NULL;
+
                blk_mq_bio_to_request(rq, bio);
                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) {
+               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);
                }