• Josef Bacik's avatar
    rq-qos: fix missed wake-ups in rq_qos_throttle · 545fbd07
    Josef Bacik authored
    We saw a hang in production with WBT where there was only one waiter in
    the throttle path and no outstanding IO.  This is because of the
    has_sleepers optimization that is used to make sure we don't steal an
    inflight counter for new submitters when there are people already on the
    list.
    
    We can race with our check to see if the waitqueue has any waiters (this
    is done locklessly) and the time we actually add ourselves to the
    waitqueue.  If this happens we'll go to sleep and never be woken up
    because nobody is doing IO to wake us up.
    
    Fix this by checking if the waitqueue has a single sleeper on the list
    after we add ourselves, that way we have an uptodate view of the list.
    Reviewed-by: default avatarOleg Nesterov <oleg@redhat.com>
    Signed-off-by: default avatarJosef Bacik <josef@toxicpanda.com>
    Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
    545fbd07
blk-rq-qos.c 6.41 KB