lkml.org 
[lkml]   [2018]   [Sep]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.14 032/126] blk-mq: fix updating tags depth
    Date
    4.14-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Ming Lei <ming.lei@redhat.com>

    [ Upstream commit 75d6e175fc511e95ae3eb8f708680133bc211ed3 ]

    The passed 'nr' from userspace represents the total depth, meantime
    inside 'struct blk_mq_tags', 'nr_tags' stores the total tag depth,
    and 'nr_reserved_tags' stores the reserved part.

    There are two issues in blk_mq_tag_update_depth() now:

    1) for growing tags, we should have used the passed 'nr', and keep the
    number of reserved tags not changed.

    2) the passed 'nr' should have been used for checking against
    'tags->nr_tags', instead of number of the normal part.

    This patch fixes the above two cases, and avoids kernel crash caused
    by wrong resizing sbitmap queue.

    Cc: "Ewan D. Milne" <emilne@redhat.com>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: Bart Van Assche <bart.vanassche@sandisk.com>
    Cc: Omar Sandoval <osandov@fb.com>
    Tested by: Marco Patalano <mpatalan@redhat.com>
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <alexander.levin@microsoft.com>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    block/blk-mq-tag.c | 8 ++++----
    1 file changed, 4 insertions(+), 4 deletions(-)

    --- a/block/blk-mq-tag.c
    +++ b/block/blk-mq-tag.c
    @@ -416,8 +416,6 @@ int blk_mq_tag_update_depth(struct blk_m
    if (tdepth <= tags->nr_reserved_tags)
    return -EINVAL;

    - tdepth -= tags->nr_reserved_tags;
    -
    /*
    * If we are allowed to grow beyond the original size, allocate
    * a new set of tags before freeing the old one.
    @@ -437,7 +435,8 @@ int blk_mq_tag_update_depth(struct blk_m
    if (tdepth > 16 * BLKDEV_MAX_RQ)
    return -EINVAL;

    - new = blk_mq_alloc_rq_map(set, hctx->queue_num, tdepth, 0);
    + new = blk_mq_alloc_rq_map(set, hctx->queue_num, tdepth,
    + tags->nr_reserved_tags);
    if (!new)
    return -ENOMEM;
    ret = blk_mq_alloc_rqs(set, new, hctx->queue_num, tdepth);
    @@ -454,7 +453,8 @@ int blk_mq_tag_update_depth(struct blk_m
    * Don't need (or can't) update reserved tags here, they
    * remain static and should never need resizing.
    */
    - sbitmap_queue_resize(&tags->bitmap_tags, tdepth);
    + sbitmap_queue_resize(&tags->bitmap_tags,
    + tdepth - tags->nr_reserved_tags);
    }

    return 0;

    \
     
     \ /
      Last update: 2018-09-18 01:30    [W:4.189 / U:0.060 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site