blk-mq: add BLK_MQ_F_DEFER_ISSUE support flag
authorJens Axboe <axboe@fb.com>
Wed, 29 Oct 2014 17:18:26 +0000 (11:18 -0600)
committerJens Axboe <axboe@fb.com>
Wed, 29 Oct 2014 17:18:26 +0000 (11:18 -0600)
Drivers can now tell blk-mq if they take advantage of the deferred
issue through 'last' or not. If they do, don't do queue-direct
for sync IO. This is a preparation patch for the nvme conversion.

Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-mq.c
include/linux/blk-mq.h

index 7e5303820452a4af47a991a24179f3d8409fe359..b355b5957cd72518b7a196fd92f7c9c07a89678b 100644 (file)
@@ -1172,7 +1172,12 @@ static void blk_mq_make_request(struct request_queue *q, struct bio *bio)
                goto run_queue;
        }
 
-       if (is_sync) {
+       /*
+        * If the driver supports defer issued based on 'last', then
+        * queue it up like normal since we can potentially save some
+        * CPU this way.
+        */
+       if (is_sync && !(data.hctx->flags & BLK_MQ_F_DEFER_ISSUE)) {
                struct blk_mq_queue_data bd = {
                        .rq = rq,
                        .list = NULL,
index be01d7a687d4044ce74bd829d6a2cc6c983acc0f..c3b64ec5321e740f38d947c7538219f0b942bbf1 100644 (file)
@@ -146,6 +146,7 @@ enum {
        BLK_MQ_F_TAG_SHARED     = 1 << 1,
        BLK_MQ_F_SG_MERGE       = 1 << 2,
        BLK_MQ_F_SYSFS_UP       = 1 << 3,
+       BLK_MQ_F_DEFER_ISSUE    = 1 << 4,
 
        BLK_MQ_S_STOPPED        = 0,
        BLK_MQ_S_TAG_ACTIVE     = 1,