aboutsummaryrefslogtreecommitdiff
path: root/block/blk-ioprio.h
diff options
context:
space:
mode:
authorGravatar Damien Le Moal <damien.lemoal@opensource.wdc.com> 2022-11-24 11:12:07 +0900
committerGravatar Jens Axboe <axboe@kernel.dk> 2022-11-24 06:29:36 -0700
commit2820e5d0820ac4daedff1272616a53d9c7682fd2 (patch)
tree6f24d044342b01926d30faa1fb6e282a9db6c1ce /block/blk-ioprio.h
parentblk-crypto: Add a missing include directive (diff)
downloadlinux-2820e5d0820ac4daedff1272616a53d9c7682fd2.tar.gz
linux-2820e5d0820ac4daedff1272616a53d9c7682fd2.tar.bz2
linux-2820e5d0820ac4daedff1272616a53d9c7682fd2.zip
block: mq-deadline: Fix dd_finish_request() for zoned devices
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@vger.kernel.org> Signed-off-by: Damien Le Moal <damien.lemoal@opensource.wdc.com> Reviewed-by: Johannes Thumshirn <johannes.thumshirn@wdc.com> Link: https://lore.kernel.org/r/20221124021208.242541-2-damien.lemoal@opensource.wdc.com Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-ioprio.h')
0 files changed, 0 insertions, 0 deletions