I remailed it with the changes since v1 added. But just to answer directly: Changes since v1: * Removed max_sched_batch. * Extended the fix to the software queue. * Use a return value from blk_mq_do_dispatch_sched to indicate if the dispatch should be rerun. * Some comments added. On Thu, Apr 23, 2020 at 2:30 PM Jens Axboe <axboe@xxxxxxxxx> wrote: > > On 4/23/20 3:05 PM, Salman Qazi wrote: > > 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. > > Any changes since v1? It's customary to put that in here too, below > the --- lines. > > -- > Jens Axboe >