diff --git a/nvme_ctrlr.c b/nvme_ctrlr.c index 1d44e3f..5864979 100644 --- sys/dev/nvme/nvme_ctrlr.c.orig +++ sys/dev/nvme/nvme_ctrlr.c @@ -1231,14 +1231,19 @@ nvme_ctrlr_setup_interrupts(struct nvme_controller *ctrlr) * assigning an equal number of cores to each I/O queue. */ - /* One vector for per core I/O queue, plus one vector for admin queue. */ - num_vectors_available = min(pci_msix_count(dev), mp_ncpus + 1); - if (pci_alloc_msix(dev, &num_vectors_available) != 0) { + if (ctrlr->force_intx) { + /* In force intx mode, don't even try to probe vectors. */ num_vectors_available = 0; + } else { + /* One vector for per core I/O queue, plus one vector for admin queue. */ + num_vectors_available = min(pci_msix_count(dev), mp_ncpus + 1); + if (pci_alloc_msix(dev, &num_vectors_available) != 0) { + num_vectors_available = 0; + } + pci_release_msi(dev); } - pci_release_msi(dev); - if (ctrlr->force_intx || num_vectors_available < 2) { + if (num_vectors_available < 2) { nvme_ctrlr_configure_intx(ctrlr); return; }