git: f195b9f3f6f7 - main - nvme: limit I/O queue trackers to Identify MAXCMD

From: Abdelkader Boudih <seuros_at_FreeBSD.org>
Date: Tue, 08 Sep 2026 00:21:17 UTC
The branch main has been updated by seuros:

URL: https://cgit.FreeBSD.org/src/commit/?id=f195b9f3f6f768ff2ae1e4523cab59a305666491

commit f195b9f3f6f768ff2ae1e4523cab59a305666491
Author:     Abdelkader Boudih <seuros@FreeBSD.org>
AuthorDate: 2026-09-08 00:20:53 +0000
Commit:     Abdelkader Boudih <seuros@FreeBSD.org>
CommitDate: 2026-09-08 00:20:53 +0000

    nvme: limit I/O queue trackers to Identify MAXCMD
    
    MAXCMD is the maximum number of commands the controller processes at
    one time for a particular I/O queue. Allocating more trackers than
    that only queues commands inside the controller. Controllers
    reporting 0 are unaffected.
    
    Approved by: ngie (co-mentor)
    
    Reviewed by:    ngie, imp
    Differential Revision:  https://reviews.freebsd.org/D59154
---
 sys/dev/nvme/nvme_ctrlr.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/sys/dev/nvme/nvme_ctrlr.c b/sys/dev/nvme/nvme_ctrlr.c
index 5c90e252b748..a8d8d1b99647 100644
--- a/sys/dev/nvme/nvme_ctrlr.c
+++ b/sys/dev/nvme/nvme_ctrlr.c
@@ -191,6 +191,13 @@ nvme_ctrlr_construct_io_qpairs(struct nvme_controller *ctrlr)
 	 */
 	num_trackers = min(num_trackers, (num_entries-1));
 
+	if (ctrlr->cdata.maxcmd != 0 && num_trackers > ctrlr->cdata.maxcmd) {
+		nvme_printf(ctrlr,
+		    "limiting trackers per I/O queue to MAXCMD (%u -> %u)\n",
+		    num_trackers, ctrlr->cdata.maxcmd);
+		num_trackers = ctrlr->cdata.maxcmd;
+	}
+
 	if (ctrlr->quirks & QUIRK_APPLE_SHARED_CID_SPACE)
 		num_trackers = min(num_trackers,
 		    NVME_ADMIN_ENTRIES - ctrlr->adminq.num_trackers);