blk-mq: refactor request insertion/merging
authorJens Axboe <axboe@fb.com>
Wed, 30 Apr 2014 19:43:56 +0000 (13:43 -0600)
committerJens Axboe <axboe@fb.com>
Wed, 30 Apr 2014 19:43:56 +0000 (13:43 -0600)
Refactor the logic around adding a new bio to a software queue,
so we nest the ctx->lock where we really need it (merge and
insertion) and don't hold it when we don't (init and IO start
accounting).

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

index 77308a84dfb220c536023a45a681a87818ad04f1..ca51ee4aa4851cf7b9d235d498bd86accf970c98 100644 (file)
@@ -1037,17 +1037,25 @@ static void blk_mq_make_request(struct request_queue *q, struct bio *bio)
                }
        }
 
-       spin_lock(&ctx->lock);
+       if (!(hctx->flags & BLK_MQ_F_SHOULD_MERGE)) {
+               init_request_from_bio(rq, bio);
 
-       if ((hctx->flags & BLK_MQ_F_SHOULD_MERGE) &&
-           blk_mq_attempt_merge(q, ctx, bio))
-               __blk_mq_free_request(hctx, ctx, rq);
-       else {
-               blk_mq_bio_to_request(rq, bio);
+               spin_lock(&ctx->lock);
+insert_rq:
                __blk_mq_insert_request(hctx, rq, false);
+               spin_unlock(&ctx->lock);
+               blk_account_io_start(rq, 1);
+       } else {
+               spin_lock(&ctx->lock);
+               if (!blk_mq_attempt_merge(q, ctx, bio)) {
+                       init_request_from_bio(rq, bio);
+                       goto insert_rq;
+               }
+
+               spin_unlock(&ctx->lock);
+               __blk_mq_free_request(hctx, ctx, rq);
        }
 
-       spin_unlock(&ctx->lock);
 
        /*
         * For a SYNC request, send it to the hardware immediately. For an