[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <20220511135227.lawvrlrajtyszwfb@quack3.lan>
Date: Wed, 11 May 2022 15:52:27 +0200
From: Jan Kara <jack@...e.cz>
To: Yu Kuai <yukuai3@...wei.com>
Cc: jack@...e.cz, paolo.valente@...aro.org, axboe@...nel.dk,
linux-block@...r.kernel.org, linux-kernel@...r.kernel.org,
yi.zhang@...wei.com
Subject: Re: [PATCH -next 1/2] block, bfq: protect 'bfqd->queued' by
'bfqd->lock'
On Tue 10-05-22 21:16:28, Yu Kuai wrote:
> 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' for bfq_schedule_dispatch(),
> like everywhere else.
>
> Signed-off-by: Yu Kuai <yukuai3@...wei.com>
Looks good. Feel free to add:
Reviewed-by: Jan Kara <jack@...e.cz>
Honza
> ---
> block/bfq-iosched.c | 4 +++-
> 1 file changed, 3 insertions(+), 1 deletion(-)
>
> diff --git a/block/bfq-iosched.c b/block/bfq-iosched.c
> index 272d48d8f326..61750696e87f 100644
> --- a/block/bfq-iosched.c
> +++ b/block/bfq-iosched.c
> @@ -456,6 +456,8 @@ static struct bfq_io_cq *bfq_bic_lookup(struct request_queue *q)
> */
> 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);
> @@ -6898,8 +6900,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);
> }
>
> /*
> --
> 2.31.1
>
--
Jan Kara <jack@...e.com>
SUSE Labs, CR
Powered by blists - more mailing lists