* DPDK callback to get extended device statistics. * * @param dev * Pointer to Ethernet device structure. * @param[out] stats * Stats table output buffer. * @param n * The size of the stats table. * * @return * Number of xstats on success, negative on failure. */
| 3439 | * Number of xstats on success, negative on failure. |
| 3440 | */ |
| 3441 | static int ena_xstats_get(struct rte_eth_dev *dev, |
| 3442 | struct rte_eth_xstat *xstats, |
| 3443 | unsigned int n) |
| 3444 | { |
| 3445 | struct ena_adapter *adapter = dev->data->dev_private; |
| 3446 | unsigned int xstats_count = ena_xstats_calc_num(dev->data); |
| 3447 | unsigned int stat, i, count = 0; |
| 3448 | int stat_offset; |
| 3449 | void *stats_begin; |
| 3450 | uint64_t metrics_stats[ENA_MAX_CUSTOMER_METRICS]; |
| 3451 | struct ena_stats_srd srd_info = {0}; |
| 3452 | |
| 3453 | if (n < xstats_count) |
| 3454 | return xstats_count; |
| 3455 | |
| 3456 | if (!xstats) |
| 3457 | return 0; |
| 3458 | |
| 3459 | for (stat = 0; stat < ENA_STATS_ARRAY_GLOBAL; stat++, count++) { |
| 3460 | stat_offset = ena_stats_global_strings[stat].stat_offset; |
| 3461 | stats_begin = &adapter->dev_stats; |
| 3462 | |
| 3463 | xstats[count].id = count; |
| 3464 | xstats[count].value = *((uint64_t *) |
| 3465 | ((char *)stats_begin + stat_offset)); |
| 3466 | } |
| 3467 | |
| 3468 | ena_copy_customer_metrics(adapter, metrics_stats, adapter->metrics_num); |
| 3469 | stats_begin = metrics_stats; |
| 3470 | for (stat = 0; stat < adapter->metrics_num; stat++, count++) { |
| 3471 | stat_offset = ena_stats_metrics_strings[stat].stat_offset; |
| 3472 | |
| 3473 | xstats[count].id = count; |
| 3474 | xstats[count].value = *((uint64_t *) |
| 3475 | ((char *)stats_begin + stat_offset)); |
| 3476 | } |
| 3477 | |
| 3478 | ena_copy_ena_srd_info(adapter, &srd_info); |
| 3479 | stats_begin = &srd_info; |
| 3480 | for (stat = 0; stat < ENA_STATS_ARRAY_ENA_SRD; stat++, count++) { |
| 3481 | stat_offset = ena_stats_srd_strings[stat].stat_offset; |
| 3482 | xstats[count].id = count; |
| 3483 | xstats[count].value = *((uint64_t *) |
| 3484 | ((char *)stats_begin + stat_offset)); |
| 3485 | } |
| 3486 | |
| 3487 | for (stat = 0; stat < ENA_STATS_ARRAY_RX; stat++) { |
| 3488 | for (i = 0; i < dev->data->nb_rx_queues; i++, count++) { |
| 3489 | stat_offset = ena_stats_rx_strings[stat].stat_offset; |
| 3490 | stats_begin = &adapter->rx_ring[i].rx_stats; |
| 3491 | |
| 3492 | xstats[count].id = count; |
| 3493 | xstats[count].value = *((uint64_t *) |
| 3494 | ((char *)stats_begin + stat_offset)); |
| 3495 | } |
| 3496 | } |
| 3497 | |
| 3498 | for (stat = 0; stat < ENA_STATS_ARRAY_TX; stat++) { |
nothing calls this directly
no test coverage detected