lkml.org 
[lkml]   [2019]   [Oct]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH AUTOSEL 5.2 48/63] blk-mq: move lockdep_assert_held() into elevator_exit
    Date
    From: Ming Lei <ming.lei@redhat.com>

    [ Upstream commit 284b94be1925dbe035ce5218d8b5c197321262c7 ]

    Commit c48dac137a62 ("block: don't hold q->sysfs_lock in elevator_init_mq")
    removes q->sysfs_lock from elevator_init_mq(), but forgot to deal with
    lockdep_assert_held() called in blk_mq_sched_free_requests() which is
    run in failure path of elevator_init_mq().

    blk_mq_sched_free_requests() is called in the following 3 functions:

    elevator_init_mq()
    elevator_exit()
    blk_cleanup_queue()

    In blk_cleanup_queue(), blk_mq_sched_free_requests() is followed exactly
    by 'mutex_lock(&q->sysfs_lock)'.

    So moving the lockdep_assert_held() from blk_mq_sched_free_requests()
    into elevator_exit() for fixing the report by syzbot.

    Reported-by: syzbot+da3b7677bb913dc1b737@syzkaller.appspotmail.com
    Fixed: c48dac137a62 ("block: don't hold q->sysfs_lock in elevator_init_mq")
    Reviewed-by: Bart Van Assche <bvanassche@acm.org>
    Reviewed-by: Damien Le Moal <damien.lemoal@wdc.com>
    Signed-off-by: Ming Lei <ming.lei@redhat.com>
    Signed-off-by: Jens Axboe <axboe@kernel.dk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    block/blk-mq-sched.c | 2 --
    block/blk.h | 2 ++
    2 files changed, 2 insertions(+), 2 deletions(-)

    diff --git a/block/blk-mq-sched.c b/block/blk-mq-sched.c
    index 2766066a15dbf..3cf555f127006 100644
    --- a/block/blk-mq-sched.c
    +++ b/block/blk-mq-sched.c
    @@ -554,8 +554,6 @@ void blk_mq_sched_free_requests(struct request_queue *q)
    struct blk_mq_hw_ctx *hctx;
    int i;

    - lockdep_assert_held(&q->sysfs_lock);
    -
    queue_for_each_hw_ctx(q, hctx, i) {
    if (hctx->sched_tags)
    blk_mq_free_rqs(q->tag_set, hctx->sched_tags, i);
    diff --git a/block/blk.h b/block/blk.h
    index 7814aa207153c..38938125ab729 100644
    --- a/block/blk.h
    +++ b/block/blk.h
    @@ -184,6 +184,8 @@ void elv_unregister_queue(struct request_queue *q);
    static inline void elevator_exit(struct request_queue *q,
    struct elevator_queue *e)
    {
    + lockdep_assert_held(&q->sysfs_lock);
    +
    blk_mq_sched_free_requests(q);
    __elevator_exit(q, e);
    }
    --
    2.20.1
    \
     
     \ /
      Last update: 2019-10-01 18:43    [W:7.937 / U:0.064 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site