Use generic per-queue infrastructure.
This also fixes bug where ring code was not accounting
for bytes.

Signed-off-by: Stephen Hemminger <step...@networkplumber.org>
---
 drivers/net/ring/rte_eth_ring.c | 71 +++++++++++++--------------------
 1 file changed, 28 insertions(+), 43 deletions(-)

diff --git a/drivers/net/ring/rte_eth_ring.c b/drivers/net/ring/rte_eth_ring.c
index b16f5d55f2..85f14dd679 100644
--- a/drivers/net/ring/rte_eth_ring.c
+++ b/drivers/net/ring/rte_eth_ring.c
@@ -7,6 +7,7 @@
 #include "rte_eth_ring.h"
 #include <rte_mbuf.h>
 #include <ethdev_driver.h>
+#include <ethdev_swstats.h>
 #include <rte_malloc.h>
 #include <rte_memcpy.h>
 #include <rte_os_shim.h>
@@ -44,8 +45,8 @@ enum dev_action {
 
 struct ring_queue {
        struct rte_ring *rng;
-       RTE_ATOMIC(uint64_t) rx_pkts;
-       RTE_ATOMIC(uint64_t) tx_pkts;
+
+       struct rte_eth_counters stats;
 };
 
 struct pmd_internals {
@@ -77,12 +78,13 @@ eth_ring_rx(void *q, struct rte_mbuf **bufs, uint16_t 
nb_bufs)
 {
        void **ptrs = (void *)&bufs[0];
        struct ring_queue *r = q;
-       const uint16_t nb_rx = (uint16_t)rte_ring_dequeue_burst(r->rng,
-                       ptrs, nb_bufs, NULL);
-       if (r->rng->flags & RING_F_SC_DEQ)
-               r->rx_pkts += nb_rx;
-       else
-               rte_atomic_fetch_add_explicit(&r->rx_pkts, nb_rx, 
rte_memory_order_relaxed);
+       uint16_t i, nb_rx;
+
+       nb_rx = (uint16_t)rte_ring_dequeue_burst(r->rng, ptrs, nb_bufs, NULL);
+
+       for (i = 0; i < nb_rx; i++)
+               rte_eth_count_mbuf(&r->stats, bufs[i]);
+
        return nb_rx;
 }
 
@@ -90,13 +92,20 @@ static uint16_t
 eth_ring_tx(void *q, struct rte_mbuf **bufs, uint16_t nb_bufs)
 {
        void **ptrs = (void *)&bufs[0];
+       uint32_t *sizes;
        struct ring_queue *r = q;
-       const uint16_t nb_tx = (uint16_t)rte_ring_enqueue_burst(r->rng,
-                       ptrs, nb_bufs, NULL);
-       if (r->rng->flags & RING_F_SP_ENQ)
-               r->tx_pkts += nb_tx;
-       else
-               rte_atomic_fetch_add_explicit(&r->tx_pkts, nb_tx, 
rte_memory_order_relaxed);
+       uint16_t i, nb_tx;
+
+       sizes = alloca(sizeof(uint32_t) * nb_bufs);
+
+       for (i = 0; i < nb_bufs; i++)
+               sizes[i] = rte_pktmbuf_pkt_len(bufs[i]);
+
+       nb_tx = (uint16_t)rte_ring_enqueue_burst(r->rng, ptrs, nb_bufs, NULL);
+
+       for (i = 0; i < nb_tx; i++)
+               rte_eth_count_packet(&r->stats, sizes[i]);
+
        return nb_tx;
 }
 
@@ -193,40 +202,16 @@ eth_dev_info(struct rte_eth_dev *dev,
 static int
 eth_stats_get(struct rte_eth_dev *dev, struct rte_eth_stats *stats)
 {
-       unsigned int i;
-       unsigned long rx_total = 0, tx_total = 0;
-       const struct pmd_internals *internal = dev->data->dev_private;
-
-       for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&
-                       i < dev->data->nb_rx_queues; i++) {
-               stats->q_ipackets[i] = internal->rx_ring_queues[i].rx_pkts;
-               rx_total += stats->q_ipackets[i];
-       }
-
-       for (i = 0; i < RTE_ETHDEV_QUEUE_STAT_CNTRS &&
-                       i < dev->data->nb_tx_queues; i++) {
-               stats->q_opackets[i] = internal->tx_ring_queues[i].tx_pkts;
-               tx_total += stats->q_opackets[i];
-       }
-
-       stats->ipackets = rx_total;
-       stats->opackets = tx_total;
-
-       return 0;
+       return rte_eth_counters_stats_get(dev, offsetof(struct ring_queue, 
stats),
+                                         offsetof(struct ring_queue, stats),
+                                         stats);
 }
 
 static int
 eth_stats_reset(struct rte_eth_dev *dev)
 {
-       unsigned int i;
-       struct pmd_internals *internal = dev->data->dev_private;
-
-       for (i = 0; i < dev->data->nb_rx_queues; i++)
-               internal->rx_ring_queues[i].rx_pkts = 0;
-       for (i = 0; i < dev->data->nb_tx_queues; i++)
-               internal->tx_ring_queues[i].tx_pkts = 0;
-
-       return 0;
+       return rte_eth_counters_reset(dev, offsetof(struct ring_queue, stats),
+                                     offsetof(struct ring_queue, stats));
 }
 
 static void
-- 
2.43.0

Reply via email to