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> 30850564b9SWarner Losh #include "opt_nvme.h" 31850564b9SWarner Losh 32bb0ec6b3SJim Harris #include <sys/param.h> 33*d09ee08fSWarner Losh #include <sys/systm.h> 34bb0ec6b3SJim Harris #include <sys/bus.h> 35bb0ec6b3SJim Harris #include <sys/sysctl.h> 36bb0ec6b3SJim Harris 37bb0ec6b3SJim Harris #include "nvme_private.h" 38bb0ec6b3SJim Harris 39850564b9SWarner Losh #ifndef NVME_USE_NVD 40bdc81eedSWarner Losh #define NVME_USE_NVD 0 41850564b9SWarner Losh #endif 42850564b9SWarner Losh 43850564b9SWarner Losh int nvme_use_nvd = NVME_USE_NVD; 441071b50aSWarner Losh bool nvme_verbose_cmd_dump = false; 458a5d94f9SWarner Losh 467029da5cSPawel Biernacki SYSCTL_NODE(_hw, OID_AUTO, nvme, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 477029da5cSPawel Biernacki "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"); 501071b50aSWarner Losh SYSCTL_BOOL(_hw_nvme, OID_AUTO, verbose_cmd_dump, CTLFLAG_RWTUN, 511071b50aSWarner Losh &nvme_verbose_cmd_dump, 0, 525f8ccf65SGordon Bergling "enable verbose command printing when a command fails"); 538a5d94f9SWarner Losh 54bb0ec6b3SJim Harris static void 55bb0ec6b3SJim Harris nvme_dump_queue(struct nvme_qpair *qpair) 56bb0ec6b3SJim Harris { 57bb0ec6b3SJim Harris struct nvme_completion *cpl; 58bb0ec6b3SJim Harris struct nvme_command *cmd; 59bb0ec6b3SJim Harris int i; 60bb0ec6b3SJim Harris 61bb0ec6b3SJim Harris printf("id:%04Xh phase:%d\n", qpair->id, qpair->phase); 62bb0ec6b3SJim Harris 63bb0ec6b3SJim Harris printf("Completion queue:\n"); 64bb0ec6b3SJim Harris for (i = 0; i < qpair->num_entries; i++) { 65bb0ec6b3SJim Harris cpl = &qpair->cpl[i]; 66bb0ec6b3SJim Harris printf("%05d: ", i); 676f76d493SWarner Losh nvme_qpair_print_completion(qpair, cpl); 68bb0ec6b3SJim Harris } 69bb0ec6b3SJim Harris 70bb0ec6b3SJim Harris printf("Submission queue:\n"); 71bb0ec6b3SJim Harris for (i = 0; i < qpair->num_entries; i++) { 72bb0ec6b3SJim Harris cmd = &qpair->cmd[i]; 73bb0ec6b3SJim Harris printf("%05d: ", i); 747be0b068SWarner Losh nvme_qpair_print_command(qpair, cmd); 75bb0ec6b3SJim Harris } 76bb0ec6b3SJim Harris } 77bb0ec6b3SJim Harris 78bb0ec6b3SJim Harris static int 79bb0ec6b3SJim Harris nvme_sysctl_dump_debug(SYSCTL_HANDLER_ARGS) 80bb0ec6b3SJim Harris { 81bb0ec6b3SJim Harris struct nvme_qpair *qpair = arg1; 82bb0ec6b3SJim Harris uint32_t val = 0; 83bb0ec6b3SJim Harris 84bb0ec6b3SJim Harris int error = sysctl_handle_int(oidp, &val, 0, req); 85bb0ec6b3SJim Harris 86bb0ec6b3SJim Harris if (error) 87bb0ec6b3SJim Harris return (error); 88bb0ec6b3SJim Harris 89bb0ec6b3SJim Harris if (val != 0) 90bb0ec6b3SJim Harris nvme_dump_queue(qpair); 91bb0ec6b3SJim Harris 92bb0ec6b3SJim Harris return (0); 93bb0ec6b3SJim Harris } 94bb0ec6b3SJim Harris 95bb0ec6b3SJim Harris static int 96bb0ec6b3SJim Harris nvme_sysctl_int_coal_time(SYSCTL_HANDLER_ARGS) 97bb0ec6b3SJim Harris { 98bb0ec6b3SJim Harris struct nvme_controller *ctrlr = arg1; 99bb0ec6b3SJim Harris uint32_t oldval = ctrlr->int_coal_time; 100bb0ec6b3SJim Harris int error = sysctl_handle_int(oidp, &ctrlr->int_coal_time, 0, 101bb0ec6b3SJim Harris req); 102bb0ec6b3SJim Harris 103bb0ec6b3SJim Harris if (error) 104bb0ec6b3SJim Harris return (error); 105bb0ec6b3SJim Harris 106bb0ec6b3SJim Harris if (oldval != ctrlr->int_coal_time) 107bb0ec6b3SJim Harris nvme_ctrlr_cmd_set_interrupt_coalescing(ctrlr, 108bb0ec6b3SJim Harris ctrlr->int_coal_time, ctrlr->int_coal_threshold, NULL, 109bb0ec6b3SJim Harris NULL); 110bb0ec6b3SJim Harris 111bb0ec6b3SJim Harris return (0); 112bb0ec6b3SJim Harris } 113bb0ec6b3SJim Harris 114bb0ec6b3SJim Harris static int 115bb0ec6b3SJim Harris nvme_sysctl_int_coal_threshold(SYSCTL_HANDLER_ARGS) 116bb0ec6b3SJim Harris { 117bb0ec6b3SJim Harris struct nvme_controller *ctrlr = arg1; 118bb0ec6b3SJim Harris uint32_t oldval = ctrlr->int_coal_threshold; 119bb0ec6b3SJim Harris int error = sysctl_handle_int(oidp, &ctrlr->int_coal_threshold, 0, 120bb0ec6b3SJim Harris req); 121bb0ec6b3SJim Harris 122bb0ec6b3SJim Harris if (error) 123bb0ec6b3SJim Harris return (error); 124bb0ec6b3SJim Harris 125bb0ec6b3SJim Harris if (oldval != ctrlr->int_coal_threshold) 126bb0ec6b3SJim Harris nvme_ctrlr_cmd_set_interrupt_coalescing(ctrlr, 127bb0ec6b3SJim Harris ctrlr->int_coal_time, ctrlr->int_coal_threshold, NULL, 128bb0ec6b3SJim Harris NULL); 129bb0ec6b3SJim Harris 130bb0ec6b3SJim Harris return (0); 131bb0ec6b3SJim Harris } 132bb0ec6b3SJim Harris 13394143332SJim Harris static int 13494143332SJim Harris nvme_sysctl_timeout_period(SYSCTL_HANDLER_ARGS) 13594143332SJim Harris { 1368d6c0743SAlexander Motin uint32_t *ptr = arg1; 1378d6c0743SAlexander Motin uint32_t newval = *ptr; 1384053f8acSDavid Bright int error = sysctl_handle_int(oidp, &newval, 0, req); 13994143332SJim Harris 1404053f8acSDavid Bright if (error || (req->newptr == NULL)) 14194143332SJim Harris return (error); 14294143332SJim Harris 1434053f8acSDavid Bright if (newval > NVME_MAX_TIMEOUT_PERIOD || 1444053f8acSDavid Bright newval < NVME_MIN_TIMEOUT_PERIOD) { 14594143332SJim Harris return (EINVAL); 1464053f8acSDavid Bright } else { 1478d6c0743SAlexander Motin *ptr = newval; 14894143332SJim Harris } 14994143332SJim Harris 15094143332SJim Harris return (0); 15194143332SJim Harris } 15294143332SJim Harris 153bb0ec6b3SJim Harris static void 1546568ebfcSJim Harris nvme_qpair_reset_stats(struct nvme_qpair *qpair) 1556568ebfcSJim Harris { 1566568ebfcSJim Harris 1577d5eebe0SWarner Losh /* 1587d5eebe0SWarner Losh * Reset the values. Due to sanity checks in 1597d5eebe0SWarner Losh * nvme_qpair_process_completions, we reset the number of interrupt 1607d5eebe0SWarner Losh * calls to 1. 1617d5eebe0SWarner Losh */ 1626568ebfcSJim Harris qpair->num_cmds = 0; 1637d5eebe0SWarner Losh qpair->num_intr_handler_calls = 1; 164c37fc318SWarner Losh qpair->num_retries = 0; 1655e83c2ffSWarner Losh qpair->num_failures = 0; 166587aa255SWarner Losh qpair->num_ignored = 0; 1678052b01eSWarner Losh qpair->num_recovery_nolock = 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 2468052b01eSWarner Losh nvme_sysctl_num_recovery_nolock(SYSCTL_HANDLER_ARGS) 2478052b01eSWarner Losh { 2488052b01eSWarner Losh struct nvme_controller *ctrlr = arg1; 2498052b01eSWarner Losh int64_t num; 2508052b01eSWarner Losh int i; 2518052b01eSWarner Losh 2528052b01eSWarner Losh num = ctrlr->adminq.num_recovery_nolock; 2538052b01eSWarner Losh 2548052b01eSWarner Losh for (i = 0; i < ctrlr->num_io_queues; i++) 2558052b01eSWarner Losh num += ctrlr->ioq[i].num_recovery_nolock; 2568052b01eSWarner Losh 2578052b01eSWarner Losh return (sysctl_handle_64(oidp, &num, 0, req)); 2588052b01eSWarner Losh } 2598052b01eSWarner Losh 2608052b01eSWarner Losh static int 2616568ebfcSJim Harris nvme_sysctl_reset_stats(SYSCTL_HANDLER_ARGS) 2626568ebfcSJim Harris { 2636568ebfcSJim Harris struct nvme_controller *ctrlr = arg1; 2646568ebfcSJim Harris uint32_t i, val = 0; 2656568ebfcSJim Harris 2666568ebfcSJim Harris int error = sysctl_handle_int(oidp, &val, 0, req); 2676568ebfcSJim Harris 2686568ebfcSJim Harris if (error) 2696568ebfcSJim Harris return (error); 2706568ebfcSJim Harris 2716568ebfcSJim Harris if (val != 0) { 2726568ebfcSJim Harris nvme_qpair_reset_stats(&ctrlr->adminq); 2736568ebfcSJim Harris 2746568ebfcSJim Harris for (i = 0; i < ctrlr->num_io_queues; i++) 2756568ebfcSJim Harris nvme_qpair_reset_stats(&ctrlr->ioq[i]); 2766568ebfcSJim Harris } 2776568ebfcSJim Harris 2786568ebfcSJim Harris return (0); 2796568ebfcSJim Harris } 2806568ebfcSJim Harris 2816568ebfcSJim Harris static void 282bb0ec6b3SJim Harris nvme_sysctl_initialize_queue(struct nvme_qpair *qpair, 283bb0ec6b3SJim Harris struct sysctl_ctx_list *ctrlr_ctx, struct sysctl_oid *que_tree) 284bb0ec6b3SJim Harris { 285bb0ec6b3SJim Harris struct sysctl_oid_list *que_list = SYSCTL_CHILDREN(que_tree); 286bb0ec6b3SJim Harris 287bb0ec6b3SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "num_entries", 288bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->num_entries, 0, 289bb0ec6b3SJim Harris "Number of entries in hardware queue"); 29021b6da58SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "num_trackers", 29121b6da58SJim Harris CTLFLAG_RD, &qpair->num_trackers, 0, 29221b6da58SJim Harris "Number of trackers pre-allocated for this queue pair"); 293bb0ec6b3SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "sq_head", 294bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->sq_head, 0, 295bb0ec6b3SJim Harris "Current head of submission queue (as observed by driver)"); 296bb0ec6b3SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "sq_tail", 297bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->sq_tail, 0, 298bb0ec6b3SJim Harris "Current tail of submission queue (as observed by driver)"); 299bb0ec6b3SJim Harris SYSCTL_ADD_UINT(ctrlr_ctx, que_list, OID_AUTO, "cq_head", 300bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->cq_head, 0, 301bb0ec6b3SJim Harris "Current head of completion queue (as observed by driver)"); 302bb0ec6b3SJim Harris 303bb0ec6b3SJim Harris SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_cmds", 304bb0ec6b3SJim Harris CTLFLAG_RD, &qpair->num_cmds, "Number of commands submitted"); 3056568ebfcSJim Harris SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_intr_handler_calls", 3066568ebfcSJim Harris CTLFLAG_RD, &qpair->num_intr_handler_calls, 3076568ebfcSJim Harris "Number of times interrupt handler was invoked (will typically be " 3086568ebfcSJim Harris "less than number of actual interrupts generated due to " 3096568ebfcSJim Harris "coalescing)"); 310c37fc318SWarner Losh SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_retries", 311c37fc318SWarner Losh CTLFLAG_RD, &qpair->num_retries, "Number of commands retried"); 3125e83c2ffSWarner Losh SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_failures", 3135e83c2ffSWarner Losh CTLFLAG_RD, &qpair->num_failures, 3145e83c2ffSWarner Losh "Number of commands ending in failure after all retries"); 315587aa255SWarner Losh SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_ignored", 316587aa255SWarner Losh CTLFLAG_RD, &qpair->num_ignored, 317587aa255SWarner Losh "Number of interrupts posted, but were administratively ignored"); 3188052b01eSWarner Losh SYSCTL_ADD_QUAD(ctrlr_ctx, que_list, OID_AUTO, "num_recovery_nolock", 3198052b01eSWarner Losh CTLFLAG_RD, &qpair->num_recovery_nolock, 3208052b01eSWarner Losh "Number of times that we failed to lock recovery in the ISR"); 321bb0ec6b3SJim Harris 322bb0ec6b3SJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, que_list, OID_AUTO, 323b776de67SAlexander Motin "dump_debug", CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, 3247029da5cSPawel Biernacki qpair, 0, nvme_sysctl_dump_debug, "IU", "Dump debug data"); 325bb0ec6b3SJim Harris } 326bb0ec6b3SJim Harris 327bb0ec6b3SJim Harris void 328bb0ec6b3SJim Harris nvme_sysctl_initialize_ctrlr(struct nvme_controller *ctrlr) 329bb0ec6b3SJim Harris { 330bb0ec6b3SJim Harris struct sysctl_ctx_list *ctrlr_ctx; 331bb0ec6b3SJim Harris struct sysctl_oid *ctrlr_tree, *que_tree; 332bb0ec6b3SJim Harris struct sysctl_oid_list *ctrlr_list; 333bb0ec6b3SJim Harris #define QUEUE_NAME_LENGTH 16 334bb0ec6b3SJim Harris char queue_name[QUEUE_NAME_LENGTH]; 335bb0ec6b3SJim Harris int i; 336bb0ec6b3SJim Harris 337bb0ec6b3SJim Harris ctrlr_ctx = device_get_sysctl_ctx(ctrlr->dev); 338bb0ec6b3SJim Harris ctrlr_tree = device_get_sysctl_tree(ctrlr->dev); 339bb0ec6b3SJim Harris ctrlr_list = SYSCTL_CHILDREN(ctrlr_tree); 340bb0ec6b3SJim Harris 3411eab19cbSAlexander Motin SYSCTL_ADD_UINT(ctrlr_ctx, ctrlr_list, OID_AUTO, "num_io_queues", 3421eab19cbSAlexander Motin CTLFLAG_RD, &ctrlr->num_io_queues, 0, 3431eab19cbSAlexander Motin "Number of I/O queue pairs"); 34450dea2daSJim Harris 345bb0ec6b3SJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 346b776de67SAlexander Motin "int_coal_time", CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, 3477029da5cSPawel Biernacki ctrlr, 0, nvme_sysctl_int_coal_time, "IU", 348bb0ec6b3SJim Harris "Interrupt coalescing timeout (in microseconds)"); 349bb0ec6b3SJim Harris 350bb0ec6b3SJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 3517029da5cSPawel Biernacki "int_coal_threshold", 352b776de67SAlexander Motin CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, ctrlr, 0, 353bb0ec6b3SJim Harris nvme_sysctl_int_coal_threshold, "IU", 354bb0ec6b3SJim Harris "Interrupt coalescing threshold"); 3556568ebfcSJim Harris 3566568ebfcSJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 3578d6c0743SAlexander Motin "admin_timeout_period", CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, 3588d6c0743SAlexander Motin &ctrlr->admin_timeout_period, 0, nvme_sysctl_timeout_period, "IU", 3598d6c0743SAlexander Motin "Timeout period for Admin queue (in seconds)"); 3608d6c0743SAlexander Motin 3618d6c0743SAlexander Motin SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 362b776de67SAlexander Motin "timeout_period", CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, 3638d6c0743SAlexander Motin &ctrlr->timeout_period, 0, nvme_sysctl_timeout_period, "IU", 3648d6c0743SAlexander Motin "Timeout period for I/O queues (in seconds)"); 36594143332SJim Harris 36694143332SJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 367b776de67SAlexander Motin "num_cmds", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 3686568ebfcSJim Harris ctrlr, 0, nvme_sysctl_num_cmds, "IU", 3696568ebfcSJim Harris "Number of commands submitted"); 3706568ebfcSJim Harris 3716568ebfcSJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 3727029da5cSPawel Biernacki "num_intr_handler_calls", 373b776de67SAlexander Motin CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, ctrlr, 0, 3747029da5cSPawel Biernacki nvme_sysctl_num_intr_handler_calls, "IU", 3756568ebfcSJim Harris "Number of times interrupt handler was invoked (will " 3766568ebfcSJim Harris "typically be less than number of actual interrupts " 3776568ebfcSJim Harris "generated due to coalescing)"); 3786568ebfcSJim Harris 3796568ebfcSJim Harris SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 380b776de67SAlexander Motin "num_retries", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 381c37fc318SWarner Losh ctrlr, 0, nvme_sysctl_num_retries, "IU", 382c37fc318SWarner Losh "Number of commands retried"); 383c37fc318SWarner Losh 384c37fc318SWarner Losh SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 385b776de67SAlexander Motin "num_failures", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 3865e83c2ffSWarner Losh ctrlr, 0, nvme_sysctl_num_failures, "IU", 3875e83c2ffSWarner Losh "Number of commands ending in failure after all retries"); 3885e83c2ffSWarner Losh 3895e83c2ffSWarner Losh SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 390587aa255SWarner Losh "num_ignored", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 391587aa255SWarner Losh ctrlr, 0, nvme_sysctl_num_ignored, "IU", 392587aa255SWarner Losh "Number of interrupts ignored administratively"); 393587aa255SWarner Losh 394587aa255SWarner Losh SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 3958052b01eSWarner Losh "num_recovery_nolock", CTLTYPE_S64 | CTLFLAG_RD | CTLFLAG_MPSAFE, 3968052b01eSWarner Losh ctrlr, 0, nvme_sysctl_num_recovery_nolock, "IU", 3978052b01eSWarner Losh "Number of times that we failed to lock recovery in the ISR"); 3988052b01eSWarner Losh 3998052b01eSWarner Losh SYSCTL_ADD_PROC(ctrlr_ctx, ctrlr_list, OID_AUTO, 400b776de67SAlexander Motin "reset_stats", CTLTYPE_UINT | CTLFLAG_RW | CTLFLAG_MPSAFE, ctrlr, 4017029da5cSPawel Biernacki 0, nvme_sysctl_reset_stats, "IU", "Reset statistics to zero"); 402bb0ec6b3SJim Harris 403161fcf79SWarner Losh SYSCTL_ADD_UINT(ctrlr_ctx, ctrlr_list, OID_AUTO, "cap_lo", 404161fcf79SWarner Losh CTLFLAG_RD, &ctrlr->cap_lo, 0, 405161fcf79SWarner Losh "Low 32-bits of capacities for the drive"); 406161fcf79SWarner Losh 407161fcf79SWarner Losh SYSCTL_ADD_UINT(ctrlr_ctx, ctrlr_list, OID_AUTO, "cap_hi", 408161fcf79SWarner Losh CTLFLAG_RD, &ctrlr->cap_hi, 0, 409161fcf79SWarner Losh "Hi 32-bits of capacities for the drive"); 410161fcf79SWarner Losh 411bb0ec6b3SJim Harris que_tree = SYSCTL_ADD_NODE(ctrlr_ctx, ctrlr_list, OID_AUTO, "adminq", 4127029da5cSPawel Biernacki CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Admin Queue"); 413bb0ec6b3SJim Harris 414bb0ec6b3SJim Harris nvme_sysctl_initialize_queue(&ctrlr->adminq, ctrlr_ctx, que_tree); 415bb0ec6b3SJim Harris 416bb0ec6b3SJim Harris for (i = 0; i < ctrlr->num_io_queues; i++) { 417bb0ec6b3SJim Harris snprintf(queue_name, QUEUE_NAME_LENGTH, "ioq%d", i); 418bb0ec6b3SJim Harris que_tree = SYSCTL_ADD_NODE(ctrlr_ctx, ctrlr_list, OID_AUTO, 4197029da5cSPawel Biernacki queue_name, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "IO Queue"); 420bb0ec6b3SJim Harris nvme_sysctl_initialize_queue(&ctrlr->ioq[i], ctrlr_ctx, 421bb0ec6b3SJim Harris que_tree); 422bb0ec6b3SJim Harris } 423*d09ee08fSWarner Losh 424*d09ee08fSWarner Losh SYSCTL_ADD_COUNTER_U64(ctrlr_ctx, ctrlr_list, OID_AUTO, "alignment_splits", 425*d09ee08fSWarner Losh CTLFLAG_RD, &ctrlr->alignment_splits, 426*d09ee08fSWarner Losh "Number of times we split the I/O alignment for drives with preferred alignment"); 427bb0ec6b3SJim Harris } 428