summaryrefslogtreecommitdiff
path: root/block/blk-core.c
diff options
context:
space:
mode:
authorSalman Qazi <sqazi@google.com>2020-04-24 18:03:21 +0300
committerJens Axboe <axboe@kernel.dk>2020-04-24 18:16:56 +0300
commit28d65729b050977d8a9125e6726871e83bd22124 (patch)
tree7327602a47637499b372cf7e95c5a432c5ea6940 /block/blk-core.c
parent895d47759bdc4a8452e36ad3f7bc4324c9251932 (diff)
downloadlinux-28d65729b050977d8a9125e6726871e83bd22124.tar.xz
block: Limit number of items taken from the I/O scheduler in one go
Flushes bypass the I/O scheduler and get added to hctx->dispatch in blk_mq_sched_bypass_insert. This can happen while a kworker is running hctx->run_work work item and is past the point in blk_mq_sched_dispatch_requests where hctx->dispatch is checked. The blk_mq_do_dispatch_sched call is not guaranteed to end in bounded time, because the I/O scheduler can feed an arbitrary number of commands. Since we have only one hctx->run_work, the commands waiting in hctx->dispatch will wait an arbitrary length of time for run_work to be rerun. A similar phenomenon exists with dispatches from the software queue. The solution is to poll hctx->dispatch in blk_mq_do_dispatch_sched and blk_mq_do_dispatch_ctx and return from the run_work handler and let it rerun. Signed-off-by: Salman Qazi <sqazi@google.com> Reviewed-by: Ming Lei <ming.lei@redhat.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
Diffstat (limited to 'block/blk-core.c')
0 files changed, 0 insertions, 0 deletions