| 1142 | } |
| 1143 | |
| 1144 | static int ena_stats_get(struct rte_eth_dev *dev, |
| 1145 | struct rte_eth_stats *stats) |
| 1146 | { |
| 1147 | struct ena_admin_basic_stats ena_stats; |
| 1148 | struct ena_adapter *adapter = dev->data->dev_private; |
| 1149 | struct ena_com_dev *ena_dev = &adapter->ena_dev; |
| 1150 | int rc; |
| 1151 | int i; |
| 1152 | int max_rings_stats; |
| 1153 | |
| 1154 | memset(&ena_stats, 0, sizeof(ena_stats)); |
| 1155 | |
| 1156 | rte_spinlock_lock(&adapter->admin_lock); |
| 1157 | rc = ENA_PROXY(adapter, ena_com_get_dev_basic_stats, ena_dev, |
| 1158 | &ena_stats); |
| 1159 | rte_spinlock_unlock(&adapter->admin_lock); |
| 1160 | if (unlikely(rc)) { |
| 1161 | PMD_DRV_LOG(ERR, "Could not retrieve statistics from ENA\n"); |
| 1162 | return rc; |
| 1163 | } |
| 1164 | |
| 1165 | /* Set of basic statistics from ENA */ |
| 1166 | stats->ipackets = __MERGE_64B_H_L(ena_stats.rx_pkts_high, |
| 1167 | ena_stats.rx_pkts_low); |
| 1168 | stats->opackets = __MERGE_64B_H_L(ena_stats.tx_pkts_high, |
| 1169 | ena_stats.tx_pkts_low); |
| 1170 | stats->ibytes = __MERGE_64B_H_L(ena_stats.rx_bytes_high, |
| 1171 | ena_stats.rx_bytes_low); |
| 1172 | stats->obytes = __MERGE_64B_H_L(ena_stats.tx_bytes_high, |
| 1173 | ena_stats.tx_bytes_low); |
| 1174 | |
| 1175 | /* Driver related stats */ |
| 1176 | stats->imissed = adapter->drv_stats->rx_drops; |
| 1177 | stats->ierrors = rte_atomic64_read(&adapter->drv_stats->ierrors); |
| 1178 | stats->oerrors = rte_atomic64_read(&adapter->drv_stats->oerrors); |
| 1179 | stats->rx_nombuf = rte_atomic64_read(&adapter->drv_stats->rx_nombuf); |
| 1180 | |
| 1181 | max_rings_stats = RTE_MIN(dev->data->nb_rx_queues, |
| 1182 | RTE_ETHDEV_QUEUE_STAT_CNTRS); |
| 1183 | for (i = 0; i < max_rings_stats; ++i) { |
| 1184 | struct ena_stats_rx *rx_stats = &adapter->rx_ring[i].rx_stats; |
| 1185 | |
| 1186 | stats->q_ibytes[i] = rx_stats->bytes; |
| 1187 | stats->q_ipackets[i] = rx_stats->cnt; |
| 1188 | stats->q_errors[i] = rx_stats->bad_desc_num + |
| 1189 | rx_stats->bad_req_id; |
| 1190 | } |
| 1191 | |
| 1192 | max_rings_stats = RTE_MIN(dev->data->nb_tx_queues, |
| 1193 | RTE_ETHDEV_QUEUE_STAT_CNTRS); |
| 1194 | for (i = 0; i < max_rings_stats; ++i) { |
| 1195 | struct ena_stats_tx *tx_stats = &adapter->tx_ring[i].tx_stats; |
| 1196 | |
| 1197 | stats->q_obytes[i] = tx_stats->bytes; |
| 1198 | stats->q_opackets[i] = tx_stats->cnt; |
| 1199 | } |
| 1200 | |
| 1201 | return 0; |
nothing calls this directly
no test coverage detected