lkml.org 
[lkml]   [2020]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 063/346] block: factor out requeue handling from dispatch code
    Date
    From: Johannes Thumshirn <johannes.thumshirn@wdc.com>

    [ 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>
    ---
    block/blk-mq.c | 29 ++++++++++++++++++-----------
    1 file changed, 18 insertions(+), 11 deletions(-)

    diff --git a/block/blk-mq.c b/block/blk-mq.c
    index db2db0b70d34f..0df43515ff949 100644
    --- a/block/blk-mq.c
    +++ b/block/blk-mq.c
    @@ -1118,6 +1118,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.
    */
    @@ -1185,17 +1202,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;
    }

    --
    2.27.0


    \
     
     \ /
      Last update: 2020-12-28 14:24    [W:4.885 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site