• J
    block: Do not pull requests from the scheduler when we cannot dispatch them · 61347154
    Jan Kara 提交于
    Provided the device driver does not implement dispatch budget accounting
    (which only SCSI does) the loop in __blk_mq_do_dispatch_sched() pulls
    requests from the IO scheduler as long as it is willing to give out any.
    That defeats scheduling heuristics inside the scheduler by creating
    false impression that the device can take more IO when it in fact
    cannot.
    
    For example with BFQ IO scheduler on top of virtio-blk device setting
    blkio cgroup weight has barely any impact on observed throughput of
    async IO because __blk_mq_do_dispatch_sched() always sucks out all the
    IO queued in BFQ. BFQ first submits IO from higher weight cgroups but
    when that is all dispatched, it will give out IO of lower weight cgroups
    as well. And then we have to wait for all this IO to be dispatched to
    the disk (which means lot of it actually has to complete) before the
    IO scheduler is queried again for dispatching more requests. This
    completely destroys any service differentiation.
    
    So grab request tag for a request pulled out of the IO scheduler already
    in __blk_mq_do_dispatch_sched() and do not pull any more requests if we
    cannot get it because we are unlikely to be able to dispatch it. That
    way only single request is going to wait in the dispatch list for some
    tag to free.
    Reviewed-by: NMing Lei <ming.lei@redhat.com>
    Signed-off-by: NJan Kara <jack@suse.cz>
    Link: https://lore.kernel.org/r/20210603104721.6309-1-jack@suse.czSigned-off-by: NJens Axboe <axboe@kernel.dk>
    61347154
blk-mq.h 9.8 KB