• Damien Le Moal's avatar
    block: mq-deadline: Fix dd_finish_request() for zoned devices · 2820e5d0
    Damien Le Moal authored
    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: c807ab52 ("block/mq-deadline: Add I/O priority support")
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarDamien Le Moal <damien.lemoal@opensource.wdc.com>
    Reviewed-by: default avatarJohannes Thumshirn <johannes.thumshirn@wdc.com>
    Link: https://lore.kernel.org/r/20221124021208.242541-2-damien.lemoal@opensource.wdc.comSigned-off-by: default avatarJens Axboe <axboe@kernel.dk>
    2820e5d0
mq-deadline.c 32 KB