blk-mq: avoid starving tag allocation after allocating process migrates
authorMing Lei <ming.lei@redhat.com>
Thu, 24 May 2018 17:00:39 +0000 (11:00 -0600)
committerJens Axboe <axboe@kernel.dk>
Thu, 24 May 2018 17:00:39 +0000 (11:00 -0600)
commite6fc46498784e799d3eb95d83079180e413c4e7d
tree63876dd6517d7d170d90d71441392ebdcdff3ea6
parentf183464684190bacbfb14623bd3e4e51b7575b4c
blk-mq: avoid starving tag allocation after allocating process migrates

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: Omar Sandoval <osandov@fb.com>
Signed-off-by: Ming 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: Jens Axboe <axboe@kernel.dk>
block/blk-mq-tag.c
include/linux/sbitmap.h
lib/sbitmap.c