ethdev: fix xstats id mismatch
[dpdk.git] / lib / librte_ether / rte_ethdev.c
index 42aaef7..0a6e3f1 100644 (file)
@@ -1536,6 +1536,7 @@ rte_eth_xstats_get_names(uint8_t port_id,
        struct rte_eth_dev *dev;
        int cnt_used_entries;
        int cnt_expected_entries;
+       int cnt_driver_entries;
        uint32_t idx, id_queue;
 
        cnt_expected_entries = get_xstats_count(port_id);
@@ -1545,19 +1546,9 @@ rte_eth_xstats_get_names(uint8_t port_id,
 
        /* port_id checked in get_xstats_count() */
        dev = &rte_eth_devices[port_id];
-       if (dev->dev_ops->xstats_get_names != NULL) {
-               cnt_used_entries = (*dev->dev_ops->xstats_get_names)(
-                       dev, xstats_names, size);
-               if (cnt_used_entries < 0)
-                       return cnt_used_entries;
-       } else
-               /* Driver itself does not support extended stats, but
-                * still have basic stats.
-                */
-               cnt_used_entries = 0;
+       cnt_used_entries = 0;
 
        for (idx = 0; idx < RTE_NB_STATS; idx++) {
-               xstats_names[cnt_used_entries].id = cnt_used_entries;
                snprintf(xstats_names[cnt_used_entries].name,
                        sizeof(xstats_names[0].name),
                        "%s", rte_stats_strings[idx].name);
@@ -1565,7 +1556,6 @@ rte_eth_xstats_get_names(uint8_t port_id,
        }
        for (id_queue = 0; id_queue < dev->data->nb_rx_queues; id_queue++) {
                for (idx = 0; idx < RTE_NB_RXQ_STATS; idx++) {
-                       xstats_names[cnt_used_entries].id = cnt_used_entries;
                        snprintf(xstats_names[cnt_used_entries].name,
                                sizeof(xstats_names[0].name),
                                "rx_q%u%s",
@@ -1576,7 +1566,6 @@ rte_eth_xstats_get_names(uint8_t port_id,
        }
        for (id_queue = 0; id_queue < dev->data->nb_tx_queues; id_queue++) {
                for (idx = 0; idx < RTE_NB_TXQ_STATS; idx++) {
-                       xstats_names[cnt_used_entries].id = cnt_used_entries;
                        snprintf(xstats_names[cnt_used_entries].name,
                                sizeof(xstats_names[0].name),
                                "tx_q%u%s",
@@ -1584,6 +1573,20 @@ rte_eth_xstats_get_names(uint8_t port_id,
                        cnt_used_entries++;
                }
        }
+
+       if (dev->dev_ops->xstats_get_names != NULL) {
+               /* If there are any driver-specific xstats, append them
+                * to end of list.
+                */
+               cnt_driver_entries = (*dev->dev_ops->xstats_get_names)(
+                       dev,
+                       xstats_names + cnt_used_entries,
+                       size - cnt_used_entries);
+               if (cnt_driver_entries < 0)
+                       return cnt_driver_entries;
+               cnt_used_entries += cnt_driver_entries;
+       }
+
        return cnt_used_entries;
 }
 
@@ -1631,7 +1634,6 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
                stats_ptr = RTE_PTR_ADD(&eth_stats,
                                        rte_stats_strings[i].offset);
                val = *stats_ptr;
-               xstats[count].id = count + xcount;
                xstats[count++].value = val;
        }
 
@@ -1642,7 +1644,6 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
                                        rte_rxq_stats_strings[i].offset +
                                        q * sizeof(uint64_t));
                        val = *stats_ptr;
-                       xstats[count].id = count + xcount;
                        xstats[count++].value = val;
                }
        }
@@ -1654,11 +1655,13 @@ rte_eth_xstats_get(uint8_t port_id, struct rte_eth_xstat *xstats,
                                        rte_txq_stats_strings[i].offset +
                                        q * sizeof(uint64_t));
                        val = *stats_ptr;
-                       xstats[count].id = count + xcount;
                        xstats[count++].value = val;
                }
        }
 
+       for (i = 0; i < count + xcount; i++)
+               xstats[i].id = i;
+
        return count + xcount;
 }
 
@@ -3307,18 +3310,6 @@ rte_eth_timesync_write_time(uint8_t port_id, const struct timespec *timestamp)
        return (*dev->dev_ops->timesync_write_time)(dev, timestamp);
 }
 
-int
-rte_eth_dev_get_reg_length(uint8_t port_id)
-{
-       struct rte_eth_dev *dev;
-
-       RTE_ETH_VALID_PORTID_OR_ERR_RET(port_id, -ENODEV);
-
-       dev = &rte_eth_devices[port_id];
-       RTE_FUNC_PTR_OR_ERR_RET(*dev->dev_ops->get_reg_length, -ENOTSUP);
-       return (*dev->dev_ops->get_reg_length)(dev);
-}
-
 int
 rte_eth_dev_get_reg_info(uint8_t port_id, struct rte_dev_reg_info *info)
 {