1bb0ec6b3SJim Harris /*- 24d846d26SWarner Losh * SPDX-License-Identifier: BSD-2-Clause 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 41bdc81eedSWarner Losh #define NVME_USE_NVD 0 42850564b9SWarner Losh #endif 43850564b9SWarner Losh 44850564b9SWarner Losh int nvme_use_nvd = NVME_USE_NVD; 451071b50aSWarner Losh bool nvme_verbose_cmd_dump = false; 468a5d94f9SWarner Losh 477029da5cSPawel Biernacki SYSCTL_NODE(_hw, OID_AUTO, nvme, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 487029da5cSPawel Biernacki "NVMe sysctl tunables"); 498a5d94f9SWarner Losh SYSCTL_INT(_hw_nvme, OID_AUTO, use_nvd, CTLFLAG_RDTUN, 508a5d94f9SWarner Losh &nvme_use_nvd, 1, "1 = Create NVD devices, 0 = Create NDA devices"); 511071b50aSWarner Losh SYSCTL_BOOL(_hw_nvme, OID_AUTO, verbose_cmd_dump, CTLFLAG_RWTUN, 521071b50aSWarner Losh &nvme_verbose_cmd_dump, 0, 535f8ccf65SGordon Bergling "enable verbose command printing when a command fails"); 548a5d94f9SWarner Losh 55bb0ec6b3SJim Harris static void 56bb0ec6b3SJim Harris nvme_dump_queue(struct nvme_qpair *qpair) 57bb0ec6b3SJim Harris { 58bb0ec6b3SJim Harris struct nvme_completion *cpl; 59bb0ec6b3SJim Harris struct nvme_command *cmd; 60bb0ec6b3SJim Harris int i; 61bb0ec6b3SJim Harris 62bb0ec6b3SJim Harris printf("id:%04Xh phase:%d\n", qpair->id, qpair->phase); 63bb0ec6b3SJim Harris 64bb0ec6b3SJim Harris printf("Completion queue:\n"); 65bb0ec6b3SJim Harris for (i = 0; i < qpair->num_entries; i++) { 66bb0ec6b3SJim Harris cpl = &qpair->cpl[i]; 67bb0ec6b3SJim Harris printf("%05d: ", i); 686f76d493SWarner Losh nvme_qpair_print_completion(qpair, cpl); 69bb0ec6b3SJim Harris } 70bb0ec6b3SJim Harris 71bb0ec6b3SJim Harris printf("Submission queue:\n"); 72bb0ec6b3SJim Harris for (i = 0; i < qpair->num_entries; i++) { 73bb0ec6b3SJim Harris cmd = &qpair->cmd[i]; 74bb0ec6b3SJim Harris printf("%05d: ", i); 75*7be0b068SWarner Losh nvme_qpair_print_command(qpair, cmd); 76bb0ec6b3SJim Harris } 77bb0ec6b3SJim Harris } 78bb0ec6b3SJim Harris 79bb0ec6b3SJim Harris static int 80bb0ec6b3SJim Harris nvme_sysctl_dump_debug(SYSCTL_HANDLER_ARGS) 81bb0ec6b3SJim Harris { 82bb0ec6b3SJim Harris struct nvme_qpair *qpair = arg1; 83bb0ec6b3SJim Harris uint32_t val = 0; 84bb0ec6b3SJim Harris 85bb0ec6b3SJim Harris int error = sysctl_handle_int(oidp, &val, 0, req); 86bb0ec6b3SJim Harris 87bb0ec6b3SJim Harris if (error) 88bb0ec6b3SJim Harris return (error); 89bb0ec6b3SJim Harris 90bb0ec6b3SJim Harris if (val != 0) 91bb0ec6b3SJim Harris nvme_dump_queue(qpair); 92bb0ec6b3SJim Harris 93bb0ec6b3SJim Harris return (0); 94bb0ec6b3SJim Harris } 95bb0ec6b3SJim Harris 96bb0ec6b3SJim Harris static int 97bb0ec6b3SJim Harris nvme_sysctl_int_coal_time(SYSCTL_HANDLER_ARGS) 98bb0ec6b3SJim Harris { 99bb0ec6b3SJim Harris struct nvme_controller *ctrlr = arg1; 100bb0ec6b3SJim Harris uint32_t oldval = ctrlr->int_coal_time; 101bb0ec6b3SJim Harris int error = sysctl_handle_int(oidp, &ctrlr->int_coal_time, 0, 102bb0ec6b3SJim Harris req); 103bb0ec6b3SJim Harris 104bb0ec6b3SJim Harris if (error) 105bb0ec6b3SJim Harris return (error); 106bb0ec6b3SJim Harris 107bb0ec6b3SJim Harris if (oldval != ctrlr->int_coal_time) 108bb0ec6b3SJim Harris nvme_ctrlr_cmd_set_interrupt_coalescing(ctrlr, 109bb0ec6b3SJim Harris ctrlr->int_coal_time, ctrlr->int_coal_threshold, NULL, 110bb0ec6b3SJim Harris NULL); 111bb0ec6b3SJim Harris 112bb0ec6b3SJim Harris return (0); 113bb0ec6b3SJim Harris } 114bb0ec6b3SJim Harris 115bb0ec6b3SJim Harris static int 116bb0ec6b3SJim Harris nvme_sysctl_int_coal_threshold(SYSCTL_HANDLER_ARGS) 117bb0ec6b3SJim Harris { 118bb0ec6b3SJim Harris struct nvme_controller *ctrlr = arg1; 119bb0ec6b3SJim Harris uint32_t oldval = ctrlr->int_coal_threshold; 120bb0ec6b3SJim Harris int error = sysctl_handle_int(oidp, &ctrlr->int_coal_threshold, 0, 121bb0ec6b3SJim Harris req); 122bb0ec6b3SJim Harris 123bb0ec6b3SJim Harris if (error) 124bb0ec6b3SJim Harris return (error); 125bb0ec6b3SJim Harris 126bb0ec6b3SJim Harris if (oldval != ctrlr->int_coal_threshold) 127bb0ec6b3SJim Harris nvme_ctrlr_cmd_set_interrupt_coalescing(ctrlr, 128bb0ec6b3SJim Harris ctrlr->int_coal_time, ctrlr->int_coal_threshold, NULL, 129bb0ec6b3SJim Harris NULL); 130bb0ec6b3SJim Harris 131bb0ec6b3SJim Harris return (0); 132bb0ec6b3SJim Harris } 133bb0ec6b3SJim Harris 13494143332SJim Harris static int 13594143332SJim Harris nvme_sysctl_timeout_period(SYSCTL_HANDLER_ARGS) 13694143332SJim Harris { 13794143332SJim Harris struct nvme_controller *ctrlr = arg1; 1384053f8acSDavid Bright uint32_t newval = ctrlr->timeout_period; 1394053f8acSDavid Bright int error = sysctl_handle_int(oidp, &newval, 0, req); 14094143332SJim Harris 1414053f8acSDavid Bright if (error || (req->newptr == NULL)) 14294143332SJim Harris return (error); 14394143332SJim Harris 1444053f8acSDavid Bright if (newval > NVME_MAX_TIMEOUT_PERIOD || 1454053f8acSDavid Bright newval < NVME_MIN_TIMEOUT_PERIOD) { 14694143332SJim Harris return (EINVAL); 1474053f8acSDavid Bright } else { 1484053f8acSDavid Bright ctrlr->timeout_period = newval; 14994143332SJim Harris } 15094143332SJim Harris 15194143332SJim Harris return (0); 15294143332SJim Harris } 15394143332SJim Harris 154bb0ec6b3SJim Harris static void 1556568ebfcSJim Harris nvme_qpair_reset_stats(struct nvme_qpair *qpair) 1566568ebfcSJim Harris { 1576568ebfcSJim Harris 1587d5eebe0SWarner Losh /* 1597d5eebe0SWarner Losh * Reset the values. Due to sanity checks in 1607d5eebe0SWarner Losh * nvme_qpair_process_completions, we reset the number of interrupt 1617d5eebe0SWarner Losh * calls to 1. 1627d5eebe0SWarner Losh */ 1636568ebfcSJim Harris qpair->num_cmds = 0; 1647d5eebe0SWarner Losh qpair->num_intr_handler_calls = 1; 165c37fc318SWarner Losh qpair->num_retries = 0; 1665e83c2ffSWarner Losh qpair->num_failures = 0; 167587aa255SWarner Losh qpair->num_ignored = 0; 1686568ebfcSJim Harris } 1696568ebfcSJim Harris 1706568ebfcSJim Harris static int 1716568ebfcSJim Harris nvme_sysctl_num_cmds(SYSCTL_HANDLER_ARGS) 1726568ebfcSJim Harris { 1736568ebfcSJim Harris struct nvme_controller *ctrlr = arg1; 1746568ebfcSJim Harris int64_t num_cmds = 0; 1756568ebfcSJim Harris int i; 1766568ebfcSJim Harris 1776568ebfcSJim Harris num_cmds = ctrlr->adminq.num_cmds; 1786568ebfcSJim Harris 1796568ebfcSJim Harris for (i = 0; i < ctrlr->num_io_queues; i++) 1806568ebfcSJim Harris num_cmds += ctrlr->ioq[i].num_cmds; 1816568ebfcSJim Harris 1826568ebfcSJim Harris return (sysctl_handle_64(oidp, &num_cmds, 0, req)); 1836568ebfcSJim Harris } 1846568ebfcSJim Harris 1856568ebfcSJim Harris static int 1866568ebfcSJim Harris nvme_sysctl_num_intr_handler_calls(SYSCTL_HANDLER_ARGS) 1876568ebfcSJim Harris { 1886568ebfcSJim Harris struct nvme_controller *ctrlr = arg1; 1896568ebfcSJim Harris int64_t num_intr_handler_calls = 0; 1906568ebfcSJim Harris int i; 1916568ebfcSJim Harris 1926568ebfcSJim Harris num_intr_handler_calls = ctrlr->adminq.num_intr_handler_calls; 1936568ebfcSJim Harris 1946568ebfcSJim Harris for (i = 0; i < ctrlr->num_io_queues; i++) 1956568ebfcSJim Harris num_intr_handler_calls += ctrlr->ioq[i].num_intr_handler_calls; 1966568ebfcSJim Harris 1976568ebfcSJim Harris return (sysctl_handle_64(oidp, &num_intr_handler_calls, 0, req)); 1986568ebfcSJim Harris } 1996568ebfcSJim Harris 2006568ebfcSJim Harris static int 201c37fc318SWarner Losh nvme_sysctl_num_retries(SYSCTL_HANDLER_ARGS) 202c37fc318SWarner Losh { 203c37fc318SWarner Losh struct nvme_controller *ctrlr = arg1; 204c37fc318SWarner Losh int64_t num_retries = 0; 205c37fc318SWarner Losh int i; 206c37fc318SWarner Losh 207c37fc318SWarner Losh num_retries = ctrlr->adminq.num_retries; 208c37fc318SWarner Losh 209c37fc318SWarner Losh for (i = 0; i < ctrlr->num_io_queues; i++) 210c37fc318SWarner Losh num_retries += ctrlr->ioq[i].num_retries; 211c37fc318SWarner Losh 212c37fc318SWarner Losh return (sysctl_handle_64(oidp, &num_retries, 0, req)); 213c37fc318SWarner Losh } 214c37fc318SWarner Losh 215c37fc318SWarner Losh static int 2165e83c2ffSWarner Losh nvme_sysctl_num_failures(SYSCTL_HANDLER_ARGS) 2175e83c2ffSWarner Losh { 2185e83c2ffSWarner Losh struct nvme_controller *ctrlr = arg1; 2195e83c2ffSWarner Losh int64_t num_failures = 0; 2205e83c2ffSWarner Losh int i; 2215e83c2ffSWarner Losh 2225e83c2ffSWarner Losh num_failures = ctrlr->adminq.num_failures; 2235e83c2ffSWarner Losh 2245e83c2ffSWarner Losh for (i = 0; i < ctrlr->num_io_queues; i++) 2255e83c2ffSWarner Losh num_failures += ctrlr->ioq[i].num_failures; 2265e83c2ffSWarner Losh 2275e83c2ffSWarner Losh return (sysctl_handle_64(oidp, &num_failures, 0, req)); 2285e83c2ffSWarner Losh } 2295e83c2ffSWarner Losh 2305e83c2ffSWarner Losh static int 231587aa255SWarner Losh nvme_sysctl_num_ignored(SYSCTL_HANDLER_ARGS) 232587aa255SWarner Losh { 233587aa255SWarner Losh struct nvme_controller *ctrlr = arg1; 234587aa255SWarner Losh int64_t num_ignored = 0; 235587aa255SWarner Losh int i; 236587aa255SWarner Losh 237587aa255SWarner Losh num_ignored = ctrlr->adminq.num_ignored; 238587aa255SWarner Losh 239587aa255SWarner Losh for (i = 0; i < ctrlr->num_io_queues; i++) 240587aa255SWarner Losh num_ignored += ctrlr->ioq[i].num_ignored; 241587aa255SWarner Losh 242587aa255SWarner Losh return (sysctl_handle_64(oidp, &num_ignored, 0, req)); 243587aa255SWarner Losh } 244587aa255SWarner Losh 245587aa255SWarner Losh static int 2466568ebfcSJim Harris nvme_sysctl_reset_stats(SYSCTL_HANDLER_ARGS) 2476568ebfcSJim Harris { 2486568ebfcSJim Harris struct nvme_controller *ctrlr = arg1; 2496568ebfcSJim Harris uint32_t i, val = 0; 2506568ebfcSJim Harris 2516568ebfcSJim Harris int error = sysctl_handle_int(oidp, &val, 0, req); 2526568ebfcSJim Harris 2536568ebfcSJim Harris if (error) 2546568ebfcSJim Harris return (error); 2556568ebfcSJim Harris 2566568ebfcSJim Harris if (val != 0) { 2576568ebfcSJim Harris nvme_qpair_reset_stats(&ctrlr->adminq); 2586568ebfcSJim Harris 2596568ebfcSJim Harris for (i = 0; i < ctrlr->num_io_queues; i++) 2606568ebfcSJim Harris nvme_qpair_reset_stats(&ctrlr->ioq[i]); 2616568ebfcSJim Harris } 2626568ebfcSJim Harris 2636568ebfcSJim Harris return (0); 2646568ebfcSJim Harris } 2656568ebfcSJim Harris 2666568ebfcSJim Harris static void 267bb0ec6b3SJim Harris nvme_sysctl_initialize_queue(struct nvme_qpair *qpair, 268bb0ec6b3SJim Harris struct sysctl_ctx_list *ctrlr_ctx, struct sysctl_oid *que_tree) 269bb0ec6b3SJim Harris { 270bb0ec6b3SJim Harris struct sysctl_oid_list *que_list = SYSCTL_CHILDREN(que_tree); 271bb0ec6b3SJim Harris 272bb0ec6b3SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "num_entries", 273bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->num_entries, 0, 274bb0ec6b3SJim Harris "Number of entries in hardware queue"); 27521b6da58SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "num_trackers", 27621b6da58SJim Harris CTLFLAG_RD, &qpair->num_trackers, 0, 27721b6da58SJim Harris "Number of trackers pre-allocated for this queue pair"); 278bb0ec6b3SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "sq_head", 279bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->sq_head, 0, 280bb0ec6b3SJim Harris "Current head of submission queue (as observed by driver)"); 281bb0ec6b3SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "sq_tail", 282bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->sq_tail, 0, 283bb0ec6b3SJim Harris "Current tail of submission queue (as observed by driver)"); 284bb0ec6b3SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "cq_head", 285bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->cq_head, 0, 286bb0ec6b3SJim Harris "Current head of completion queue (as observed by driver)"); 287bb0ec6b3SJim Harris 288bb0ec6b3SJim Harris SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_cmds", 289bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->num_cmds, "Number of commands submitted"); 2906568ebfcSJim Harris SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_intr_handler_calls", 2916568ebfcSJim Harris CTLFLAG_RD, &qpair->num_intr_handler_calls, 2926568ebfcSJim Harris "Number of times interrupt handler was invoked (will typically be " 2936568ebfcSJim Harris "less than number of actual interrupts generated due to " 2946568ebfcSJim Harris "coalescing)"); 295c37fc318SWarner Losh SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_retries", 296c37fc318SWarner Losh CTLFLAG_RD, &qpair->num_retries, "Number of commands retried"); 2975e83c2ffSWarner Losh SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_failures", 2985e83c2ffSWarner Losh CTLFLAG_RD, &qpair->num_failures, 2995e83c2ffSWarner Losh "Number of commands ending in failure after all retries"); 300587aa255SWarner Losh SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_ignored", 301587aa255SWarner Losh CTLFLAG_RD, &qpair->num_ignored, 302587aa255SWarner Losh "Number of interrupts posted, but were administratively ignored"); 303bb0ec6b3SJim Harris 304bb0ec6b3SJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, que_list, OID_AUTO, 305b776de67SAlexander Motin "dump_debug", CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, 3067029da5cSPawel Biernacki qpair, 0, nvme_sysctl_dump_debug, "IU", "Dump debug data"); 307bb0ec6b3SJim Harris } 308bb0ec6b3SJim Harris 309bb0ec6b3SJim Harris void 310bb0ec6b3SJim Harris nvme_sysctl_initialize_ctrlr(struct nvme_controller *ctrlr) 311bb0ec6b3SJim Harris { 312bb0ec6b3SJim Harris struct sysctl_ctx_list *ctrlr_ctx; 313bb0ec6b3SJim Harris struct sysctl_oid *ctrlr_tree, *que_tree; 314bb0ec6b3SJim Harris struct sysctl_oid_list *ctrlr_list; 315bb0ec6b3SJim Harris #define QUEUE_NAME_LENGTH 16 316bb0ec6b3SJim Harris char queue_name[QUEUE_NAME_LENGTH]; 317bb0ec6b3SJim Harris int i; 318bb0ec6b3SJim Harris 319bb0ec6b3SJim Harris ctrlr_ctx = device_get_sysctl_ctx(ctrlr->dev); 320bb0ec6b3SJim Harris ctrlr_tree = device_get_sysctl_tree(ctrlr->dev); 321bb0ec6b3SJim Harris ctrlr_list = SYSCTL_CHILDREN(ctrlr_tree); 322bb0ec6b3SJim Harris 3231eab19cbSAlexander Motin SYSCTL_ADD_UINT(ctrlr_ctx, ctrlr_list, OID_AUTO, "num_io_queues", 3241eab19cbSAlexander Motin CTLFLAG_RD, &ctrlr->num_io_queues, 0, 3251eab19cbSAlexander Motin "Number of I/O queue pairs"); 32650dea2daSJim Harris 327bb0ec6b3SJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 328b776de67SAlexander Motin "int_coal_time", CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, 3297029da5cSPawel Biernacki ctrlr, 0, nvme_sysctl_int_coal_time, "IU", 330bb0ec6b3SJim Harris "Interrupt coalescing timeout (in microseconds)"); 331bb0ec6b3SJim Harris 332bb0ec6b3SJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 3337029da5cSPawel Biernacki "int_coal_threshold", 334b776de67SAlexander Motin CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, ctrlr, 0, 335bb0ec6b3SJim Harris nvme_sysctl_int_coal_threshold, "IU", 336bb0ec6b3SJim Harris "Interrupt coalescing threshold"); 3376568ebfcSJim Harris 3386568ebfcSJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 339b776de67SAlexander Motin "timeout_period", CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, 3407029da5cSPawel Biernacki ctrlr, 0, nvme_sysctl_timeout_period, "IU", 34194143332SJim Harris "Timeout period (in seconds)"); 34294143332SJim Harris 34394143332SJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 344b776de67SAlexander Motin "num_cmds", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 3456568ebfcSJim Harris ctrlr, 0, nvme_sysctl_num_cmds, "IU", 3466568ebfcSJim Harris "Number of commands submitted"); 3476568ebfcSJim Harris 3486568ebfcSJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 3497029da5cSPawel Biernacki "num_intr_handler_calls", 350b776de67SAlexander Motin CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, ctrlr, 0, 3517029da5cSPawel Biernacki nvme_sysctl_num_intr_handler_calls, "IU", 3526568ebfcSJim Harris "Number of times interrupt handler was invoked (will " 3536568ebfcSJim Harris "typically be less than number of actual interrupts " 3546568ebfcSJim Harris "generated due to coalescing)"); 3556568ebfcSJim Harris 3566568ebfcSJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 357b776de67SAlexander Motin "num_retries", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 358c37fc318SWarner Losh ctrlr, 0, nvme_sysctl_num_retries, "IU", 359c37fc318SWarner Losh "Number of commands retried"); 360c37fc318SWarner Losh 361c37fc318SWarner Losh SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 362b776de67SAlexander Motin "num_failures", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 3635e83c2ffSWarner Losh ctrlr, 0, nvme_sysctl_num_failures, "IU", 3645e83c2ffSWarner Losh "Number of commands ending in failure after all retries"); 3655e83c2ffSWarner Losh 3665e83c2ffSWarner Losh SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 367587aa255SWarner Losh "num_ignored", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 368587aa255SWarner Losh ctrlr, 0, nvme_sysctl_num_ignored, "IU", 369587aa255SWarner Losh "Number of interrupts ignored administratively"); 370587aa255SWarner Losh 371587aa255SWarner Losh SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 372b776de67SAlexander Motin "reset_stats", CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, ctrlr, 3737029da5cSPawel Biernacki 0, nvme_sysctl_reset_stats, "IU", "Reset statistics to zero"); 374bb0ec6b3SJim Harris 375161fcf79SWarner Losh SYSCTL_ADD_UINT(ctrlr_ctx, ctrlr_list, OID_AUTO, "cap_lo", 376161fcf79SWarner Losh CTLFLAG_RD, &ctrlr->cap_lo, 0, 377161fcf79SWarner Losh "Low 32-bits of capacities for the drive"); 378161fcf79SWarner Losh 379161fcf79SWarner Losh SYSCTL_ADD_UINT(ctrlr_ctx, ctrlr_list, OID_AUTO, "cap_hi", 380161fcf79SWarner Losh CTLFLAG_RD, &ctrlr->cap_hi, 0, 381161fcf79SWarner Losh "Hi 32-bits of capacities for the drive"); 382161fcf79SWarner Losh 383bb0ec6b3SJim Harris que_tree = SYSCTL_ADD_NODE(ctrlr_ctx, ctrlr_list, OID_AUTO, "adminq", 3847029da5cSPawel Biernacki CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Admin Queue"); 385bb0ec6b3SJim Harris 386bb0ec6b3SJim Harris nvme_sysctl_initialize_queue(&ctrlr->adminq, ctrlr_ctx, que_tree); 387bb0ec6b3SJim Harris 388bb0ec6b3SJim Harris for (i = 0; i < ctrlr->num_io_queues; i++) { 389bb0ec6b3SJim Harris snprintf(queue_name, QUEUE_NAME_LENGTH, "ioq%d", i); 390bb0ec6b3SJim Harris que_tree = SYSCTL_ADD_NODE(ctrlr_ctx, ctrlr_list, OID_AUTO, 3917029da5cSPawel Biernacki queue_name, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "IO Queue"); 392bb0ec6b3SJim Harris nvme_sysctl_initialize_queue(&ctrlr->ioq[i], ctrlr_ctx, 393bb0ec6b3SJim Harris que_tree); 394bb0ec6b3SJim Harris } 395bb0ec6b3SJim Harris } 396