On 02/17/2017 06:05 PM, Omar Sandoval wrote: > From: Omar Sandoval <osandov@xxxxxx> > > Commit 50e1dab86aa2 ("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. This is a great and innovative solution to this problem, it's much better than stacked restart bits. Thanks Omar, I'll queue this up for testing. -- Jens Axboe