xref: /freebsd/sys/dev/nvme/nvme_sysctl.c (revision 1071b50a65aae2a588dea5782e5a06df9d81445c)
1bb0ec6b3SJim Harris /*-
2718cf2ccSPedro F. Giffuni  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
3718cf2ccSPedro F. Giffuni  *
450dea2daSJim Harris  * Copyright (C) 2012-2016 Intel Corporation
5bb0ec6b3SJim Harris  * All rights reserved.
6bb0ec6b3SJim Harris  *
7bb0ec6b3SJim Harris  * Redistribution and use in source and binary forms, with or without
8bb0ec6b3SJim Harris  * modification, are permitted provided that the following conditions
9bb0ec6b3SJim Harris  * are met:
10bb0ec6b3SJim Harris  * 1. Redistributions of source code must retain the above copyright
11bb0ec6b3SJim Harris  *    notice, this list of conditions and the following disclaimer.
12bb0ec6b3SJim Harris  * 2. Redistributions in binary form must reproduce the above copyright
13bb0ec6b3SJim Harris  *    notice, this list of conditions and the following disclaimer in the
14bb0ec6b3SJim Harris  *    documentation and/or other materials provided with the distribution.
15bb0ec6b3SJim Harris  *
16bb0ec6b3SJim Harris  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17bb0ec6b3SJim Harris  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18bb0ec6b3SJim Harris  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19bb0ec6b3SJim Harris  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20bb0ec6b3SJim Harris  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21bb0ec6b3SJim Harris  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22bb0ec6b3SJim Harris  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23bb0ec6b3SJim Harris  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24bb0ec6b3SJim Harris  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25bb0ec6b3SJim Harris  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
26bb0ec6b3SJim Harris  * SUCH DAMAGE.
27bb0ec6b3SJim Harris  */
28bb0ec6b3SJim Harris 
29bb0ec6b3SJim Harris #include <sys/cdefs.h>
30bb0ec6b3SJim Harris __FBSDID("$FreeBSD$");
31bb0ec6b3SJim Harris 
32850564b9SWarner Losh #include "opt_nvme.h"
33850564b9SWarner Losh 
34bb0ec6b3SJim Harris #include <sys/param.h>
35bb0ec6b3SJim Harris #include <sys/bus.h>
36bb0ec6b3SJim Harris #include <sys/sysctl.h>
37bb0ec6b3SJim Harris 
38bb0ec6b3SJim Harris #include "nvme_private.h"
39bb0ec6b3SJim Harris 
40850564b9SWarner Losh #ifndef NVME_USE_NVD
41850564b9SWarner Losh #define NVME_USE_NVD 1
42850564b9SWarner Losh #endif
43850564b9SWarner Losh 
44850564b9SWarner Losh int nvme_use_nvd = NVME_USE_NVD;
45*1071b50aSWarner Losh bool nvme_verbose_cmd_dump = false;
468a5d94f9SWarner Losh 
478a5d94f9SWarner Losh SYSCTL_NODE(_hw, OID_AUTO, nvme, CTLFLAG_RD, 0, "NVMe sysctl tunables");
488a5d94f9SWarner Losh SYSCTL_INT(_hw_nvme, OID_AUTO, use_nvd, CTLFLAG_RDTUN,
498a5d94f9SWarner Losh     &nvme_use_nvd, 1, "1 = Create NVD devices, 0 = Create NDA devices");
50*1071b50aSWarner Losh SYSCTL_BOOL(_hw_nvme, OID_AUTO, verbose_cmd_dump, CTLFLAG_RWTUN,
51*1071b50aSWarner Losh     &nvme_verbose_cmd_dump, 0,
52*1071b50aSWarner Losh     "enable verbose command printting when a command fails");
538a5d94f9SWarner Losh 
546568ebfcSJim Harris /*
556568ebfcSJim Harris  * CTLTYPE_S64 and sysctl_handle_64 were added in r217616.  Define these
566568ebfcSJim Harris  *  explicitly here for older kernels that don't include the r217616
576568ebfcSJim Harris  *  changeset.
586568ebfcSJim Harris  */
596568ebfcSJim Harris #ifndef CTLTYPE_S64
606568ebfcSJim Harris #define CTLTYPE_S64		CTLTYPE_QUAD
616568ebfcSJim Harris #define sysctl_handle_64	sysctl_handle_quad
626568ebfcSJim Harris #endif
636568ebfcSJim Harris 
64bb0ec6b3SJim Harris static void
65bb0ec6b3SJim Harris nvme_dump_queue(struct nvme_qpair *qpair)
66bb0ec6b3SJim Harris {
67bb0ec6b3SJim Harris 	struct nvme_completion *cpl;
68bb0ec6b3SJim Harris 	struct nvme_command *cmd;
69bb0ec6b3SJim Harris 	int i;
70bb0ec6b3SJim Harris 
71bb0ec6b3SJim Harris 	printf("id:%04Xh phase:%d\n", qpair->id, qpair->phase);
72bb0ec6b3SJim Harris 
73bb0ec6b3SJim Harris 	printf("Completion queue:\n");
74bb0ec6b3SJim Harris 	for (i = 0; i < qpair->num_entries; i++) {
75bb0ec6b3SJim Harris 		cpl = &qpair->cpl[i];
76bb0ec6b3SJim Harris 		printf("%05d: ", i);
77bb0ec6b3SJim Harris 		nvme_dump_completion(cpl);
78bb0ec6b3SJim Harris 	}
79bb0ec6b3SJim Harris 
80bb0ec6b3SJim Harris 	printf("Submission queue:\n");
81bb0ec6b3SJim Harris 	for (i = 0; i < qpair->num_entries; i++) {
82bb0ec6b3SJim Harris 		cmd = &qpair->cmd[i];
83bb0ec6b3SJim Harris 		printf("%05d: ", i);
84bb0ec6b3SJim Harris 		nvme_dump_command(cmd);
85bb0ec6b3SJim Harris 	}
86bb0ec6b3SJim Harris }
87bb0ec6b3SJim Harris 
88bb0ec6b3SJim Harris 
89bb0ec6b3SJim Harris static int
90bb0ec6b3SJim Harris nvme_sysctl_dump_debug(SYSCTL_HANDLER_ARGS)
91bb0ec6b3SJim Harris {
92bb0ec6b3SJim Harris 	struct nvme_qpair 	*qpair = arg1;
93bb0ec6b3SJim Harris 	uint32_t		val = 0;
94bb0ec6b3SJim Harris 
95bb0ec6b3SJim Harris 	int error = sysctl_handle_int(oidp, &val, 0, req);
96bb0ec6b3SJim Harris 
97bb0ec6b3SJim Harris 	if (error)
98bb0ec6b3SJim Harris 		return (error);
99bb0ec6b3SJim Harris 
100bb0ec6b3SJim Harris 	if (val != 0)
101bb0ec6b3SJim Harris 		nvme_dump_queue(qpair);
102bb0ec6b3SJim Harris 
103bb0ec6b3SJim Harris 	return (0);
104bb0ec6b3SJim Harris }
105bb0ec6b3SJim Harris 
106bb0ec6b3SJim Harris static int
107bb0ec6b3SJim Harris nvme_sysctl_int_coal_time(SYSCTL_HANDLER_ARGS)
108bb0ec6b3SJim Harris {
109bb0ec6b3SJim Harris 	struct nvme_controller *ctrlr = arg1;
110bb0ec6b3SJim Harris 	uint32_t oldval = ctrlr->int_coal_time;
111bb0ec6b3SJim Harris 	int error = sysctl_handle_int(oidp, &ctrlr->int_coal_time, 0,
112bb0ec6b3SJim Harris 	    req);
113bb0ec6b3SJim Harris 
114bb0ec6b3SJim Harris 	if (error)
115bb0ec6b3SJim Harris 		return (error);
116bb0ec6b3SJim Harris 
117bb0ec6b3SJim Harris 	if (oldval != ctrlr->int_coal_time)
118bb0ec6b3SJim Harris 		nvme_ctrlr_cmd_set_interrupt_coalescing(ctrlr,
119bb0ec6b3SJim Harris 		    ctrlr->int_coal_time, ctrlr->int_coal_threshold, NULL,
120bb0ec6b3SJim Harris 		    NULL);
121bb0ec6b3SJim Harris 
122bb0ec6b3SJim Harris 	return (0);
123bb0ec6b3SJim Harris }
124bb0ec6b3SJim Harris 
125bb0ec6b3SJim Harris static int
126bb0ec6b3SJim Harris nvme_sysctl_int_coal_threshold(SYSCTL_HANDLER_ARGS)
127bb0ec6b3SJim Harris {
128bb0ec6b3SJim Harris 	struct nvme_controller *ctrlr = arg1;
129bb0ec6b3SJim Harris 	uint32_t oldval = ctrlr->int_coal_threshold;
130bb0ec6b3SJim Harris 	int error = sysctl_handle_int(oidp, &ctrlr->int_coal_threshold, 0,
131bb0ec6b3SJim Harris 	    req);
132bb0ec6b3SJim Harris 
133bb0ec6b3SJim Harris 	if (error)
134bb0ec6b3SJim Harris 		return (error);
135bb0ec6b3SJim Harris 
136bb0ec6b3SJim Harris 	if (oldval != ctrlr->int_coal_threshold)
137bb0ec6b3SJim Harris 		nvme_ctrlr_cmd_set_interrupt_coalescing(ctrlr,
138bb0ec6b3SJim Harris 		    ctrlr->int_coal_time, ctrlr->int_coal_threshold, NULL,
139bb0ec6b3SJim Harris 		    NULL);
140bb0ec6b3SJim Harris 
141bb0ec6b3SJim Harris 	return (0);
142bb0ec6b3SJim Harris }
143bb0ec6b3SJim Harris 
14494143332SJim Harris static int
14594143332SJim Harris nvme_sysctl_timeout_period(SYSCTL_HANDLER_ARGS)
14694143332SJim Harris {
14794143332SJim Harris 	struct nvme_controller *ctrlr = arg1;
14894143332SJim Harris 	uint32_t oldval = ctrlr->timeout_period;
14994143332SJim Harris 	int error = sysctl_handle_int(oidp, &ctrlr->timeout_period, 0, req);
15094143332SJim Harris 
15194143332SJim Harris 	if (error)
15294143332SJim Harris 		return (error);
15394143332SJim Harris 
15494143332SJim Harris 	if (ctrlr->timeout_period > NVME_MAX_TIMEOUT_PERIOD ||
15594143332SJim Harris 	    ctrlr->timeout_period < NVME_MIN_TIMEOUT_PERIOD) {
15694143332SJim Harris 		ctrlr->timeout_period = oldval;
15794143332SJim Harris 		return (EINVAL);
15894143332SJim Harris 	}
15994143332SJim Harris 
16094143332SJim Harris 	return (0);
16194143332SJim Harris }
16294143332SJim Harris 
163bb0ec6b3SJim Harris static void
1646568ebfcSJim Harris nvme_qpair_reset_stats(struct nvme_qpair *qpair)
1656568ebfcSJim Harris {
1666568ebfcSJim Harris 
1676568ebfcSJim Harris 	qpair->num_cmds = 0;
1686568ebfcSJim Harris 	qpair->num_intr_handler_calls = 0;
1696568ebfcSJim Harris }
1706568ebfcSJim Harris 
1716568ebfcSJim Harris static int
1726568ebfcSJim Harris nvme_sysctl_num_cmds(SYSCTL_HANDLER_ARGS)
1736568ebfcSJim Harris {
1746568ebfcSJim Harris 	struct nvme_controller 	*ctrlr = arg1;
1756568ebfcSJim Harris 	int64_t			num_cmds = 0;
1766568ebfcSJim Harris 	int			i;
1776568ebfcSJim Harris 
1786568ebfcSJim Harris 	num_cmds = ctrlr->adminq.num_cmds;
1796568ebfcSJim Harris 
1806568ebfcSJim Harris 	for (i = 0; i < ctrlr->num_io_queues; i++)
1816568ebfcSJim Harris 		num_cmds += ctrlr->ioq[i].num_cmds;
1826568ebfcSJim Harris 
1836568ebfcSJim Harris 	return (sysctl_handle_64(oidp, &num_cmds, 0, req));
1846568ebfcSJim Harris }
1856568ebfcSJim Harris 
1866568ebfcSJim Harris static int
1876568ebfcSJim Harris nvme_sysctl_num_intr_handler_calls(SYSCTL_HANDLER_ARGS)
1886568ebfcSJim Harris {
1896568ebfcSJim Harris 	struct nvme_controller 	*ctrlr = arg1;
1906568ebfcSJim Harris 	int64_t			num_intr_handler_calls = 0;
1916568ebfcSJim Harris 	int			i;
1926568ebfcSJim Harris 
1936568ebfcSJim Harris 	num_intr_handler_calls = ctrlr->adminq.num_intr_handler_calls;
1946568ebfcSJim Harris 
1956568ebfcSJim Harris 	for (i = 0; i < ctrlr->num_io_queues; i++)
1966568ebfcSJim Harris 		num_intr_handler_calls += ctrlr->ioq[i].num_intr_handler_calls;
1976568ebfcSJim Harris 
1986568ebfcSJim Harris 	return (sysctl_handle_64(oidp, &num_intr_handler_calls, 0, req));
1996568ebfcSJim Harris }
2006568ebfcSJim Harris 
2016568ebfcSJim Harris static int
2026568ebfcSJim Harris nvme_sysctl_reset_stats(SYSCTL_HANDLER_ARGS)
2036568ebfcSJim Harris {
2046568ebfcSJim Harris 	struct nvme_controller 	*ctrlr = arg1;
2056568ebfcSJim Harris 	uint32_t		i, val = 0;
2066568ebfcSJim Harris 
2076568ebfcSJim Harris 	int error = sysctl_handle_int(oidp, &val, 0, req);
2086568ebfcSJim Harris 
2096568ebfcSJim Harris 	if (error)
2106568ebfcSJim Harris 		return (error);
2116568ebfcSJim Harris 
2126568ebfcSJim Harris 	if (val != 0) {
2136568ebfcSJim Harris 		nvme_qpair_reset_stats(&ctrlr->adminq);
2146568ebfcSJim Harris 
2156568ebfcSJim Harris 		for (i = 0; i < ctrlr->num_io_queues; i++)
2166568ebfcSJim Harris 			nvme_qpair_reset_stats(&ctrlr->ioq[i]);
2176568ebfcSJim Harris 	}
2186568ebfcSJim Harris 
2196568ebfcSJim Harris 	return (0);
2206568ebfcSJim Harris }
2216568ebfcSJim Harris 
2226568ebfcSJim Harris 
2236568ebfcSJim Harris static void
224bb0ec6b3SJim Harris nvme_sysctl_initialize_queue(struct nvme_qpair *qpair,
225bb0ec6b3SJim Harris     struct sysctl_ctx_list *ctrlr_ctx, struct sysctl_oid *que_tree)
226bb0ec6b3SJim Harris {
227bb0ec6b3SJim Harris 	struct sysctl_oid_list	*que_list = SYSCTL_CHILDREN(que_tree);
228bb0ec6b3SJim Harris 
229bb0ec6b3SJim Harris 	SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "num_entries",
230bb0ec6b3SJim Harris 	    CTLFLAG_RD, &qpair->num_entries, 0,
231bb0ec6b3SJim Harris 	    "Number of entries in hardware queue");
23221b6da58SJim Harris 	SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "num_trackers",
23321b6da58SJim Harris 	    CTLFLAG_RD, &qpair->num_trackers, 0,
23421b6da58SJim Harris 	    "Number of trackers pre-allocated for this queue pair");
235bb0ec6b3SJim Harris 	SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "sq_head",
236bb0ec6b3SJim Harris 	    CTLFLAG_RD, &qpair->sq_head, 0,
237bb0ec6b3SJim Harris 	    "Current head of submission queue (as observed by driver)");
238bb0ec6b3SJim Harris 	SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "sq_tail",
239bb0ec6b3SJim Harris 	    CTLFLAG_RD, &qpair->sq_tail, 0,
240bb0ec6b3SJim Harris 	    "Current tail of submission queue (as observed by driver)");
241bb0ec6b3SJim Harris 	SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "cq_head",
242bb0ec6b3SJim Harris 	    CTLFLAG_RD, &qpair->cq_head, 0,
243bb0ec6b3SJim Harris 	    "Current head of completion queue (as observed by driver)");
244bb0ec6b3SJim Harris 
245bb0ec6b3SJim Harris 	SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_cmds",
246bb0ec6b3SJim Harris 	    CTLFLAG_RD, &qpair->num_cmds, "Number of commands submitted");
2476568ebfcSJim Harris 	SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_intr_handler_calls",
2486568ebfcSJim Harris 	    CTLFLAG_RD, &qpair->num_intr_handler_calls,
2496568ebfcSJim Harris 	    "Number of times interrupt handler was invoked (will typically be "
2506568ebfcSJim Harris 	    "less than number of actual interrupts generated due to "
2516568ebfcSJim Harris 	    "coalescing)");
252bb0ec6b3SJim Harris 
253bb0ec6b3SJim Harris 	SYSCTL_ADD_PROC(ctrlr_ctx, que_list, OID_AUTO,
254bb0ec6b3SJim Harris 	    "dump_debug", CTLTYPE_UINT | CTLFLAG_RW, qpair, 0,
255bb0ec6b3SJim Harris 	    nvme_sysctl_dump_debug, "IU", "Dump debug data");
256bb0ec6b3SJim Harris }
257bb0ec6b3SJim Harris 
258bb0ec6b3SJim Harris void
259bb0ec6b3SJim Harris nvme_sysctl_initialize_ctrlr(struct nvme_controller *ctrlr)
260bb0ec6b3SJim Harris {
261bb0ec6b3SJim Harris 	struct sysctl_ctx_list	*ctrlr_ctx;
262bb0ec6b3SJim Harris 	struct sysctl_oid	*ctrlr_tree, *que_tree;
263bb0ec6b3SJim Harris 	struct sysctl_oid_list	*ctrlr_list;
264bb0ec6b3SJim Harris #define QUEUE_NAME_LENGTH	16
265bb0ec6b3SJim Harris 	char			queue_name[QUEUE_NAME_LENGTH];
266bb0ec6b3SJim Harris 	int			i;
267bb0ec6b3SJim Harris 
268bb0ec6b3SJim Harris 	ctrlr_ctx = device_get_sysctl_ctx(ctrlr->dev);
269bb0ec6b3SJim Harris 	ctrlr_tree = device_get_sysctl_tree(ctrlr->dev);
270bb0ec6b3SJim Harris 	ctrlr_list = SYSCTL_CHILDREN(ctrlr_tree);
271bb0ec6b3SJim Harris 
27250dea2daSJim Harris 	SYSCTL_ADD_UINT(ctrlr_ctx, ctrlr_list, OID_AUTO, "num_cpus_per_ioq",
27350dea2daSJim Harris 	    CTLFLAG_RD, &ctrlr->num_cpus_per_ioq, 0,
27450dea2daSJim Harris 	    "Number of CPUs assigned per I/O queue pair");
27550dea2daSJim Harris 
276bb0ec6b3SJim Harris 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
277bb0ec6b3SJim Harris 	    "int_coal_time", CTLTYPE_UINT | CTLFLAG_RW, ctrlr, 0,
278bb0ec6b3SJim Harris 	    nvme_sysctl_int_coal_time, "IU",
279bb0ec6b3SJim Harris 	    "Interrupt coalescing timeout (in microseconds)");
280bb0ec6b3SJim Harris 
281bb0ec6b3SJim Harris 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
282bb0ec6b3SJim Harris 	    "int_coal_threshold", CTLTYPE_UINT | CTLFLAG_RW, ctrlr, 0,
283bb0ec6b3SJim Harris 	    nvme_sysctl_int_coal_threshold, "IU",
284bb0ec6b3SJim Harris 	    "Interrupt coalescing threshold");
2856568ebfcSJim Harris 
2866568ebfcSJim Harris 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
28794143332SJim Harris 	    "timeout_period", CTLTYPE_UINT | CTLFLAG_RW, ctrlr, 0,
28894143332SJim Harris 	    nvme_sysctl_timeout_period, "IU",
28994143332SJim Harris 	    "Timeout period (in seconds)");
29094143332SJim Harris 
29194143332SJim Harris 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
2926568ebfcSJim Harris 	    "num_cmds", CTLTYPE_S64 | CTLFLAG_RD,
2936568ebfcSJim Harris 	    ctrlr, 0, nvme_sysctl_num_cmds, "IU",
2946568ebfcSJim Harris 	    "Number of commands submitted");
2956568ebfcSJim Harris 
2966568ebfcSJim Harris 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
2976568ebfcSJim Harris 	    "num_intr_handler_calls", CTLTYPE_S64 | CTLFLAG_RD,
2986568ebfcSJim Harris 	    ctrlr, 0, nvme_sysctl_num_intr_handler_calls, "IU",
2996568ebfcSJim Harris 	    "Number of times interrupt handler was invoked (will "
3006568ebfcSJim Harris 	    "typically be less than number of actual interrupts "
3016568ebfcSJim Harris 	    "generated due to coalescing)");
3026568ebfcSJim Harris 
3036568ebfcSJim Harris 	SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO,
3046568ebfcSJim Harris 	    "reset_stats", CTLTYPE_UINT | CTLFLAG_RW, ctrlr, 0,
3056568ebfcSJim Harris 	    nvme_sysctl_reset_stats, "IU", "Reset statistics to zero");
306bb0ec6b3SJim Harris 
307bb0ec6b3SJim Harris 	que_tree = SYSCTL_ADD_NODE(ctrlr_ctx, ctrlr_list, OID_AUTO, "adminq",
308bb0ec6b3SJim Harris 	    CTLFLAG_RD, NULL, "Admin Queue");
309bb0ec6b3SJim Harris 
310bb0ec6b3SJim Harris 	nvme_sysctl_initialize_queue(&ctrlr->adminq, ctrlr_ctx, que_tree);
311bb0ec6b3SJim Harris 
312bb0ec6b3SJim Harris 	for (i = 0; i < ctrlr->num_io_queues; i++) {
313bb0ec6b3SJim Harris 		snprintf(queue_name, QUEUE_NAME_LENGTH, "ioq%d", i);
314bb0ec6b3SJim Harris 		que_tree = SYSCTL_ADD_NODE(ctrlr_ctx, ctrlr_list, OID_AUTO,
315bb0ec6b3SJim Harris 		    queue_name, CTLFLAG_RD, NULL, "IO Queue");
316bb0ec6b3SJim Harris 		nvme_sysctl_initialize_queue(&ctrlr->ioq[i], ctrlr_ctx,
317bb0ec6b3SJim Harris 		    que_tree);
318bb0ec6b3SJim Harris 	}
319bb0ec6b3SJim Harris }
320