Message ID | 20220510131629.1964415-2-yukuai3@huawei.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | block, bfq: make bfq_has_work() more accurate | expand |
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@huawei.com> Looks good. Feel free to add: Reviewed-by: Jan Kara <jack@suse.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 >
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); } /*
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@huawei.com> --- block/bfq-iosched.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-)