git: ad57f212665e - main - nvme: do not touch INTMS/INTMC when configured for MSI-X
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Wed, 23 Sep 2026 18:07:28 UTC
The branch main has been updated by seuros:
URL: https://cgit.FreeBSD.org/src/commit/?id=ad57f212665e1642423afb83aef19e755833643f
commit ad57f212665e1642423afb83aef19e755833643f
Author: Abdelkader Boudih <seuros@FreeBSD.org>
AuthorDate: 2026-09-23 18:01:57 +0000
Commit: Abdelkader Boudih <seuros@FreeBSD.org>
CommitDate: 2026-09-23 18:01:57 +0000
nvme: do not touch INTMS/INTMC when configured for MSI-X
The single-vector MSI-X fallback installs the shared interrupt
handler, which masks interrupts through INTMS/INTMC around the
completion poll.
INTx and MSI are unaffected. Only MSI-X track the interrupt mode
and skip un/masking
Reviewed by: ngie, imp, adrian
Differential Revision: https://reviews.freebsd.org/D59637
---
sys/dev/nvme/nvme_ctrlr.c | 7 +++++--
sys/dev/nvme/nvme_pci.c | 1 +
sys/dev/nvme/nvme_private.h | 1 +
3 files changed, 7 insertions(+), 2 deletions(-)
diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c
index a8d8d1b99647..6dba83708df4 100644
--- a/sys/dev/nvme/nvme_ctrlr.c
+++ b/sys/dev/nvme/nvme_ctrlr.c
@@ -1405,9 +1405,12 @@ nvme_ctrlr_shared_handler(void *arg)
{
struct nvme_controller *ctrlr = arg;
- nvme_mmio_write_4(ctrlr, intms, 1);
+ /* INTMS/INTMC are undefined when configured for MSI-X. */
+ if (!ctrlr->is_msix)
+ nvme_mmio_write_4(ctrlr, intms, 1);
nvme_ctrlr_poll(ctrlr);
- nvme_mmio_write_4(ctrlr, intmc, 1);
+ if (!ctrlr->is_msix)
+ nvme_mmio_write_4(ctrlr, intmc, 1);
}
#define NVME_MAX_PAGES (int)(1024 / sizeof(vm_page_t))
diff --git a/sys/dev/nvme/nvme_pci.c b/sys/dev/nvme/nvme_pci.c
index 8ea31850d09b..5d4fab3b2ab1 100644
--- a/sys/dev/nvme/nvme_pci.c
+++ b/sys/dev/nvme/nvme_pci.c
@@ -385,6 +385,7 @@ again:
ctrlr->msi_count = 0;
goto msi;
}
+ ctrlr->is_msix = true;
if (ctrlr->msi_count == 1)
return (nvme_ctrlr_setup_shared(ctrlr, 1));
if (ctrlr->msi_count != num_vectors_requested) {
diff --git a/sys/dev/nvme/nvme_private.h b/sys/dev/nvme/nvme_private.h
index f96729608ed5..9bee1b23bd4e 100644
--- a/sys/dev/nvme/nvme_private.h
+++ b/sys/dev/nvme/nvme_private.h
@@ -257,6 +257,7 @@ struct nvme_controller {
struct resource *msix_pba_resource;
int msi_count;
+ bool is_msix;
uint32_t enable_aborts;
uint32_t num_io_queues;