git: 8a860e8286f2 - main - nvme: collapse the per-counter qpair statistic sysctl handlers

From: Abdelkader Boudih <seuros_at_FreeBSD.org>
Date: Fri, 25 Sep 2026 21:43:19 UTC
The branch main has been updated by seuros:

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

commit 8a860e8286f2e2f20e6eb5b63d9ee1f0a62e0371
Author:     Abdelkader Boudih <seuros@FreeBSD.org>
AuthorDate: 2026-09-25 21:42:36 +0000
Commit:     Abdelkader Boudih <seuros@FreeBSD.org>
CommitDate: 2026-09-25 21:42:36 +0000

    nvme: collapse the per-counter qpair statistic sysctl handlers
    
    A single handler that takes the counter's offset
    within struct nvme_qpair in arg2.
    
    No functional change
    
    Reviewed by:    imp, adrian
    Differential Revision:  https://reviews.freebsd.org/D60020
---
 sys/dev/nvme/nvme_sysctl.c | 118 ++++++++-------------------------------------
 1 file changed, 20 insertions(+), 98 deletions(-)

diff --git a/sys/dev/nvme/nvme_sysctl.c b/sys/dev/nvme/nvme_sysctl.c
index 6da1be02f4b2..55c5dfec8701 100644
--- a/sys/dev/nvme/nvme_sysctl.c
+++ b/sys/dev/nvme/nvme_sysctl.c
@@ -148,105 +148,21 @@ nvme_qpair_reset_stats(struct nvme_qpair *qpair)
 }
 
 static int
-nvme_sysctl_num_cmds(SYSCTL_HANDLER_ARGS)
+nvme_sysctl_qpair_stat(SYSCTL_HANDLER_ARGS)
 {
-	struct nvme_controller 	*ctrlr = arg1;
-	int64_t			num_cmds = 0;
-	int			i;
-
-	num_cmds = ctrlr->adminq.num_cmds;
-
-	if (ctrlr->ioq != NULL) {
-		for (i = 0; i < ctrlr->num_io_queues; i++)
-			num_cmds += ctrlr->ioq[i].num_cmds;
-	}
-
-	return (sysctl_handle_64(oidp, &num_cmds, 0, req));
-}
-
-static int
-nvme_sysctl_num_intr_handler_calls(SYSCTL_HANDLER_ARGS)
-{
-	struct nvme_controller 	*ctrlr = arg1;
-	int64_t			num_intr_handler_calls = 0;
-	int			i;
-
-	num_intr_handler_calls = ctrlr->adminq.num_intr_handler_calls;
-
-	if (ctrlr->ioq != NULL) {
-		for (i = 0; i < ctrlr->num_io_queues; i++)
-			num_intr_handler_calls += ctrlr->ioq[i].num_intr_handler_calls;
-	}
-
-	return (sysctl_handle_64(oidp, &num_intr_handler_calls, 0, req));
-}
-
-static int
-nvme_sysctl_num_retries(SYSCTL_HANDLER_ARGS)
-{
-	struct nvme_controller 	*ctrlr = arg1;
-	int64_t			num_retries = 0;
-	int			i;
-
-	num_retries = ctrlr->adminq.num_retries;
-
-	if (ctrlr->ioq != NULL) {
-		for (i = 0; i < ctrlr->num_io_queues; i++)
-			num_retries += ctrlr->ioq[i].num_retries;
-	}
-
-	return (sysctl_handle_64(oidp, &num_retries, 0, req));
-}
-
-static int
-nvme_sysctl_num_failures(SYSCTL_HANDLER_ARGS)
-{
-	struct nvme_controller 	*ctrlr = arg1;
-	int64_t			num_failures = 0;
-	int			i;
-
-	num_failures = ctrlr->adminq.num_failures;
-
-	if (ctrlr->ioq != NULL) {
-		for (i = 0; i < ctrlr->num_io_queues; i++)
-			num_failures += ctrlr->ioq[i].num_failures;
-	}
-
-	return (sysctl_handle_64(oidp, &num_failures, 0, req));
-}
-
-static int
-nvme_sysctl_num_ignored(SYSCTL_HANDLER_ARGS)
-{
-	struct nvme_controller 	*ctrlr = arg1;
-	int64_t			num_ignored = 0;
-	int			i;
-
-	num_ignored = ctrlr->adminq.num_ignored;
-
-	if (ctrlr->ioq != NULL) {
-		for (i = 0; i < ctrlr->num_io_queues; i++)
-			num_ignored += ctrlr->ioq[i].num_ignored;
-	}
-
-	return (sysctl_handle_64(oidp, &num_ignored, 0, req));
-}
-
-static int
-nvme_sysctl_num_recovery_nolock(SYSCTL_HANDLER_ARGS)
-{
-	struct nvme_controller 	*ctrlr = arg1;
-	int64_t			num;
+	struct nvme_controller	*ctrlr = arg1;
+	size_t			off = arg2;
+	int64_t			sum;
 	int			i;
 
-	num = ctrlr->adminq.num_recovery_nolock;
+	sum = *(int64_t *)((char *)&ctrlr->adminq + off);
 
 	if (ctrlr->ioq != NULL) {
 		for (i = 0; i < ctrlr->num_io_queues; i++)
-			num += ctrlr->ioq[i].num_recovery_nolock;
+			sum += *(int64_t *)((char *)&ctrlr->ioq[i] + off);
 	}
 
-	return (sysctl_handle_64(oidp, &num, 0, req));
+	return (sysctl_handle_64(oidp, &sum, 0, req));
 }
 
 static int
@@ -365,35 +281,41 @@ nvme_sysctl_initialize_ctrlr(struct nvme_controller *ctrlr)
 
 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
 	    "num_cmds", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
-	    ctrlr, 0, nvme_sysctl_num_cmds, "IU",
+	    ctrlr, offsetof(struct nvme_qpair, num_cmds),
+	    nvme_sysctl_qpair_stat, "IU",
 	    "Number of commands submitted");
 
 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
 	    "num_intr_handler_calls",
-	    CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, ctrlr, 0,
-	    nvme_sysctl_num_intr_handler_calls, "IU",
+	    CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, ctrlr,
+	    offsetof(struct nvme_qpair, num_intr_handler_calls),
+	    nvme_sysctl_qpair_stat, "IU",
 	    "Number of times interrupt handler was invoked (will "
 	    "typically be less than number of actual interrupts "
 	    "generated due to coalescing)");
 
 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
 	    "num_retries", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
-	    ctrlr, 0, nvme_sysctl_num_retries, "IU",
+	    ctrlr, offsetof(struct nvme_qpair, num_retries),
+	    nvme_sysctl_qpair_stat, "IU",
 	    "Number of commands retried");
 
 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
 	    "num_failures", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
-	    ctrlr, 0, nvme_sysctl_num_failures, "IU",
+	    ctrlr, offsetof(struct nvme_qpair, num_failures),
+	    nvme_sysctl_qpair_stat, "IU",
 	    "Number of commands ending in failure after all retries");
 
 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
 	    "num_ignored", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
-	    ctrlr, 0, nvme_sysctl_num_ignored, "IU",
+	    ctrlr, offsetof(struct nvme_qpair, num_ignored),
+	    nvme_sysctl_qpair_stat, "IU",
 	    "Number of interrupts ignored administratively");
 
 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
 	    "num_recovery_nolock", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE,
-	    ctrlr, 0, nvme_sysctl_num_recovery_nolock, "IU",
+	    ctrlr, offsetof(struct nvme_qpair, num_recovery_nolock),
+	    nvme_sysctl_qpair_stat, "IU",
 	    "Number of times that we failed to lock recovery in the ISR");
 
 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,