Message ID | 20191208132304.15521-10-elibr@mellanox.com |
---|---|
State | Changes Requested |
Delegated to: | Ilya Maximets |
Headers | show |
Series | netdev datapath actions offload | expand |
On 08.12.2019 14:22, Eli Britstein wrote: > Implement the flow get method for DPDK, to get the statistics of the > provided ufid, towards reading statistics of fully offloaded flows. > > Signed-off-by: Eli Britstein <elibr@mellanox.com> > Reviewed-by: Oz Shlomo <ozsh@mellanox.com> > --- > lib/netdev-offload-dpdk.c | 40 ++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 40 insertions(+) > > diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c > index 5568400b6..10ab9240a 100644 > --- a/lib/netdev-offload-dpdk.c > +++ b/lib/netdev-offload-dpdk.c > @@ -705,9 +705,49 @@ netdev_offload_dpdk_init_flow_api(struct netdev *netdev) > return netdev_dpdk_flow_api_supported(netdev) ? 0 : EOPNOTSUPP; > } > > +static int > +netdev_offload_dpdk_flow_get(struct netdev *netdev, > + struct match *match OVS_UNUSED, > + struct nlattr **actions OVS_UNUSED, > + const ovs_u128 *ufid, > + struct dpif_flow_stats *stats, > + struct dpif_flow_attrs *attrs OVS_UNUSED, > + struct ofpbuf *buf OVS_UNUSED) > +{ > + struct rte_flow_query_count query = { .reset = 1 }; I see that you're implementing a workaround for 'used' field of a struct by resetting them on each request, but netdev_flow_get() has a different semantics. It should return full flow stats, so you need to implement 'used' logic here on the netdev-offload-provider level. > + struct rte_flow_error error; > + struct rte_flow *rte_flow; > + int ret = 0; > + > + ovs_mutex_lock(&ufid_map_mutex); > + rte_flow = ufid_to_rte_flow_find(ufid); > + if (!rte_flow) { > + ret = -1; > + goto out; > + } > + > + memset(stats, 0, sizeof *stats); > + ret = netdev_dpdk_rte_flow_query(netdev, rte_flow, &query, &error); > + if (ret) { > + VLOG_DBG_RL(&error_rl, > + "%s: Failed to query ufid "UUID_FMT" flow: %p\n", > + netdev_get_name(netdev), UUID_ARGS((struct uuid *)ufid), > + rte_flow); > + ret = -1; > + goto out; > + } > + stats->n_packets += (query.hits_set) ? query.hits : 0; > + stats->n_bytes += (query.bytes_set) ? query.bytes : 0; Why '+=' ? > + > +out: > + ovs_mutex_unlock(&ufid_map_mutex); > + return ret; > +} > + > const struct netdev_flow_api netdev_offload_dpdk = { > .type = "dpdk_flow_api", > .flow_put = netdev_offload_dpdk_flow_put, > .flow_del = netdev_offload_dpdk_flow_del, > .init_flow_api = netdev_offload_dpdk_init_flow_api, > + .flow_get = netdev_offload_dpdk_flow_get, > }; >
diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c index 5568400b6..10ab9240a 100644 --- a/lib/netdev-offload-dpdk.c +++ b/lib/netdev-offload-dpdk.c @@ -705,9 +705,49 @@ netdev_offload_dpdk_init_flow_api(struct netdev *netdev) return netdev_dpdk_flow_api_supported(netdev) ? 0 : EOPNOTSUPP; } +static int +netdev_offload_dpdk_flow_get(struct netdev *netdev, + struct match *match OVS_UNUSED, + struct nlattr **actions OVS_UNUSED, + const ovs_u128 *ufid, + struct dpif_flow_stats *stats, + struct dpif_flow_attrs *attrs OVS_UNUSED, + struct ofpbuf *buf OVS_UNUSED) +{ + struct rte_flow_query_count query = { .reset = 1 }; + struct rte_flow_error error; + struct rte_flow *rte_flow; + int ret = 0; + + ovs_mutex_lock(&ufid_map_mutex); + rte_flow = ufid_to_rte_flow_find(ufid); + if (!rte_flow) { + ret = -1; + goto out; + } + + memset(stats, 0, sizeof *stats); + ret = netdev_dpdk_rte_flow_query(netdev, rte_flow, &query, &error); + if (ret) { + VLOG_DBG_RL(&error_rl, + "%s: Failed to query ufid "UUID_FMT" flow: %p\n", + netdev_get_name(netdev), UUID_ARGS((struct uuid *)ufid), + rte_flow); + ret = -1; + goto out; + } + stats->n_packets += (query.hits_set) ? query.hits : 0; + stats->n_bytes += (query.bytes_set) ? query.bytes : 0; + +out: + ovs_mutex_unlock(&ufid_map_mutex); + return ret; +} + const struct netdev_flow_api netdev_offload_dpdk = { .type = "dpdk_flow_api", .flow_put = netdev_offload_dpdk_flow_put, .flow_del = netdev_offload_dpdk_flow_del, .init_flow_api = netdev_offload_dpdk_init_flow_api, + .flow_get = netdev_offload_dpdk_flow_get, };