blk-mq-sched: alloate reserved tags out of normal pool
authorJens Axboe <axboe@fb.com>
Thu, 27 Apr 2017 13:45:46 +0000 (07:45 -0600)
committerJens Axboe <axboe@fb.com>
Thu, 27 Apr 2017 13:45:46 +0000 (07:45 -0600)
At least one driver, mtip32xx, has a hard coded dependency on
the value of the reserved tag used for internal commands. While
that should really be fixed up, for now let's ensure that we just
bypass the scheduler tags an allocation marked as reserved. They
are used for house keeping or error handling, so we can safely
ignore them in the scheduler.

Tested-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/blk-mq-sched.c

index e79e9f18d7c25885a70ec0c793e41125f0493ff3..8b361e192e8a910f2cbc8c374c8b960628b0006a 100644 (file)
@@ -82,7 +82,11 @@ struct request *blk_mq_sched_get_request(struct request_queue *q,
        if (likely(!data->hctx))
                data->hctx = blk_mq_map_queue(q, data->ctx->cpu);
 
-       if (e) {
+       /*
+        * For a reserved tag, allocate a normal request since we might
+        * have driver dependencies on the value of the internal tag.
+        */
+       if (e && !(data->flags & BLK_MQ_REQ_RESERVED)) {
                data->flags |= BLK_MQ_REQ_INTERNAL;
 
                /*