1ce110ea1SWei Hu /*- 2ce110ea1SWei Hu * SPDX-License-Identifier: BSD-2-Clause 3ce110ea1SWei Hu * 4ce110ea1SWei Hu * Copyright (c) 2021 Microsoft Corp. 5ce110ea1SWei Hu * All rights reserved. 6ce110ea1SWei Hu * 7ce110ea1SWei Hu * Redistribution and use in source and binary forms, with or without 8ce110ea1SWei Hu * modification, are permitted provided that the following conditions 9ce110ea1SWei Hu * are met: 10ce110ea1SWei Hu * 11ce110ea1SWei Hu * 1. Redistributions of source code must retain the above copyright 12ce110ea1SWei Hu * notice, this list of conditions and the following disclaimer. 13ce110ea1SWei Hu * 14ce110ea1SWei Hu * 2. Redistributions in binary form must reproduce the above copyright 15ce110ea1SWei Hu * notice, this list of conditions and the following disclaimer in the 16ce110ea1SWei Hu * documentation and/or other materials provided with the distribution. 17ce110ea1SWei Hu * 18ce110ea1SWei Hu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19ce110ea1SWei Hu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20ce110ea1SWei Hu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21ce110ea1SWei Hu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22ce110ea1SWei Hu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23ce110ea1SWei Hu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24ce110ea1SWei Hu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25ce110ea1SWei Hu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26ce110ea1SWei Hu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27ce110ea1SWei Hu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28ce110ea1SWei Hu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29ce110ea1SWei Hu */ 30ce110ea1SWei Hu #include <sys/cdefs.h> 31ce110ea1SWei Hu #include "mana_sysctl.h" 32ce110ea1SWei Hu 33ce110ea1SWei Hu static int mana_sysctl_cleanup_thread_cpu(SYSCTL_HANDLER_ARGS); 34ce110ea1SWei Hu 35ce110ea1SWei Hu int mana_log_level = MANA_ALERT | MANA_WARNING | MANA_INFO; 36ce110ea1SWei Hu 37ce110ea1SWei Hu SYSCTL_NODE(_hw, OID_AUTO, mana, CTLFLAG_RD | CTLFLAG_MPSAFE, 0, 38ce110ea1SWei Hu "MANA driver parameters"); 39ce110ea1SWei Hu 40ce110ea1SWei Hu /* 41ce110ea1SWei Hu * Logging level for changing verbosity of the output 42ce110ea1SWei Hu */ 43ce110ea1SWei Hu SYSCTL_INT(_hw_mana, OID_AUTO, log_level, CTLFLAG_RWTUN, 44ce110ea1SWei Hu &mana_log_level, 0, "Logging level indicating verbosity of the logs"); 45ce110ea1SWei Hu 46ce110ea1SWei Hu SYSCTL_CONST_STRING(_hw_mana, OID_AUTO, driver_version, CTLFLAG_RD, 47ce110ea1SWei Hu DRV_MODULE_VERSION, "MANA driver version"); 48ce110ea1SWei Hu 49b167e449SWei Hu static int 50b167e449SWei Hu mana_sysctl_rx_stat_agg_u64(SYSCTL_HANDLER_ARGS) 51b167e449SWei Hu { 52b167e449SWei Hu struct mana_port_context *apc = arg1; 53b167e449SWei Hu int offset = arg2, i, err; 54b167e449SWei Hu struct mana_rxq *rxq; 55b167e449SWei Hu uint64_t stat; 56b167e449SWei Hu 57b167e449SWei Hu stat = 0; 58b167e449SWei Hu for (i = 0; i < apc->num_queues; i++) { 59b167e449SWei Hu rxq = apc->rxqs[i]; 60b167e449SWei Hu stat += *((uint64_t *)((uint8_t *)rxq + offset)); 61b167e449SWei Hu } 62b167e449SWei Hu 63b167e449SWei Hu err = sysctl_handle_64(oidp, &stat, 0, req); 64b167e449SWei Hu if (err || req->newptr == NULL) 65b167e449SWei Hu return err; 66b167e449SWei Hu 67b167e449SWei Hu for (i = 0; i < apc->num_queues; i++) { 68b167e449SWei Hu rxq = apc->rxqs[i]; 69b167e449SWei Hu *((uint64_t *)((uint8_t *)rxq + offset)) = 0; 70b167e449SWei Hu } 71b167e449SWei Hu return 0; 72b167e449SWei Hu } 73b167e449SWei Hu 74b167e449SWei Hu static int 75b167e449SWei Hu mana_sysctl_rx_stat_u16(SYSCTL_HANDLER_ARGS) 76b167e449SWei Hu { 77b167e449SWei Hu struct mana_port_context *apc = arg1; 78b167e449SWei Hu int offset = arg2, err; 79b167e449SWei Hu struct mana_rxq *rxq; 80b167e449SWei Hu uint64_t stat; 81b167e449SWei Hu uint16_t val; 82b167e449SWei Hu 83b167e449SWei Hu rxq = apc->rxqs[0]; 84b167e449SWei Hu val = *((uint16_t *)((uint8_t *)rxq + offset)); 85b167e449SWei Hu stat = val; 86b167e449SWei Hu 87b167e449SWei Hu err = sysctl_handle_64(oidp, &stat, 0, req); 88b167e449SWei Hu if (err || req->newptr == NULL) 89b167e449SWei Hu return err; 90b167e449SWei Hu else 91b167e449SWei Hu return 0; 92b167e449SWei Hu } 93b167e449SWei Hu 94b167e449SWei Hu static int 95b167e449SWei Hu mana_sysctl_rx_stat_u32(SYSCTL_HANDLER_ARGS) 96b167e449SWei Hu { 97b167e449SWei Hu struct mana_port_context *apc = arg1; 98b167e449SWei Hu int offset = arg2, err; 99b167e449SWei Hu struct mana_rxq *rxq; 100b167e449SWei Hu uint64_t stat; 101b167e449SWei Hu uint32_t val; 102b167e449SWei Hu 103b167e449SWei Hu rxq = apc->rxqs[0]; 104b167e449SWei Hu val = *((uint32_t *)((uint8_t *)rxq + offset)); 105b167e449SWei Hu stat = val; 106b167e449SWei Hu 107b167e449SWei Hu err = sysctl_handle_64(oidp, &stat, 0, req); 108b167e449SWei Hu if (err || req->newptr == NULL) 109b167e449SWei Hu return err; 110b167e449SWei Hu else 111b167e449SWei Hu return 0; 112b167e449SWei Hu } 113b167e449SWei Hu 114b167e449SWei Hu static int 115b167e449SWei Hu mana_sysctl_tx_stat_agg_u64(SYSCTL_HANDLER_ARGS) 116b167e449SWei Hu { 117b167e449SWei Hu struct mana_port_context *apc = arg1; 118b167e449SWei Hu int offset = arg2, i, err; 119b167e449SWei Hu struct mana_txq *txq; 120b167e449SWei Hu uint64_t stat; 121b167e449SWei Hu 122b167e449SWei Hu stat = 0; 123b167e449SWei Hu for (i = 0; i < apc->num_queues; i++) { 124b167e449SWei Hu txq = &apc->tx_qp[i].txq; 125b167e449SWei Hu stat += *((uint64_t *)((uint8_t *)txq + offset)); 126b167e449SWei Hu } 127b167e449SWei Hu 128b167e449SWei Hu err = sysctl_handle_64(oidp, &stat, 0, req); 129b167e449SWei Hu if (err || req->newptr == NULL) 130b167e449SWei Hu return err; 131b167e449SWei Hu 132b167e449SWei Hu for (i = 0; i < apc->num_queues; i++) { 133b167e449SWei Hu txq = &apc->tx_qp[i].txq; 134b167e449SWei Hu *((uint64_t *)((uint8_t *)txq + offset)) = 0; 135b167e449SWei Hu } 136b167e449SWei Hu return 0; 137b167e449SWei Hu } 138b167e449SWei Hu 139ce110ea1SWei Hu void 140ce110ea1SWei Hu mana_sysctl_add_port(struct mana_port_context *apc) 141ce110ea1SWei Hu { 142ce110ea1SWei Hu struct gdma_context *gc = apc->ac->gdma_dev->gdma_context; 143ce110ea1SWei Hu device_t dev = gc->dev; 144ce110ea1SWei Hu struct sysctl_ctx_list *ctx; 145ce110ea1SWei Hu struct sysctl_oid *tree; 146ce110ea1SWei Hu struct sysctl_oid_list *child; 147ce110ea1SWei Hu struct mana_port_stats *port_stats; 148ce110ea1SWei Hu char node_name[32]; 149ce110ea1SWei Hu 150ce110ea1SWei Hu struct sysctl_oid *port_node, *stats_node; 151ce110ea1SWei Hu struct sysctl_oid_list *stats_list; 152ce110ea1SWei Hu 153ce110ea1SWei Hu ctx = device_get_sysctl_ctx(dev); 154ce110ea1SWei Hu tree = device_get_sysctl_tree(dev); 155ce110ea1SWei Hu child = SYSCTL_CHILDREN(tree); 156ce110ea1SWei Hu 157ce110ea1SWei Hu port_stats = &apc->port_stats; 158ce110ea1SWei Hu 159ce110ea1SWei Hu snprintf(node_name, 32, "port%d", apc->port_idx); 160ce110ea1SWei Hu 161ce110ea1SWei Hu port_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, 162ce110ea1SWei Hu node_name, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Port Name"); 163ce110ea1SWei Hu apc->port_list = SYSCTL_CHILDREN(port_node); 164ce110ea1SWei Hu 165ce110ea1SWei Hu SYSCTL_ADD_BOOL(ctx, apc->port_list, OID_AUTO, 166ce110ea1SWei Hu "enable_altq", CTLFLAG_RW, &apc->enable_tx_altq, 0, 167ce110ea1SWei Hu "Choose alternative txq under heavy load"); 168ce110ea1SWei Hu 169ce110ea1SWei Hu SYSCTL_ADD_PROC(ctx, apc->port_list, OID_AUTO, 170ce110ea1SWei Hu "bind_cleanup_thread_cpu", 171ce110ea1SWei Hu CTLTYPE_U8 | CTLFLAG_RW | CTLFLAG_MPSAFE, 172ce110ea1SWei Hu apc, 0, mana_sysctl_cleanup_thread_cpu, "I", 173ce110ea1SWei Hu "Bind cleanup thread to a cpu. 0 disables it."); 174ce110ea1SWei Hu 175ce110ea1SWei Hu stats_node = SYSCTL_ADD_NODE(ctx, apc->port_list, OID_AUTO, 176ce110ea1SWei Hu "port_stats", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, 177ce110ea1SWei Hu "Statistics of port"); 178ce110ea1SWei Hu stats_list = SYSCTL_CHILDREN(stats_node); 179ce110ea1SWei Hu 180ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, stats_list, OID_AUTO, "rx_packets", 181ce110ea1SWei Hu CTLFLAG_RD, &port_stats->rx_packets, "Packets received"); 182ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, stats_list, OID_AUTO, "tx_packets", 183ce110ea1SWei Hu CTLFLAG_RD, &port_stats->tx_packets, "Packets transmitted"); 184ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, stats_list, OID_AUTO, "rx_bytes", 185ce110ea1SWei Hu CTLFLAG_RD, &port_stats->rx_bytes, "Bytes received"); 186ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, stats_list, OID_AUTO, "tx_bytes", 187ce110ea1SWei Hu CTLFLAG_RD, &port_stats->tx_bytes, "Bytes transmitted"); 188ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, stats_list, OID_AUTO, "rx_drops", 189ce110ea1SWei Hu CTLFLAG_RD, &port_stats->rx_drops, "Receive packet drops"); 190ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, stats_list, OID_AUTO, "tx_drops", 191ce110ea1SWei Hu CTLFLAG_RD, &port_stats->tx_drops, "Transmit packet drops"); 192b167e449SWei Hu 193b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "rx_lro_queued", 194b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_STATS, apc, 195b167e449SWei Hu __offsetof(struct mana_rxq, lro.lro_queued), 196b167e449SWei Hu mana_sysctl_rx_stat_agg_u64, "LU", "LRO queued"); 197b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "rx_lro_flushed", 198b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_STATS, apc, 199b167e449SWei Hu __offsetof(struct mana_rxq, lro.lro_flushed), 200b167e449SWei Hu mana_sysctl_rx_stat_agg_u64, "LU", "LRO flushed"); 201b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "rx_lro_bad_csum", 202b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_MPSAFE | CTLFLAG_STATS, apc, 203b167e449SWei Hu __offsetof(struct mana_rxq, lro.lro_bad_csum), 204b167e449SWei Hu mana_sysctl_rx_stat_agg_u64, "LU", "LRO bad checksum"); 205b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "rx_lro_tried", 206b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS, apc, 207b167e449SWei Hu __offsetof(struct mana_rxq, lro_tried), 208b167e449SWei Hu mana_sysctl_rx_stat_agg_u64, "LU", "LRO tried"); 209b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "rx_lro_failed", 210b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS, apc, 211b167e449SWei Hu __offsetof(struct mana_rxq, lro_failed), 212b167e449SWei Hu mana_sysctl_rx_stat_agg_u64, "LU", "LRO failed"); 213b167e449SWei Hu 214b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "lro_ackcnt_lim", 215b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS, apc, 216b167e449SWei Hu __offsetof(struct mana_rxq, lro.lro_ackcnt_lim), 217b167e449SWei Hu mana_sysctl_rx_stat_u16, 218b167e449SWei Hu "LU", "Max # of ACKs to be aggregated by LRO"); 219b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "lro_length_lim", 220b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS, apc, 221b167e449SWei Hu __offsetof(struct mana_rxq, lro.lro_length_lim), 222b167e449SWei Hu mana_sysctl_rx_stat_u32, 223b167e449SWei Hu "LU", "Max len of aggregated data in byte by LRO"); 224b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "lro_cnt", 225b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS, apc, 226b167e449SWei Hu __offsetof(struct mana_rxq, lro.lro_cnt), 227b167e449SWei Hu mana_sysctl_rx_stat_u32, 228b167e449SWei Hu "LU", "Max # or LRO packet count"); 229b167e449SWei Hu 230b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "tx_tso_packets", 231b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS, apc, 232b167e449SWei Hu __offsetof(struct mana_txq, tso_pkts), 233b167e449SWei Hu mana_sysctl_tx_stat_agg_u64, "LU", "TSO packets"); 234b167e449SWei Hu SYSCTL_ADD_PROC(ctx, stats_list, OID_AUTO, "tx_tso_bytes", 235b167e449SWei Hu CTLTYPE_U64 | CTLFLAG_RD | CTLFLAG_STATS, apc, 236b167e449SWei Hu __offsetof(struct mana_txq, tso_bytes), 237b167e449SWei Hu mana_sysctl_tx_stat_agg_u64, "LU", "TSO bytes"); 238ce110ea1SWei Hu } 239ce110ea1SWei Hu 240ce110ea1SWei Hu void 241ce110ea1SWei Hu mana_sysctl_add_queues(struct mana_port_context *apc) 242ce110ea1SWei Hu { 243ce110ea1SWei Hu struct sysctl_ctx_list *ctx = &apc->que_sysctl_ctx; 244ce110ea1SWei Hu struct sysctl_oid_list *child = apc->port_list; 245ce110ea1SWei Hu 246ce110ea1SWei Hu struct sysctl_oid *queue_node, *tx_node, *rx_node; 247ce110ea1SWei Hu struct sysctl_oid_list *queue_list, *tx_list, *rx_list; 248ce110ea1SWei Hu struct mana_txq *txq; 249ce110ea1SWei Hu struct mana_rxq *rxq; 250ce110ea1SWei Hu struct mana_stats *tx_stats, *rx_stats; 251ce110ea1SWei Hu char que_name[32]; 252ce110ea1SWei Hu int i; 253ce110ea1SWei Hu 254ce110ea1SWei Hu sysctl_ctx_init(ctx); 255ce110ea1SWei Hu 256ce110ea1SWei Hu for (i = 0; i < apc->num_queues; i++) { 257ce110ea1SWei Hu rxq = apc->rxqs[i]; 258ce110ea1SWei Hu txq = &apc->tx_qp[i].txq; 259ce110ea1SWei Hu 260ce110ea1SWei Hu snprintf(que_name, 32, "queue%d", i); 261ce110ea1SWei Hu 262ce110ea1SWei Hu queue_node = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, 263ce110ea1SWei Hu que_name, CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Queue Name"); 264ce110ea1SWei Hu queue_list = SYSCTL_CHILDREN(queue_node); 265ce110ea1SWei Hu 266ce110ea1SWei Hu /* TX stats */ 267ce110ea1SWei Hu tx_node = SYSCTL_ADD_NODE(ctx, queue_list, OID_AUTO, 268ce110ea1SWei Hu "txq", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "TX queue"); 269ce110ea1SWei Hu tx_list = SYSCTL_CHILDREN(tx_node); 270ce110ea1SWei Hu 271ce110ea1SWei Hu tx_stats = &txq->stats; 272ce110ea1SWei Hu 273ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, "count", 274ce110ea1SWei Hu CTLFLAG_RD, &tx_stats->packets, "Packets sent"); 275ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, "bytes", 276ce110ea1SWei Hu CTLFLAG_RD, &tx_stats->bytes, "Bytes sent"); 277ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, "queue_wakeups", 278ce110ea1SWei Hu CTLFLAG_RD, &tx_stats->wakeup, "Queue wakeups"); 279ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, "queue_stops", 280ce110ea1SWei Hu CTLFLAG_RD, &tx_stats->stop, "Queue stops"); 281ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, "mbuf_collapse", 282ce110ea1SWei Hu CTLFLAG_RD, &tx_stats->collapse, "Mbuf collapse count"); 283ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 284ce110ea1SWei Hu "mbuf_collapse_err", CTLFLAG_RD, 285ce110ea1SWei Hu &tx_stats->collapse_err, "Mbuf collapse failures"); 286ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 287ce110ea1SWei Hu "dma_mapping_err", CTLFLAG_RD, 288ce110ea1SWei Hu &tx_stats->dma_mapping_err, "DMA mapping failures"); 289ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 290ce110ea1SWei Hu "alt_chg", CTLFLAG_RD, 291ce110ea1SWei Hu &tx_stats->alt_chg, "Switch to alternative txq"); 292ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 293ce110ea1SWei Hu "alt_reset", CTLFLAG_RD, 294ce110ea1SWei Hu &tx_stats->alt_reset, "Reset to self txq"); 295*516b5059SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 296*516b5059SWei Hu "cqe_err", CTLFLAG_RD, 297*516b5059SWei Hu &tx_stats->cqe_err, "Error CQE count"); 298*516b5059SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, tx_list, OID_AUTO, 299*516b5059SWei Hu "cqe_unknown_type", CTLFLAG_RD, 300*516b5059SWei Hu &tx_stats->cqe_unknown_type, "Unknown CQE count"); 301ce110ea1SWei Hu 302ce110ea1SWei Hu /* RX stats */ 303ce110ea1SWei Hu rx_node = SYSCTL_ADD_NODE(ctx, queue_list, OID_AUTO, 304ce110ea1SWei Hu "rxq", CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "RX queue"); 305ce110ea1SWei Hu rx_list = SYSCTL_CHILDREN(rx_node); 306ce110ea1SWei Hu 307ce110ea1SWei Hu rx_stats = &rxq->stats; 308ce110ea1SWei Hu 309ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, "count", 310ce110ea1SWei Hu CTLFLAG_RD, &rx_stats->packets, "Packets received"); 311ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, "bytes", 312ce110ea1SWei Hu CTLFLAG_RD, &rx_stats->bytes, "Bytes received"); 313ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 314ce110ea1SWei Hu "mbuf_alloc_fail", CTLFLAG_RD, 315ce110ea1SWei Hu &rx_stats->mbuf_alloc_fail, "Failed mbuf allocs"); 316ce110ea1SWei Hu SYSCTL_ADD_COUNTER_U64(ctx, rx_list, OID_AUTO, 317ce110ea1SWei Hu "dma_mapping_err", CTLFLAG_RD, 318ce110ea1SWei Hu &rx_stats->dma_mapping_err, "DMA mapping errors"); 319ce110ea1SWei Hu } 320ce110ea1SWei Hu } 321ce110ea1SWei Hu 322ce110ea1SWei Hu /* 323ce110ea1SWei Hu * Free all queues' sysctl trees attached to the port's tree. 324ce110ea1SWei Hu */ 325ce110ea1SWei Hu void 326ce110ea1SWei Hu mana_sysctl_free_queues(struct mana_port_context *apc) 327ce110ea1SWei Hu { 328ce110ea1SWei Hu sysctl_ctx_free(&apc->que_sysctl_ctx); 329ce110ea1SWei Hu } 330ce110ea1SWei Hu 331ce110ea1SWei Hu static int 332ce110ea1SWei Hu mana_sysctl_cleanup_thread_cpu(SYSCTL_HANDLER_ARGS) 333ce110ea1SWei Hu { 334ce110ea1SWei Hu struct mana_port_context *apc = arg1; 335ce110ea1SWei Hu bool bind_cpu = false; 336ce110ea1SWei Hu uint8_t val; 337ce110ea1SWei Hu int err; 338ce110ea1SWei Hu 339ce110ea1SWei Hu val = 0; 340ce110ea1SWei Hu err = sysctl_wire_old_buffer(req, sizeof(val)); 341ce110ea1SWei Hu if (err == 0) { 342ce110ea1SWei Hu val = apc->bind_cleanup_thread_cpu; 343ce110ea1SWei Hu err = sysctl_handle_8(oidp, &val, 0, req); 344ce110ea1SWei Hu } 345ce110ea1SWei Hu 346ce110ea1SWei Hu if (err != 0 || req->newptr == NULL) 347ce110ea1SWei Hu return (err); 348ce110ea1SWei Hu 349ce110ea1SWei Hu if (val != 0) 350ce110ea1SWei Hu bind_cpu = true; 351ce110ea1SWei Hu 352ce110ea1SWei Hu if (bind_cpu != apc->bind_cleanup_thread_cpu) { 353ce110ea1SWei Hu apc->bind_cleanup_thread_cpu = bind_cpu; 354ce110ea1SWei Hu err = mana_restart(apc); 355ce110ea1SWei Hu } 356ce110ea1SWei Hu 357ce110ea1SWei Hu return (err); 358ce110ea1SWei Hu } 359