If we don't have poll queue, its mapping should share default type's,
instead of setting up one new mapping via blk_mq_map_queues().

blk_mq_map_swqueue() is actually fragile to deal with shared mapping, then
one same ctx can be mapped to two hctxes with same queue type, this
way may cause IO hang easily.

Cc: Jeff Moyer <[email protected]>
Cc: Mike Snitzer <[email protected]>
Cc: Christoph Hellwig <[email protected]>
Signed-off-by: Ming Lei <[email protected]>
---
 drivers/nvme/host/pci.c | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/nvme/host/pci.c b/drivers/nvme/host/pci.c
index fb9d8270f32c..95bd68be2078 100644
--- a/drivers/nvme/host/pci.c
+++ b/drivers/nvme/host/pci.c
@@ -505,10 +505,11 @@ static int nvme_pci_map_queues(struct blk_mq_tag_set *set)
 
                /*
                 * The poll queue(s) doesn't have an IRQ (and hence IRQ
-                * affinity), so use the regular blk-mq cpu mapping
+                * affinity), so use the regular blk-mq cpu mapping if
+                * poll queue(s) don't share mapping with TYPE_DEFAULT.
                 */
                map->queue_offset = qoff;
-               if (i != HCTX_TYPE_POLL)
+               if (i != HCTX_TYPE_POLL || !qoff)
                        blk_mq_pci_map_queues(map, to_pci_dev(dev->dev), 
offset);
                else
                        blk_mq_map_queues(map);
-- 
2.9.5

Reply via email to