diff options
author | Yu Kuai <yukuai3@huawei.com> | 2022-05-13 10:35:06 +0800 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2022-11-10 15:47:22 +0100 |
commit | 79379ab3aeb351b24416ba5cf8e23be4046c2711 (patch) | |
tree | adbda7ed4cf9bde6af20c584b0eda1891bf2c4ad /block | |
parent | 999d99c8de09537bd4f4a4a7db2be6b55c6ed817 (diff) | |
download | linux-stable-79379ab3aeb351b24416ba5cf8e23be4046c2711.tar.gz linux-stable-79379ab3aeb351b24416ba5cf8e23be4046c2711.tar.bz2 linux-stable-79379ab3aeb351b24416ba5cf8e23be4046c2711.zip |
block, bfq: protect 'bfqd->queued' by 'bfqd->lock'
commit 181490d5321806e537dc5386db5ea640b826bf78 upstream.
If bfq_schedule_dispatch() is called from bfq_idle_slice_timer_body(),
then 'bfqd->queued' is read without holding 'bfqd->lock'. This is
wrong since it can be wrote concurrently.
Fix the problem by holding 'bfqd->lock' in such case.
Signed-off-by: Yu Kuai <yukuai3@huawei.com>
Reviewed-by: Jan Kara <jack@suse.cz>
Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
Link: https://lore.kernel.org/r/20220513023507.2625717-2-yukuai3@huawei.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Cc: Khazhy Kumykov <khazhy@chromium.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'block')
-rw-r--r-- | block/bfq-iosched.c | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c index f8c6b898f637..cc7fbd3f81f7 100644 --- a/block/bfq-iosched.c +++ b/block/bfq-iosched.c @@ -298,6 +298,8 @@ static struct bfq_io_cq *bfq_bic_lookup(struct bfq_data *bfqd, */ void bfq_schedule_dispatch(struct bfq_data *bfqd) { + lockdep_assert_held(&bfqd->lock); + if (bfqd->queued != 0) { bfq_log(bfqd, "schedule dispatch"); blk_mq_run_hw_queues(bfqd->queue, true); @@ -4584,8 +4586,8 @@ bfq_idle_slice_timer_body(struct bfq_data *bfqd, struct bfq_queue *bfqq) bfq_bfqq_expire(bfqd, bfqq, true, reason); schedule_dispatch: - spin_unlock_irqrestore(&bfqd->lock, flags); bfq_schedule_dispatch(bfqd); + spin_unlock_irqrestore(&bfqd->lock, flags); } /* |