• Ming Lei's avatar
    blk-mq: introduce blk_mq_complete_request_sync() · 1b8f21b7
    Ming Lei authored
    
    
    In NVMe's error handler, follows the typical steps of tearing down
    hardware for recovering controller:
    
    1) stop blk_mq hw queues
    2) stop the real hw queues
    3) cancel in-flight requests via
    	blk_mq_tagset_busy_iter(tags, cancel_request, ...)
    cancel_request():
    	mark the request as abort
    	blk_mq_complete_request(req);
    4) destroy real hw queues
    
    However, there may be race between #3 and #4, because blk_mq_complete_request()
    may run q->mq_ops->complete(rq) remotelly and asynchronously, and
    ->complete(rq) may be run after #4.
    
    This patch introduces blk_mq_complete_request_sync() for fixing the
    above race.
    
    Cc: Sagi Grimberg <sagi@grimberg.me>
    Cc: Bart Van Assche <bvanassche@acm.org>
    Cc: James Smart <james.smart@broadcom.com>
    Cc: linux-nvme@lists.infradead.org
    Reviewed-by: default avatarKeith Busch <keith.busch@intel.com>
    Reviewed-by: default avatarChristoph Hellwig <hch@lst.de>
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    1b8f21b7