diff options
author | Ming Lei <ming.lei@redhat.com> | 2017-10-14 17:22:30 +0800 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2017-11-01 08:20:02 -0600 |
commit | b347689ffbca745ac457ee27400ce1affd571c6f (patch) | |
tree | 44edb581ccc8c51915efa957300f9814b7044dc2 /include/linux/blk-mq.h | |
parent | de1482974080ec9ef414bf048b2646b246b63f6e (diff) | |
download | linux-stable-b347689ffbca745ac457ee27400ce1affd571c6f.tar.gz linux-stable-b347689ffbca745ac457ee27400ce1affd571c6f.tar.bz2 linux-stable-b347689ffbca745ac457ee27400ce1affd571c6f.zip |
blk-mq-sched: improve dispatching from sw queue
SCSI devices use host-wide tagset, and the shared driver tag space is
often quite big. However, there is also a queue depth for each lun(
.cmd_per_lun), which is often small, for example, on both lpfc and
qla2xxx, .cmd_per_lun is just 3.
So lots of requests may stay in sw queue, and we always flush all
belonging to same hw queue and dispatch them all to driver.
Unfortunately it is easy to cause queue busy because of the small
.cmd_per_lun. Once these requests are flushed out, they have to stay in
hctx->dispatch, and no bio merge can happen on these requests, and
sequential IO performance is harmed.
This patch introduces blk_mq_dequeue_from_ctx for dequeuing a request
from a sw queue, so that we can dispatch them in scheduler's way. We can
then avoid dequeueing too many requests from sw queue, since we don't
flush ->dispatch completely.
This patch improves dispatching from sw queue by using the .get_budget
and .put_budget callbacks.
Reviewed-by: Omar Sandoval <osandov@fb.com>
Signed-off-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'include/linux/blk-mq.h')
-rw-r--r-- | include/linux/blk-mq.h | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/include/linux/blk-mq.h b/include/linux/blk-mq.h index 901457df3d64..e5e6becd57d3 100644 --- a/include/linux/blk-mq.h +++ b/include/linux/blk-mq.h @@ -30,6 +30,8 @@ struct blk_mq_hw_ctx { struct sbitmap ctx_map; + struct blk_mq_ctx *dispatch_from; + struct blk_mq_ctx **ctxs; unsigned int nr_ctx; |