diff mbox series

[ovs-dev,RFC,04/26] netdev-offload-dpdk: Implement hw-offload statistics read

Message ID 41f050792e324f23eaa606c3637471ffd6e85e0b.1607177117.git.grive@u256.net
State RFC
Headers show
Series [ovs-dev,RFC,01/26] netdev: Add flow API de-init function | expand

Commit Message

Gaetan Rivet Dec. 5, 2020, 2:21 p.m. UTC
In the DPDK offload provider, keep track of inserted rte_flow and report
it when asked.  Only one thread writes the counter so consistency is
guaranteed.

Signed-off-by: Gaetan Rivet <grive@u256.net>
---
 lib/netdev-offload-dpdk.c | 22 ++++++++++++++++++++++
 1 file changed, 22 insertions(+)
diff mbox series

Patch

diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
index 8d39ab7b4..b29c1188f 100644
--- a/lib/netdev-offload-dpdk.c
+++ b/lib/netdev-offload-dpdk.c
@@ -63,6 +63,7 @@  struct ufid_to_rte_flow_data {
 
 struct netdev_offload_dpdk_data {
     struct cmap ufid_to_rte_flow;
+    uint64_t rte_flow_counter;
 };
 
 static int
@@ -618,6 +619,10 @@  netdev_offload_dpdk_flow_create(struct netdev *netdev,
 
     flow = netdev_dpdk_rte_flow_create(netdev, attr, items, actions, error);
     if (flow) {
+        struct netdev_offload_dpdk_data *data;
+
+        data = netdev->hw_info.offload_data;
+        data->rte_flow_counter++;
         if (!VLOG_DROP_DBG(&rl)) {
             dump_flow(&s, &s_extra, attr, items, actions);
             extra_str = ds_cstr(&s_extra);
@@ -1504,6 +1509,11 @@  netdev_offload_dpdk_destroy_flow(struct netdev *netdev,
     int ret = netdev_dpdk_rte_flow_destroy(netdev, rte_flow, &error);
 
     if (ret == 0) {
+        struct netdev_offload_dpdk_data *data;
+
+        data = netdev->hw_info.offload_data;
+        data->rte_flow_counter--;
+
         ufid_to_rte_flow_disassociate(netdev, ufid);
         VLOG_DBG_RL(&rl, "%s: rte_flow 0x%"PRIxPTR
                     " flow destroy %d ufid " UUID_FMT,
@@ -1644,6 +1654,17 @@  out:
     return ret;
 }
 
+static int
+netdev_offload_dpdk_hw_offload_stats_get(struct netdev *netdev,
+                                         uint64_t *counter)
+{
+    struct netdev_offload_dpdk_data *data;
+
+    data = netdev->hw_info.offload_data;
+    *counter = data->rte_flow_counter;
+    return 0;
+}
+
 const struct netdev_flow_api netdev_offload_dpdk = {
     .type = "dpdk_flow_api",
     .flow_put = netdev_offload_dpdk_flow_put,
@@ -1651,4 +1672,5 @@  const struct netdev_flow_api netdev_offload_dpdk = {
     .init_flow_api = netdev_offload_dpdk_init_flow_api,
     .deinit_flow_api = netdev_offload_dpdk_deinit_flow_api,
     .flow_get = netdev_offload_dpdk_flow_get,
+    .hw_offload_stats_get = netdev_offload_dpdk_hw_offload_stats_get,
 };