On 02/12/2021 21:16, David Marchand wrote:
When troubleshooting multiqueue setups, having per queue statistics helps
checking packets repartition in rx and tx queues.

Per queue statistics are exported by most DPDK drivers (with capability
RTE_ETH_DEV_AUTOFILL_QUEUE_XSTATS).
OVS only filters DPDK statistics, there is nothing to request in DPDK API.
So the only change is to extend the filter on xstats.

Querying statistics with
$ ovs-vsctl get interface dpdk0 statistics |
   sed -e 's#[{}]##g' -e 's#, #\n#g'

and comparing gives:
@@ -13,7 +13,12 @@
  rx_phy_crc_errors=0
  rx_phy_in_range_len_errors=0
  rx_phy_symbol_errors=0
+rx_q0_bytes=0
  rx_q0_errors=0
+rx_q0_packets=0
+rx_q1_bytes=0
  rx_q1_errors=0
+rx_q1_packets=0
  rx_wqe_errors=0
  tx_broadcast_packets=0
  tx_bytes=0
@@ -27,3 +32,13 @@
  tx_pp_rearm_queue_errors=0
  tx_pp_timestamp_future_errors=0
  tx_pp_timestamp_past_errors=0
+tx_q0_bytes=0
+tx_q0_packets=0
+tx_q1_bytes=0
+tx_q1_packets=0
+tx_q2_bytes=0
+tx_q2_packets=0
+tx_q3_bytes=0
+tx_q3_packets=0
+tx_q4_bytes=0
+tx_q4_packets=0

Signed-off-by: David Marchand <[email protected]>
Reviewed-by: Maxime Coquelin <[email protected]>

Tested and working when increasing/decreasing rx/tx queues.

'rx_q15_bytes=0, rx_q15_errors=0, rx_q15_packets=0'

Acked-by: Kevin Traynor <[email protected]>

---
Changes since RFC:
- dropped regex and used simpler string manipulations,

---
  lib/netdev-dpdk.c | 17 ++++++++++++++---
  1 file changed, 14 insertions(+), 3 deletions(-)

diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c
index 51bb41551b..1e6079d544 100644
--- a/lib/netdev-dpdk.c
+++ b/lib/netdev-dpdk.c
@@ -1582,6 +1582,16 @@ netdev_dpdk_get_xstat_name(struct netdev_dpdk *dev, 
uint64_t id)
      return dev->rte_xstats_names[id].name;
  }
+static bool
+is_queue_stat(const char *s)
+{
+    uint16_t tmp;
+
+    return (s[0] == 'r' || s[0] == 't') &&
+            (ovs_scan(s + 1, "x_q%"SCNu16"_packets", &tmp) ||
+             ovs_scan(s + 1, "x_q%"SCNu16"_bytes", &tmp));
+}
+
  static void
  netdev_dpdk_configure_xstats(struct netdev_dpdk *dev)
      OVS_REQUIRES(dev->mutex)
@@ -1632,9 +1642,10 @@ netdev_dpdk_configure_xstats(struct netdev_dpdk *dev)
          id = rte_xstats[i].id;
          name = netdev_dpdk_get_xstat_name(dev, id);
- /* We need to filter out everything except dropped, error and
-         * management counters. */
-        if (string_ends_with(name, "_errors") ||
+        /* For custom stats, we filter out everything except per rxq/txq basic
+         * stats, and dropped, error and management counters. */
+        if (is_queue_stat(name) ||
+            string_ends_with(name, "_errors") ||
              strstr(name, "_management_") ||
              string_ends_with(name, "_dropped")) {

_______________________________________________
dev mailing list
[email protected]
https://mail.openvswitch.org/mailman/listinfo/ovs-dev

Reply via email to