1*9b8d05b8SZbigniew Bodek /*- 2*9b8d05b8SZbigniew Bodek * BSD LICENSE 3*9b8d05b8SZbigniew Bodek * 4*9b8d05b8SZbigniew Bodek * Copyright (c) 2015-2017 Amazon.com, Inc. or its affiliates. 5*9b8d05b8SZbigniew Bodek * All rights reserved. 6*9b8d05b8SZbigniew Bodek * 7*9b8d05b8SZbigniew Bodek * Redistribution and use in source and binary forms, with or without 8*9b8d05b8SZbigniew Bodek * modification, are permitted provided that the following conditions 9*9b8d05b8SZbigniew Bodek * are met: 10*9b8d05b8SZbigniew Bodek * 11*9b8d05b8SZbigniew Bodek * 1. Redistributions of source code must retain the above copyright 12*9b8d05b8SZbigniew Bodek * notice, this list of conditions and the following disclaimer. 13*9b8d05b8SZbigniew Bodek * 14*9b8d05b8SZbigniew Bodek * 2. Redistributions in binary form must reproduce the above copyright 15*9b8d05b8SZbigniew Bodek * notice, this list of conditions and the following disclaimer in the 16*9b8d05b8SZbigniew Bodek * documentation and/or other materials provided with the distribution. 17*9b8d05b8SZbigniew Bodek * 18*9b8d05b8SZbigniew Bodek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19*9b8d05b8SZbigniew Bodek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20*9b8d05b8SZbigniew Bodek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21*9b8d05b8SZbigniew Bodek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22*9b8d05b8SZbigniew Bodek * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23*9b8d05b8SZbigniew Bodek * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24*9b8d05b8SZbigniew Bodek * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25*9b8d05b8SZbigniew Bodek * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26*9b8d05b8SZbigniew Bodek * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27*9b8d05b8SZbigniew Bodek * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28*9b8d05b8SZbigniew Bodek * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29*9b8d05b8SZbigniew Bodek */ 30*9b8d05b8SZbigniew Bodek #include <sys/cdefs.h> 31*9b8d05b8SZbigniew Bodek __FBSDID("$FreeBSD$"); 32*9b8d05b8SZbigniew Bodek 33*9b8d05b8SZbigniew Bodek #include "ena_sysctl.h" 34*9b8d05b8SZbigniew Bodek 35*9b8d05b8SZbigniew Bodek static int ena_sysctl_update_stats(SYSCTL_HANDLER_ARGS); 36*9b8d05b8SZbigniew Bodek static void ena_sysctl_add_stats(struct ena_adapter *); 37*9b8d05b8SZbigniew Bodek 38*9b8d05b8SZbigniew Bodek void 39*9b8d05b8SZbigniew Bodek ena_sysctl_add_nodes(struct ena_adapter *adapter) 40*9b8d05b8SZbigniew Bodek { 41*9b8d05b8SZbigniew Bodek ena_sysctl_add_stats(adapter); 42*9b8d05b8SZbigniew Bodek } 43*9b8d05b8SZbigniew Bodek 44*9b8d05b8SZbigniew Bodek static void 45*9b8d05b8SZbigniew Bodek ena_sysctl_add_stats(struct ena_adapter *adapter) 46*9b8d05b8SZbigniew Bodek { 47*9b8d05b8SZbigniew Bodek device_t dev; 48*9b8d05b8SZbigniew Bodek 49*9b8d05b8SZbigniew Bodek struct ena_ring *tx_ring; 50*9b8d05b8SZbigniew Bodek struct ena_ring *rx_ring; 51*9b8d05b8SZbigniew Bodek 52*9b8d05b8SZbigniew Bodek struct ena_hw_stats *hw_stats; 53*9b8d05b8SZbigniew Bodek struct ena_stats_dev *dev_stats; 54*9b8d05b8SZbigniew Bodek struct ena_stats_tx *tx_stats; 55*9b8d05b8SZbigniew Bodek struct ena_stats_rx *rx_stats; 56*9b8d05b8SZbigniew Bodek struct ena_com_stats_admin *admin_stats; 57*9b8d05b8SZbigniew Bodek 58*9b8d05b8SZbigniew Bodek struct sysctl_ctx_list *ctx; 59*9b8d05b8SZbigniew Bodek struct sysctl_oid *tree; 60*9b8d05b8SZbigniew Bodek struct sysctl_oid_list *child; 61*9b8d05b8SZbigniew Bodek 62*9b8d05b8SZbigniew Bodek struct sysctl_oid *queue_node, *tx_node, *rx_node, *hw_node; 63*9b8d05b8SZbigniew Bodek struct sysctl_oid *admin_node; 64*9b8d05b8SZbigniew Bodek struct sysctl_oid_list *queue_list, *tx_list, *rx_list, *hw_list; 65*9b8d05b8SZbigniew Bodek struct sysctl_oid_list *admin_list; 66*9b8d05b8SZbigniew Bodek 67*9b8d05b8SZbigniew Bodek #define QUEUE_NAME_LEN 32 68*9b8d05b8SZbigniew Bodek char namebuf[QUEUE_NAME_LEN]; 69*9b8d05b8SZbigniew Bodek int i; 70*9b8d05b8SZbigniew Bodek 71*9b8d05b8SZbigniew Bodek dev = adapter->pdev; 72*9b8d05b8SZbigniew Bodek 73*9b8d05b8SZbigniew Bodek ctx = device_get_sysctl_ctx(dev); 74*9b8d05b8SZbigniew Bodek tree = device_get_sysctl_tree(dev); 75*9b8d05b8SZbigniew Bodek child = SYSCTL_CHILDREN(tree); 76*9b8d05b8SZbigniew Bodek 77*9b8d05b8SZbigniew Bodek tx_ring = adapter->tx_ring; 78*9b8d05b8SZbigniew Bodek rx_ring = adapter->rx_ring; 79*9b8d05b8SZbigniew Bodek 80*9b8d05b8SZbigniew Bodek hw_stats = &adapter->hw_stats; 81*9b8d05b8SZbigniew Bodek dev_stats = &adapter->dev_stats; 82*9b8d05b8SZbigniew Bodek admin_stats = &adapter->ena_dev->admin_queue.stats; 83*9b8d05b8SZbigniew Bodek 84*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "tx_timeout", 85*9b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->tx_timeout, 86*9b8d05b8SZbigniew Bodek "Driver TX timeouts"); 87*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "io_suspend", 88*9b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->io_suspend, 89*9b8d05b8SZbigniew Bodek "IO queue suspends"); 90*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "io_resume", 91*9b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->io_resume, 92*9b8d05b8SZbigniew Bodek "IO queue resumes"); 93*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "wd_expired", 94*9b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->wd_expired, 95*9b8d05b8SZbigniew Bodek "Watchdog expiry count"); 96*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "interface_up", 97*9b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->interface_up, 98*9b8d05b8SZbigniew Bodek "Network interface up count"); 99*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "interface_down", 100*9b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->interface_down, 101*9b8d05b8SZbigniew Bodek "Network interface down count"); 102*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "admin_q_pause", 103*9b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->admin_q_pause, 104*9b8d05b8SZbigniew Bodek "Admin queue pauses"); 105*9b8d05b8SZbigniew Bodek 106*9b8d05b8SZbigniew Bodek for (i = 0; i < adapter->num_queues; ++i, ++tx_ring, ++rx_ring) { 107*9b8d05b8SZbigniew Bodek snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i); 108*9b8d05b8SZbigniew Bodek 109*9b8d05b8SZbigniew Bodek queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, 110*9b8d05b8SZbigniew Bodek namebuf, CTLFLAG_RD, NULL, "Queue Name"); 111*9b8d05b8SZbigniew Bodek queue_list = SYSCTL_CHILDREN(queue_node); 112*9b8d05b8SZbigniew Bodek 113*9b8d05b8SZbigniew Bodek /* TX specific stats */ 114*9b8d05b8SZbigniew Bodek tx_node = SYSCTL_ADD_NODE(ctx, queue_list, OID_AUTO, 115*9b8d05b8SZbigniew Bodek "tx_ring", CTLFLAG_RD, NULL, "TX ring"); 116*9b8d05b8SZbigniew Bodek tx_list = SYSCTL_CHILDREN(tx_node); 117*9b8d05b8SZbigniew Bodek 118*9b8d05b8SZbigniew Bodek tx_stats = &tx_ring->tx_stats; 119*9b8d05b8SZbigniew Bodek 120*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 121*9b8d05b8SZbigniew Bodek "count", CTLFLAG_RD, 122*9b8d05b8SZbigniew Bodek &tx_stats->cnt, "Packets sent"); 123*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 124*9b8d05b8SZbigniew Bodek "bytes", CTLFLAG_RD, 125*9b8d05b8SZbigniew Bodek &tx_stats->bytes, "Bytes sent"); 126*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 127*9b8d05b8SZbigniew Bodek "prepare_ctx_err", CTLFLAG_RD, 128*9b8d05b8SZbigniew Bodek &tx_stats->prepare_ctx_err, 129*9b8d05b8SZbigniew Bodek "TX buffer preparation failures"); 130*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 131*9b8d05b8SZbigniew Bodek "queue_wakeup", CTLFLAG_RD, 132*9b8d05b8SZbigniew Bodek &tx_stats->queue_wakeup, "Queue wakeups"); 133*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 134*9b8d05b8SZbigniew Bodek "dma_mapping_err", CTLFLAG_RD, 135*9b8d05b8SZbigniew Bodek &tx_stats->dma_mapping_err, "DMA mapping failures"); 136*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 137*9b8d05b8SZbigniew Bodek "unsupported_desc_num", CTLFLAG_RD, 138*9b8d05b8SZbigniew Bodek &tx_stats->unsupported_desc_num, 139*9b8d05b8SZbigniew Bodek "Excessive descriptor packet discards"); 140*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 141*9b8d05b8SZbigniew Bodek "napi_comp", CTLFLAG_RD, 142*9b8d05b8SZbigniew Bodek &tx_stats->napi_comp, "Napi completions"); 143*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 144*9b8d05b8SZbigniew Bodek "tx_poll", CTLFLAG_RD, 145*9b8d05b8SZbigniew Bodek &tx_stats->tx_poll, "TX poll count"); 146*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 147*9b8d05b8SZbigniew Bodek "doorbells", CTLFLAG_RD, 148*9b8d05b8SZbigniew Bodek &tx_stats->doorbells, "Queue doorbells"); 149*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 150*9b8d05b8SZbigniew Bodek "missing_tx_comp", CTLFLAG_RD, 151*9b8d05b8SZbigniew Bodek &tx_stats->missing_tx_comp, "TX completions missed"); 152*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 153*9b8d05b8SZbigniew Bodek "bad_req_id", CTLFLAG_RD, 154*9b8d05b8SZbigniew Bodek &tx_stats->bad_req_id, "Bad request id count"); 155*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 156*9b8d05b8SZbigniew Bodek "stops", CTLFLAG_RD, 157*9b8d05b8SZbigniew Bodek &tx_stats->queue_stop, "Queue stops"); 158*9b8d05b8SZbigniew Bodek 159*9b8d05b8SZbigniew Bodek /* RX specific stats */ 160*9b8d05b8SZbigniew Bodek rx_node = SYSCTL_ADD_NODE(ctx, queue_list, OID_AUTO, 161*9b8d05b8SZbigniew Bodek "rx_ring", CTLFLAG_RD, NULL, "RX ring"); 162*9b8d05b8SZbigniew Bodek rx_list = SYSCTL_CHILDREN(rx_node); 163*9b8d05b8SZbigniew Bodek 164*9b8d05b8SZbigniew Bodek rx_stats = &rx_ring->rx_stats; 165*9b8d05b8SZbigniew Bodek 166*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 167*9b8d05b8SZbigniew Bodek "count", CTLFLAG_RD, 168*9b8d05b8SZbigniew Bodek &rx_stats->cnt, "Packets received"); 169*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 170*9b8d05b8SZbigniew Bodek "bytes", CTLFLAG_RD, 171*9b8d05b8SZbigniew Bodek &rx_stats->bytes, "Bytes received"); 172*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 173*9b8d05b8SZbigniew Bodek "refil_partial", CTLFLAG_RD, 174*9b8d05b8SZbigniew Bodek &rx_stats->refil_partial, "Partial refilled mbufs"); 175*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 176*9b8d05b8SZbigniew Bodek "bad_csum", CTLFLAG_RD, 177*9b8d05b8SZbigniew Bodek &rx_stats->bad_csum, "Bad RX checksum"); 178*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 179*9b8d05b8SZbigniew Bodek "page_alloc_fail", CTLFLAG_RD, 180*9b8d05b8SZbigniew Bodek &rx_stats->page_alloc_fail, "Failed page allocs"); 181*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 182*9b8d05b8SZbigniew Bodek "mbuf_alloc_fail", CTLFLAG_RD, 183*9b8d05b8SZbigniew Bodek &rx_stats->mbuf_alloc_fail, "Failed mbuf allocs"); 184*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 185*9b8d05b8SZbigniew Bodek "dma_mapping_err", CTLFLAG_RD, 186*9b8d05b8SZbigniew Bodek &rx_stats->dma_mapping_err, "DMA mapping errors"); 187*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 188*9b8d05b8SZbigniew Bodek "bad_desc_num", CTLFLAG_RD, 189*9b8d05b8SZbigniew Bodek &rx_stats->bad_desc_num, "Bad descriptor count"); 190*9b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 191*9b8d05b8SZbigniew Bodek "small_copy_len_pkt", CTLFLAG_RD, 192*9b8d05b8SZbigniew Bodek &rx_stats->small_copy_len_pkt, "Small copy packet count"); 193*9b8d05b8SZbigniew Bodek } 194*9b8d05b8SZbigniew Bodek 195*9b8d05b8SZbigniew Bodek /* Stats read from device */ 196*9b8d05b8SZbigniew Bodek hw_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "hw_stats", 197*9b8d05b8SZbigniew Bodek CTLFLAG_RD, NULL, "Statistics from hardware"); 198*9b8d05b8SZbigniew Bodek hw_list = SYSCTL_CHILDREN(hw_node); 199*9b8d05b8SZbigniew Bodek 200*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_packets", CTLFLAG_RD, 201*9b8d05b8SZbigniew Bodek &hw_stats->rx_packets, 0, "Packets received"); 202*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "tx_packets", CTLFLAG_RD, 203*9b8d05b8SZbigniew Bodek &hw_stats->tx_packets, 0, "Packets transmitted"); 204*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_bytes", CTLFLAG_RD, 205*9b8d05b8SZbigniew Bodek &hw_stats->rx_bytes, 0, "Bytes received"); 206*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "tx_bytes", CTLFLAG_RD, 207*9b8d05b8SZbigniew Bodek &hw_stats->tx_bytes, 0, "Bytes transmitted"); 208*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_drops", CTLFLAG_RD, 209*9b8d05b8SZbigniew Bodek &hw_stats->rx_drops, 0, "Receive packet drops"); 210*9b8d05b8SZbigniew Bodek 211*9b8d05b8SZbigniew Bodek SYSCTL_ADD_PROC(ctx, hw_list, OID_AUTO, "update_stats", 212*9b8d05b8SZbigniew Bodek CTLTYPE_INT|CTLFLAG_RD, adapter, 0, ena_sysctl_update_stats, 213*9b8d05b8SZbigniew Bodek "A", "Update stats from hardware"); 214*9b8d05b8SZbigniew Bodek /* ENA Admin queue stats */ 215*9b8d05b8SZbigniew Bodek admin_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "admin_stats", 216*9b8d05b8SZbigniew Bodek CTLFLAG_RD, NULL, "ENA Admin Queue statistics"); 217*9b8d05b8SZbigniew Bodek admin_list = SYSCTL_CHILDREN(admin_node); 218*9b8d05b8SZbigniew Bodek 219*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "aborted_cmd", CTLFLAG_RD, 220*9b8d05b8SZbigniew Bodek &admin_stats->aborted_cmd, 0, "Aborted commands"); 221*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "sumbitted_cmd", CTLFLAG_RD, 222*9b8d05b8SZbigniew Bodek &admin_stats->submitted_cmd, 0, "Submitted commands"); 223*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "completed_cmd", CTLFLAG_RD, 224*9b8d05b8SZbigniew Bodek &admin_stats->completed_cmd, 0, "Completed commands"); 225*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "out_of_space", CTLFLAG_RD, 226*9b8d05b8SZbigniew Bodek &admin_stats->out_of_space, 0, "Queue out of space"); 227*9b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "no_completion", CTLFLAG_RD, 228*9b8d05b8SZbigniew Bodek &admin_stats->no_completion, 0, "Commands not completed"); 229*9b8d05b8SZbigniew Bodek } 230*9b8d05b8SZbigniew Bodek 231*9b8d05b8SZbigniew Bodek static int 232*9b8d05b8SZbigniew Bodek ena_sysctl_update_stats(SYSCTL_HANDLER_ARGS) 233*9b8d05b8SZbigniew Bodek { 234*9b8d05b8SZbigniew Bodek struct ena_adapter *adapter = (struct ena_adapter *)arg1; 235*9b8d05b8SZbigniew Bodek int rc; 236*9b8d05b8SZbigniew Bodek 237*9b8d05b8SZbigniew Bodek if (adapter->up) 238*9b8d05b8SZbigniew Bodek ena_update_stats_counters(adapter); 239*9b8d05b8SZbigniew Bodek 240*9b8d05b8SZbigniew Bodek rc = sysctl_handle_string(oidp, "", 1, req); 241*9b8d05b8SZbigniew Bodek return (rc); 242*9b8d05b8SZbigniew Bodek } 243*9b8d05b8SZbigniew Bodek 244