diff options
author | Johannes Thumshirn <johannes.thumshirn@wdc.com> | 2020-03-25 00:24:44 +0900 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2020-12-30 11:50:54 +0100 |
commit | 4f3e3fa6239d52378e251382d84ab0932483e674 (patch) | |
tree | 21f630537b20cdcaa2fe2671295b1e9912f3e74b /block | |
parent | 9e54ca3d4f9d4a877e7539747a701c68c96b7eb8 (diff) | |
download | linux-stable-4f3e3fa6239d52378e251382d84ab0932483e674.tar.gz linux-stable-4f3e3fa6239d52378e251382d84ab0932483e674.tar.bz2 linux-stable-4f3e3fa6239d52378e251382d84ab0932483e674.zip |
block: factor out requeue handling from dispatch code
[ Upstream commit c92a41031a6d57395889b5c87cea359220a24d2a ]
Factor out the requeue handling from the dispatch code, this will make
subsequent addition of different requeueing schemes easier.
Signed-off-by: Johannes Thumshirn <johannes.thumshirn@wdc.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'block')
-rw-r--r-- | block/blk-mq.c | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/block/blk-mq.c b/block/blk-mq.c index b748d1e63f9c..c0efd3e278da 100644 --- a/block/blk-mq.c +++ b/block/blk-mq.c @@ -1205,6 +1205,23 @@ static void blk_mq_update_dispatch_busy(struct blk_mq_hw_ctx *hctx, bool busy) #define BLK_MQ_RESOURCE_DELAY 3 /* ms units */ +static void blk_mq_handle_dev_resource(struct request *rq, + struct list_head *list) +{ + struct request *next = + list_first_entry_or_null(list, struct request, queuelist); + + /* + * If an I/O scheduler has been configured and we got a driver tag for + * the next request already, free it. + */ + if (next) + blk_mq_put_driver_tag(next); + + list_add(&rq->queuelist, list); + __blk_mq_requeue_request(rq); +} + /* * Returns true if we did some work AND can potentially do more. */ @@ -1274,17 +1291,7 @@ bool blk_mq_dispatch_rq_list(struct request_queue *q, struct list_head *list, ret = q->mq_ops->queue_rq(hctx, &bd); if (ret == BLK_STS_RESOURCE || ret == BLK_STS_DEV_RESOURCE) { - /* - * If an I/O scheduler has been configured and we got a - * driver tag for the next request already, free it - * again. - */ - if (!list_empty(list)) { - nxt = list_first_entry(list, struct request, queuelist); - blk_mq_put_driver_tag(nxt); - } - list_add(&rq->queuelist, list); - __blk_mq_requeue_request(rq); + blk_mq_handle_dev_resource(rq, list); break; } |