]> git.baikalelectronics.ru Git - kernel.git/commit
blk-mq: don't queue more if we get a busy return
authorJens Axboe <axboe@kernel.dk>
Thu, 28 Jun 2018 17:54:01 +0000 (11:54 -0600)
committerJens Axboe <axboe@kernel.dk>
Fri, 29 Jun 2018 13:52:31 +0000 (07:52 -0600)
commit1789bac8efa8c62ded0a4f4c36dea029f6144810
tree43058155d51cacd8a255d2ddc5b0f53d28d76004
parente5d7c9c237d8ba137b73ffddecf8fa2aa0ac3171
blk-mq: don't queue more if we get a busy return

Some devices have different queue limits depending on the type of IO. A
classic case is SATA NCQ, where some commands can queue, but others
cannot. If we have NCQ commands inflight and encounter a non-queueable
command, the driver returns busy. Currently we attempt to dispatch more
from the scheduler, if we were able to queue some commands. But for the
case where we ended up stopping due to BUSY, we should not attempt to
retrieve more from the scheduler. If we do, we can get into a situation
where we attempt to queue a non-queueable command, get BUSY, then
successfully retrieve more commands from that scheduler and queue those.
This can repeat forever, starving the non-queuable command indefinitely.

Fix this by NOT attempting to pull more commands from the scheduler, if
we get a BUSY return. This should also be more optimal in terms of
letting requests stay in the scheduler for as long as possible, if we
get a BUSY due to the regular out-of-tags condition.

Reviewed-by: Omar Sandoval <osandov@fb.com>
Reviewed-by: Ming Lei <ming.lei@redhat.com>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
block/blk-mq.c