diff options
author | Salman Qazi <sqazi@google.com> | 2020-04-24 18:03:21 +0300 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2020-04-24 18:16:56 +0300 |
commit | 28d65729b050977d8a9125e6726871e83bd22124 (patch) | |
tree | 7327602a47637499b372cf7e95c5a432c5ea6940 /block/blk-core.c | |
parent | 895d47759bdc4a8452e36ad3f7bc4324c9251932 (diff) | |
download | linux-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