19b8d05b8SZbigniew Bodek /*- 29b8d05b8SZbigniew Bodek * BSD LICENSE 39b8d05b8SZbigniew Bodek * 49b8d05b8SZbigniew Bodek * Copyright (c) 2015-2017 Amazon.com, Inc. or its affiliates. 59b8d05b8SZbigniew Bodek * All rights reserved. 69b8d05b8SZbigniew Bodek * 79b8d05b8SZbigniew Bodek * Redistribution and use in source and binary forms, with or without 89b8d05b8SZbigniew Bodek * modification, are permitted provided that the following conditions 99b8d05b8SZbigniew Bodek * are met: 109b8d05b8SZbigniew Bodek * 119b8d05b8SZbigniew Bodek * 1. Redistributions of source code must retain the above copyright 129b8d05b8SZbigniew Bodek * notice, this list of conditions and the following disclaimer. 139b8d05b8SZbigniew Bodek * 149b8d05b8SZbigniew Bodek * 2. Redistributions in binary form must reproduce the above copyright 159b8d05b8SZbigniew Bodek * notice, this list of conditions and the following disclaimer in the 169b8d05b8SZbigniew Bodek * documentation and/or other materials provided with the distribution. 179b8d05b8SZbigniew Bodek * 189b8d05b8SZbigniew Bodek * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 199b8d05b8SZbigniew Bodek * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 209b8d05b8SZbigniew Bodek * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 219b8d05b8SZbigniew Bodek * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 229b8d05b8SZbigniew Bodek * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 239b8d05b8SZbigniew Bodek * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 249b8d05b8SZbigniew Bodek * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 259b8d05b8SZbigniew Bodek * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 269b8d05b8SZbigniew Bodek * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 279b8d05b8SZbigniew Bodek * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 289b8d05b8SZbigniew Bodek * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 299b8d05b8SZbigniew Bodek */ 309b8d05b8SZbigniew Bodek #include <sys/cdefs.h> 319b8d05b8SZbigniew Bodek __FBSDID("$FreeBSD$"); 329b8d05b8SZbigniew Bodek 339b8d05b8SZbigniew Bodek #include "ena_sysctl.h" 349b8d05b8SZbigniew Bodek 359b8d05b8SZbigniew Bodek static int ena_sysctl_update_stats(SYSCTL_HANDLER_ARGS); 369b8d05b8SZbigniew Bodek static void ena_sysctl_add_stats(struct ena_adapter *); 379b8d05b8SZbigniew Bodek 389b8d05b8SZbigniew Bodek void 399b8d05b8SZbigniew Bodek ena_sysctl_add_nodes(struct ena_adapter *adapter) 409b8d05b8SZbigniew Bodek { 419b8d05b8SZbigniew Bodek ena_sysctl_add_stats(adapter); 429b8d05b8SZbigniew Bodek } 439b8d05b8SZbigniew Bodek 449b8d05b8SZbigniew Bodek static void 459b8d05b8SZbigniew Bodek ena_sysctl_add_stats(struct ena_adapter *adapter) 469b8d05b8SZbigniew Bodek { 479b8d05b8SZbigniew Bodek device_t dev; 489b8d05b8SZbigniew Bodek 499b8d05b8SZbigniew Bodek struct ena_ring *tx_ring; 509b8d05b8SZbigniew Bodek struct ena_ring *rx_ring; 519b8d05b8SZbigniew Bodek 529b8d05b8SZbigniew Bodek struct ena_hw_stats *hw_stats; 539b8d05b8SZbigniew Bodek struct ena_stats_dev *dev_stats; 549b8d05b8SZbigniew Bodek struct ena_stats_tx *tx_stats; 559b8d05b8SZbigniew Bodek struct ena_stats_rx *rx_stats; 569b8d05b8SZbigniew Bodek struct ena_com_stats_admin *admin_stats; 579b8d05b8SZbigniew Bodek 589b8d05b8SZbigniew Bodek struct sysctl_ctx_list *ctx; 599b8d05b8SZbigniew Bodek struct sysctl_oid *tree; 609b8d05b8SZbigniew Bodek struct sysctl_oid_list *child; 619b8d05b8SZbigniew Bodek 629b8d05b8SZbigniew Bodek struct sysctl_oid *queue_node, *tx_node, *rx_node, *hw_node; 639b8d05b8SZbigniew Bodek struct sysctl_oid *admin_node; 649b8d05b8SZbigniew Bodek struct sysctl_oid_list *queue_list, *tx_list, *rx_list, *hw_list; 659b8d05b8SZbigniew Bodek struct sysctl_oid_list *admin_list; 669b8d05b8SZbigniew Bodek 679b8d05b8SZbigniew Bodek #define QUEUE_NAME_LEN 32 689b8d05b8SZbigniew Bodek char namebuf[QUEUE_NAME_LEN]; 699b8d05b8SZbigniew Bodek int i; 709b8d05b8SZbigniew Bodek 719b8d05b8SZbigniew Bodek dev = adapter->pdev; 729b8d05b8SZbigniew Bodek 739b8d05b8SZbigniew Bodek ctx = device_get_sysctl_ctx(dev); 749b8d05b8SZbigniew Bodek tree = device_get_sysctl_tree(dev); 759b8d05b8SZbigniew Bodek child = SYSCTL_CHILDREN(tree); 769b8d05b8SZbigniew Bodek 779b8d05b8SZbigniew Bodek tx_ring = adapter->tx_ring; 789b8d05b8SZbigniew Bodek rx_ring = adapter->rx_ring; 799b8d05b8SZbigniew Bodek 809b8d05b8SZbigniew Bodek hw_stats = &adapter->hw_stats; 819b8d05b8SZbigniew Bodek dev_stats = &adapter->dev_stats; 829b8d05b8SZbigniew Bodek admin_stats = &adapter->ena_dev->admin_queue.stats; 839b8d05b8SZbigniew Bodek 849b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "tx_timeout", 859b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->tx_timeout, 869b8d05b8SZbigniew Bodek "Driver TX timeouts"); 879b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "io_suspend", 889b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->io_suspend, 899b8d05b8SZbigniew Bodek "IO queue suspends"); 909b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "io_resume", 919b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->io_resume, 929b8d05b8SZbigniew Bodek "IO queue resumes"); 939b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "wd_expired", 949b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->wd_expired, 959b8d05b8SZbigniew Bodek "Watchdog expiry count"); 969b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "interface_up", 979b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->interface_up, 989b8d05b8SZbigniew Bodek "Network interface up count"); 999b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "interface_down", 1009b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->interface_down, 1019b8d05b8SZbigniew Bodek "Network interface down count"); 1029b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, child, OID_AUTO, "admin_q_pause", 1039b8d05b8SZbigniew Bodek CTLFLAG_RD, &dev_stats->admin_q_pause, 1049b8d05b8SZbigniew Bodek "Admin queue pauses"); 1059b8d05b8SZbigniew Bodek 1069b8d05b8SZbigniew Bodek for (i = 0; i < adapter->num_queues; ++i, ++tx_ring, ++rx_ring) { 1079b8d05b8SZbigniew Bodek snprintf(namebuf, QUEUE_NAME_LEN, "queue%d", i); 1089b8d05b8SZbigniew Bodek 1099b8d05b8SZbigniew Bodek queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, 1109b8d05b8SZbigniew Bodek namebuf, CTLFLAG_RD, NULL, "Queue Name"); 1119b8d05b8SZbigniew Bodek queue_list = SYSCTL_CHILDREN(queue_node); 1129b8d05b8SZbigniew Bodek 1139b8d05b8SZbigniew Bodek /* TX specific stats */ 1149b8d05b8SZbigniew Bodek tx_node = SYSCTL_ADD_NODE(ctx, queue_list, OID_AUTO, 1159b8d05b8SZbigniew Bodek "tx_ring", CTLFLAG_RD, NULL, "TX ring"); 1169b8d05b8SZbigniew Bodek tx_list = SYSCTL_CHILDREN(tx_node); 1179b8d05b8SZbigniew Bodek 1189b8d05b8SZbigniew Bodek tx_stats = &tx_ring->tx_stats; 1199b8d05b8SZbigniew Bodek 1209b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1219b8d05b8SZbigniew Bodek "count", CTLFLAG_RD, 1229b8d05b8SZbigniew Bodek &tx_stats->cnt, "Packets sent"); 1239b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1249b8d05b8SZbigniew Bodek "bytes", CTLFLAG_RD, 1259b8d05b8SZbigniew Bodek &tx_stats->bytes, "Bytes sent"); 1269b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1279b8d05b8SZbigniew Bodek "prepare_ctx_err", CTLFLAG_RD, 1289b8d05b8SZbigniew Bodek &tx_stats->prepare_ctx_err, 1299b8d05b8SZbigniew Bodek "TX buffer preparation failures"); 1309b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1319b8d05b8SZbigniew Bodek "queue_wakeup", CTLFLAG_RD, 1329b8d05b8SZbigniew Bodek &tx_stats->queue_wakeup, "Queue wakeups"); 1339b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1349b8d05b8SZbigniew Bodek "dma_mapping_err", CTLFLAG_RD, 1359b8d05b8SZbigniew Bodek &tx_stats->dma_mapping_err, "DMA mapping failures"); 1369b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1379b8d05b8SZbigniew Bodek "unsupported_desc_num", CTLFLAG_RD, 1389b8d05b8SZbigniew Bodek &tx_stats->unsupported_desc_num, 1399b8d05b8SZbigniew Bodek "Excessive descriptor packet discards"); 1409b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1419b8d05b8SZbigniew Bodek "napi_comp", CTLFLAG_RD, 1429b8d05b8SZbigniew Bodek &tx_stats->napi_comp, "Napi completions"); 1439b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1449b8d05b8SZbigniew Bodek "tx_poll", CTLFLAG_RD, 1459b8d05b8SZbigniew Bodek &tx_stats->tx_poll, "TX poll count"); 1469b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1479b8d05b8SZbigniew Bodek "doorbells", CTLFLAG_RD, 1489b8d05b8SZbigniew Bodek &tx_stats->doorbells, "Queue doorbells"); 1499b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1509b8d05b8SZbigniew Bodek "missing_tx_comp", CTLFLAG_RD, 1519b8d05b8SZbigniew Bodek &tx_stats->missing_tx_comp, "TX completions missed"); 1529b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1539b8d05b8SZbigniew Bodek "bad_req_id", CTLFLAG_RD, 1549b8d05b8SZbigniew Bodek &tx_stats->bad_req_id, "Bad request id count"); 1559b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 1569b8d05b8SZbigniew Bodek "stops", CTLFLAG_RD, 1579b8d05b8SZbigniew Bodek &tx_stats->queue_stop, "Queue stops"); 1581e9fb899SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 159*1b069f1cSZbigniew Bodek "mbuf_collapses", CTLFLAG_RD, 160*1b069f1cSZbigniew Bodek &tx_stats->collapse, 161*1b069f1cSZbigniew Bodek "Mbuf collapse count"); 1621e9fb899SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 163*1b069f1cSZbigniew Bodek "mbuf_collapse_err", CTLFLAG_RD, 164*1b069f1cSZbigniew Bodek &tx_stats->collapse_err, 165*1b069f1cSZbigniew Bodek "Mbuf collapse failures"); 1669b8d05b8SZbigniew Bodek 1679b8d05b8SZbigniew Bodek /* RX specific stats */ 1689b8d05b8SZbigniew Bodek rx_node = SYSCTL_ADD_NODE(ctx, queue_list, OID_AUTO, 1699b8d05b8SZbigniew Bodek "rx_ring", CTLFLAG_RD, NULL, "RX ring"); 1709b8d05b8SZbigniew Bodek rx_list = SYSCTL_CHILDREN(rx_node); 1719b8d05b8SZbigniew Bodek 1729b8d05b8SZbigniew Bodek rx_stats = &rx_ring->rx_stats; 1739b8d05b8SZbigniew Bodek 1749b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 1759b8d05b8SZbigniew Bodek "count", CTLFLAG_RD, 1769b8d05b8SZbigniew Bodek &rx_stats->cnt, "Packets received"); 1779b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 1789b8d05b8SZbigniew Bodek "bytes", CTLFLAG_RD, 1799b8d05b8SZbigniew Bodek &rx_stats->bytes, "Bytes received"); 1809b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 1819b8d05b8SZbigniew Bodek "refil_partial", CTLFLAG_RD, 1829b8d05b8SZbigniew Bodek &rx_stats->refil_partial, "Partial refilled mbufs"); 1839b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 1849b8d05b8SZbigniew Bodek "bad_csum", CTLFLAG_RD, 1859b8d05b8SZbigniew Bodek &rx_stats->bad_csum, "Bad RX checksum"); 1869b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 1879b8d05b8SZbigniew Bodek "page_alloc_fail", CTLFLAG_RD, 1889b8d05b8SZbigniew Bodek &rx_stats->page_alloc_fail, "Failed page allocs"); 1899b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 1909b8d05b8SZbigniew Bodek "mbuf_alloc_fail", CTLFLAG_RD, 1919b8d05b8SZbigniew Bodek &rx_stats->mbuf_alloc_fail, "Failed mbuf allocs"); 1929b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 1939b8d05b8SZbigniew Bodek "dma_mapping_err", CTLFLAG_RD, 1949b8d05b8SZbigniew Bodek &rx_stats->dma_mapping_err, "DMA mapping errors"); 1959b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 1969b8d05b8SZbigniew Bodek "bad_desc_num", CTLFLAG_RD, 1979b8d05b8SZbigniew Bodek &rx_stats->bad_desc_num, "Bad descriptor count"); 1989b8d05b8SZbigniew Bodek SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 1999b8d05b8SZbigniew Bodek "small_copy_len_pkt", CTLFLAG_RD, 2009b8d05b8SZbigniew Bodek &rx_stats->small_copy_len_pkt, "Small copy packet count"); 2019b8d05b8SZbigniew Bodek } 2029b8d05b8SZbigniew Bodek 2039b8d05b8SZbigniew Bodek /* Stats read from device */ 2049b8d05b8SZbigniew Bodek hw_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "hw_stats", 2059b8d05b8SZbigniew Bodek CTLFLAG_RD, NULL, "Statistics from hardware"); 2069b8d05b8SZbigniew Bodek hw_list = SYSCTL_CHILDREN(hw_node); 2079b8d05b8SZbigniew Bodek 2089b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_packets", CTLFLAG_RD, 2099b8d05b8SZbigniew Bodek &hw_stats->rx_packets, 0, "Packets received"); 2109b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "tx_packets", CTLFLAG_RD, 2119b8d05b8SZbigniew Bodek &hw_stats->tx_packets, 0, "Packets transmitted"); 2129b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_bytes", CTLFLAG_RD, 2139b8d05b8SZbigniew Bodek &hw_stats->rx_bytes, 0, "Bytes received"); 2149b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "tx_bytes", CTLFLAG_RD, 2159b8d05b8SZbigniew Bodek &hw_stats->tx_bytes, 0, "Bytes transmitted"); 2169b8d05b8SZbigniew Bodek SYSCTL_ADD_U64(ctx, hw_list, OID_AUTO, "rx_drops", CTLFLAG_RD, 2179b8d05b8SZbigniew Bodek &hw_stats->rx_drops, 0, "Receive packet drops"); 2189b8d05b8SZbigniew Bodek 2199b8d05b8SZbigniew Bodek SYSCTL_ADD_PROC(ctx, hw_list, OID_AUTO, "update_stats", 2209b8d05b8SZbigniew Bodek CTLTYPE_INT|CTLFLAG_RD, adapter, 0, ena_sysctl_update_stats, 2219b8d05b8SZbigniew Bodek "A", "Update stats from hardware"); 2229b8d05b8SZbigniew Bodek /* ENA Admin queue stats */ 2239b8d05b8SZbigniew Bodek admin_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "admin_stats", 2249b8d05b8SZbigniew Bodek CTLFLAG_RD, NULL, "ENA Admin Queue statistics"); 2259b8d05b8SZbigniew Bodek admin_list = SYSCTL_CHILDREN(admin_node); 2269b8d05b8SZbigniew Bodek 2279b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "aborted_cmd", CTLFLAG_RD, 2289b8d05b8SZbigniew Bodek &admin_stats->aborted_cmd, 0, "Aborted commands"); 2299b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "sumbitted_cmd", CTLFLAG_RD, 2309b8d05b8SZbigniew Bodek &admin_stats->submitted_cmd, 0, "Submitted commands"); 2319b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "completed_cmd", CTLFLAG_RD, 2329b8d05b8SZbigniew Bodek &admin_stats->completed_cmd, 0, "Completed commands"); 2339b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "out_of_space", CTLFLAG_RD, 2349b8d05b8SZbigniew Bodek &admin_stats->out_of_space, 0, "Queue out of space"); 2359b8d05b8SZbigniew Bodek SYSCTL_ADD_U32(ctx, admin_list, OID_AUTO, "no_completion", CTLFLAG_RD, 2369b8d05b8SZbigniew Bodek &admin_stats->no_completion, 0, "Commands not completed"); 2379b8d05b8SZbigniew Bodek } 2389b8d05b8SZbigniew Bodek 2399b8d05b8SZbigniew Bodek static int 2409b8d05b8SZbigniew Bodek ena_sysctl_update_stats(SYSCTL_HANDLER_ARGS) 2419b8d05b8SZbigniew Bodek { 2429b8d05b8SZbigniew Bodek struct ena_adapter *adapter = (struct ena_adapter *)arg1; 2439b8d05b8SZbigniew Bodek int rc; 2449b8d05b8SZbigniew Bodek 2459b8d05b8SZbigniew Bodek if (adapter->up) 2469b8d05b8SZbigniew Bodek ena_update_stats_counters(adapter); 2479b8d05b8SZbigniew Bodek 2489b8d05b8SZbigniew Bodek rc = sysctl_handle_string(oidp, "", 1, req); 2499b8d05b8SZbigniew Bodek return (rc); 2509b8d05b8SZbigniew Bodek } 2519b8d05b8SZbigniew Bodek 252