diff options
author | 2022-11-24 11:12:07 +0900 | |
---|---|---|
committer | 2022-11-24 06:29:36 -0700 | |
commit | 2820e5d0820ac4daedff1272616a53d9c7682fd2 (patch) | |
tree | 6f24d044342b01926d30faa1fb6e282a9db6c1ce /block/blk-ioprio.h | |
parent | blk-crypto: Add a missing include directive (diff) | |
download | linux-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