lkml.org 
[lkml]   [2019]   [Aug]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.2 102/162] block, bfq: handle NULL return value by bfq_init_rq()
    Date
    [ Upstream commit fd03177c33b287c6541f4048f1d67b7b45a1abc9 ]

    As reported in [1], the call bfq_init_rq(rq) may return NULL in case
    of OOM (in particular, if rq->elv.icq is NULL because memory
    allocation failed in failed in ioc_create_icq()).

    This commit handles this circumstance.

    [1] https://lkml.org/lkml/2019/7/22/824

    Cc: Hsin-Yi Wang <hsinyi@google.com>
    Cc: Nicolas Boichat <drinkcat@chromium.org>
    Cc: Doug Anderson <dianders@chromium.org>
    Reported-by: Guenter Roeck <linux@roeck-us.net>
    Reported-by: Hsin-Yi Wang <hsinyi@google.com>
    Reviewed-by: Guenter Roeck <linux@roeck-us.net>
    Signed-off-by: Paolo Valente <paolo.valente@linaro.org>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    block/bfq-iosched.c | 14 +++++++++++---
    1 file changed, 11 insertions(+), 3 deletions(-)

    diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
    index 404e776aa36d0..b528710364e9e 100644
    --- a/block/bfq-iosched.c
    +++ b/block/bfq-iosched.c
    @@ -2085,9 +2085,14 @@ static void bfq_request_merged(struct request_queue *q, struct request *req,
    blk_rq_pos(container_of(rb_prev(&req->rb_node),
    struct request, rb_node))) {
    struct bfq_queue *bfqq = bfq_init_rq(req);
    - struct bfq_data *bfqd = bfqq->bfqd;
    + struct bfq_data *bfqd;
    struct request *prev, *next_rq;

    + if (!bfqq)
    + return;
    +
    + bfqd = bfqq->bfqd;
    +
    /* Reposition request in its sort_list */
    elv_rb_del(&bfqq->sort_list, req);
    elv_rb_add(&bfqq->sort_list, req);
    @@ -2134,6 +2139,9 @@ static void bfq_requests_merged(struct request_queue *q, struct request *rq,
    struct bfq_queue *bfqq = bfq_init_rq(rq),
    *next_bfqq = bfq_init_rq(next);

    + if (!bfqq)
    + return;
    +
    /*
    * If next and rq belong to the same bfq_queue and next is older
    * than rq, then reposition rq in the fifo (by substituting next
    @@ -5061,12 +5069,12 @@ static void bfq_insert_request(struct blk_mq_hw_ctx *hctx, struct request *rq,

    spin_lock_irq(&bfqd->lock);
    bfqq = bfq_init_rq(rq);
    - if (at_head || blk_rq_is_passthrough(rq)) {
    + if (!bfqq || at_head || blk_rq_is_passthrough(rq)) {
    if (at_head)
    list_add(&rq->queuelist, &bfqd->dispatch);
    else
    list_add_tail(&rq->queuelist, &bfqd->dispatch);
    - } else { /* bfqq is assumed to be non null here */
    + } else {
    idle_timer_disabled = __bfq_insert_request(bfqd, rq);
    /*
    * Update bfqq, because, if a queue merge has occurred
    --
    2.20.1


    \
     
     \ /
      Last update: 2019-08-27 10:04    [W:4.964 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site