On Thu, Jan 05, 2023 at 01:07:56PM +0900, Damien Le Moal wrote: > commit 2820e5d0820ac4daedff1272616a53d9c7682fd2 upstream. > > dd_finish_request() tests if the per prio fifo_list is not empty to > determine if request dispatching must be restarted for handling blocked > write requests to zoned devices with a call to > blk_mq_sched_mark_restart_hctx(). While simple, this implementation has > 2 problems: > > 1) Only the priority level of the completed request is considered. > However, writes to a zone may be blocked due to other writes to the > same zone using a different priority level. While this is unlikely to > happen in practice, as writing a zone with different IO priorirites > does not make sense, nothing in the code prevents this from > happening. > 2) The use of list_empty() is dangerous as dd_finish_request() does not > take dd->lock and may run concurrently with the insert and dispatch > code. > > Fix these 2 problems by testing the write fifo list of all priority > levels using the new helper dd_has_write_work(), and by testing each > fifo list using list_empty_careful(). > > Fixes: c807ab520fc3 ("block/mq-deadline: Add I/O priority support") > Cc: <stable@xxxxxxxxxxxxxxx> > Signed-off-by: Damien Le Moal <damien.lemoal@xxxxxxxxxxxxxxxxxx> > Reviewed-by: Johannes Thumshirn <johannes.thumshirn@xxxxxxx> > Link: https://lore.kernel.org/r/20221124021208.242541-2-damien.lemoal@xxxxxxxxxxxxxxxxxx > Signed-off-by: Jens Axboe <axboe@xxxxxxxxx> > --- > block/mq-deadline.c | 18 +++++++++++++++--- > 1 file changed, 15 insertions(+), 3 deletions(-) Now queued up, thanks. greg k-h