• Omar Sandoval's avatar
    blk-mq: use sbq wait queues instead of restart for driver tags · da55f2cc
    Omar Sandoval authored
    Commit 50e1dab8 ("blk-mq-sched: fix starvation for multiple hardware
    queues and shared tags") fixed one starvation issue for shared tags.
    However, we can still get into a situation where we fail to allocate a
    tag because all tags are allocated but we don't have any pending
    requests on any hardware queue.
    
    One solution for this would be to restart all queues that share a tag
    map, but that really sucks. Ideally, we could just block and wait for a
    tag, but that isn't always possible from blk_mq_dispatch_rq_list().
    
    However, we can still use the struct sbitmap_queue wait queues with a
    custom callback instead of blocking. This has a few benefits:
    
    1. It avoids iterating over all hardware queues when completing an I/O,
       which the current restart code has to do.
    2. It benefits from the existing rolling wakeup code.
    3. It avoids punting to another thread just to have it block.
    Signed-off-by: default avatarOmar Sandoval <osandov@fb.com>
    Signed-off-by: default avatarJens Axboe <axboe@fb.com>
    da55f2cc
blk-mq.h 7.8 KB