From: Liu Song <liusong@xxxxxxxxxxxxxxxxx> If "blk_mq_get_tag" returns BLK_MQ_NO_TAG because the value of "tags->nr_reserved_tags" is 0, it will fall into an infinite loop in "__blk_mq_alloc_requests", so borrow BLK_MQ_REQ_NOWAIT to exit the loop. Because "blk_mq_alloc_data" objects are allocated on the stack, changing the content of flags will not generate extra impact. Signed-off-by: Liu Song <liusong@xxxxxxxxxxxxxxxxx> --- block/blk-mq-tag.c | 1 + 1 file changed, 1 insertion(+) diff --git a/block/blk-mq-tag.c b/block/blk-mq-tag.c index 2dcd738..6f1d6e6 100644 --- a/block/blk-mq-tag.c +++ b/block/blk-mq-tag.c @@ -139,6 +139,7 @@ unsigned int blk_mq_get_tag(struct blk_mq_alloc_data *data) if (data->flags & BLK_MQ_REQ_RESERVED) { if (unlikely(!tags->nr_reserved_tags)) { WARN_ON_ONCE(1); + data->flags |= BLK_MQ_REQ_NOWAIT; return BLK_MQ_NO_TAG; } bt = &tags->breserved_tags; -- 1.8.3.1