• Jens Axboe's avatar
    blk-mq: don't queue more if we get a busy return · 1f57f8d4
    Jens Axboe authored
    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: default avatarOmar Sandoval <osandov@fb.com>
    Reviewed-by: default avatarMing Lei <ming.lei@redhat.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    1f57f8d4
blk-mq.c 74.2 KB