In case of several stacked block devices, which both were inited by
blk_init_queue call, you can catch the queue stuck, if first device
in stack makes bio submit being in a flush of a plug list.
Let's consider this regular scenario taking readahead into account
(readahead.c:read_pages):
1. Start plug
2. Read pages in loop
3. Finish plug
This example generates backtrace as follows:
1. blk_start_plug
2. generic_make_request
q->make_request_fn
[blk_queue_bio]
if (current->plug)
list_add_tail(&req->queuelist, &plug->list);
3. blk_finish_plug
blk_flush_plug_list
queue_unplugged
__blk_run_queue
XXX_request_fn [some request handler of block device]
generic_make_request
q->make_request_fn
[blk_queue_bio]
if (current->plug)
list_add_tail(&req->queuelist, &plug->list);
So the problem is, that on step 3. XXX_request_fn makes
another request, which again will be put to plug list,
because plug is till active, thus new request will be
stuck forever in the queue.
How to fix?
Do flush plug list till it becomes empty.