• Ming Lei's avatar
    blk-mq: avoid starving tag allocation after allocating process migrates · e6fc4649
    Ming Lei authored
    When the allocation process is scheduled back and the mapped hw queue is
    changed, fake one extra wake up on previous queue for compensating wake
    up miss, so other allocations on the previous queue won't be starved.
    
    This patch fixes one request allocation hang issue, which can be
    triggered easily in case of very low nr_request.
    
    The race is as follows:
    
    1) 2 hw queues, nr_requests are 2, and wake_batch is one
    
    2) there are 3 waiters on hw queue 0
    
    3) two in-flight requests in hw queue 0 are completed, and only two
       waiters of 3 are waken up because of wake_batch, but both the two
       waiters can be scheduled to another CPU and cause to switch to hw
       queue 1
    
    4) then the 3rd waiter will wait for ever, since no in-flight request
       is in hw queue 0 any more.
    
    5) this patch fixes it by the fake wakeup when waiter is scheduled to
       another hw queue
    
    Cc: <stable@vger.kernel.org>
    Reviewed-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarMing Lei <ming.lei@redhat.com>
    
    Modified commit message to make it clearer, and make it apply on
    top of the 4.18 branch.
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    e6fc4649
blk-mq-tag.c 11.6 KB