• Ming Lei's avatar
    blk-mq: order adding requests to hctx->dispatch and checking SCHED_RESTART · 77064570
    Ming Lei authored
    commit d7d8535f upstream.
    
    SCHED_RESTART code path is relied to re-run queue for dispatch requests
    in hctx->dispatch. Meantime the SCHED_RSTART flag is checked when adding
    requests to hctx->dispatch.
    
    memory barriers have to be used for ordering the following two pair of OPs:
    
    1) adding requests to hctx->dispatch and checking SCHED_RESTART in
    blk_mq_dispatch_rq_list()
    
    2) clearing SCHED_RESTART and checking if there is request in hctx->dispatch
    in blk_mq_sched_restart().
    
    Without the added memory barrier, either:
    
    1) blk_mq_sched_restart() may miss requests added to hctx->dispatch meantime
    blk_mq_dispatch_rq_list() observes SCHED_RESTART, and not run queue in
    dispatch side
    
    or
    
    2) blk_mq_dispatch_rq_list still sees SCHED_RESTART, and not run queue
    in dispatch side, meantime checking if there is request in
    hctx->dispatch from blk_mq_sched_restart() is missed.
    
    IO hang in ltp/fs_fill test is reported by kernel test robot:
    
    	https://lkml.org/lkml/2020/7/26/77
    
    Turns out it is caused by the above out-of-order OPs. And the IO hang
    can't be observed any more after applying this patch.
    
    Fixes: bd166ef1 ("blk-mq-sched: add framework for MQ capable IO schedulers")
    Reported-by: default avatarkernel test robot <rong.a.chen@intel.com>
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Cc: Bart Van Assche <bvanassche@acm.org>
    Cc: Christoph Hellwig <hch@lst.de>
    Cc: David Jeffery <djeffery@redhat.com>
    Cc: <stable@vger.kernel.org>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    77064570
blk-mq.c 78.1 KB