nvme-fabrics: clear the poll map if no poll queues are mapped

blk_mq_alloc_tag_set sets the nr_queues of every map to nr_hw_queues.
When nr_poll_queues is set but no queues are left for polling,
nvmf_map_queues skips the poll map and leaves it this way, with all CPUs
mapped to hctx 0.  The queue then claims poll support, polled I/O ends
up on hctx 0, which isn't a poll queue, and hctx 0 is marked as a poll
hctx, so even the Connect command of the first I/O queue is marked as
polled.

Clear the poll map when no poll queues are mapped, so polled I/O is
rejected with -EOPNOTSUPP.

Fixes: 1a9460cef5 ("nvme-tcp: support simple polling")
Fixes: 5651cd3c43 ("nvme-rdma: fix queue mapping when queue count is limited")
Reviewed-by: Hannes Reinecke <hare@kernel.org>
Tested-by: Maurizio Lombardi <mlombard@redhat.com>
Signed-off-by: Daniel Wagner <wagi@kernel.org>
Signed-off-by: Keith Busch <kbusch@kernel.org>
This commit is contained in:
Daniel Wagner 2026-10-14 09:46:43 +02:00 committed by Keith Busch
parent 99fd0cbae8
commit 36ede1aa85

View File

@ -1199,6 +1199,13 @@ void nvmf_map_queues(struct blk_mq_tag_set *set, struct nvme_ctrl *ctrl,
io_queues[HCTX_TYPE_DEFAULT] +
io_queues[HCTX_TYPE_READ];
blk_mq_map_queues(&set->map[HCTX_TYPE_POLL]);
} else {
/*
* blk_mq_alloc_tag_set sets nr_queues of all maps to
* nr_hw_queues. Clear the poll map, otherwise the queue claims
* poll support and polled I/O ends up on hctx 0.
*/
set->map[HCTX_TYPE_POLL].nr_queues = 0;
}
dev_info(ctrl->device,