On 28.02.2019 1:37, Ophir Munk wrote: > From: Roni Bar Yanai <[email protected]> > > Before offloading code was added to the netdev-dpdk.c file (MARK and > RSS actions) the only DPDK RTE calls in use were rte_flow_create() and > rte_flow_destroy(). In preparation for splitting the offloading code > from the netdev-dpdk.c file to a separate file, it is required > to embed these RTE calls into a global netdev-dpdk-* API so that > they can be called from the new file. An example for this requirement > can be seen in the handling of dev->mutex, which should be encapsulated > inside netdev-dpdk class (netdev-dpdk.c file), and should be unknown > to the outside callers. This commit embeds the rte_flow_create() call > inside the netdev_dpdk_flow_create() API and the rte_flow_destroy() > call inside the netdev_dpdk_rte_flow_destroy() API. > > Reviewed-by: Asaf Penso <[email protected]> > Signed-off-by: Roni Bar Yanai <[email protected]> > Signed-off-by: Ophir Munk <[email protected]> > --- > lib/netdev-dpdk.c | 44 ++++++++++++++++++++++++++++++++------------ > lib/netdev-dpdk.h | 16 ++++++++++++++++ > 2 files changed, 48 insertions(+), 12 deletions(-) > > diff --git a/lib/netdev-dpdk.c b/lib/netdev-dpdk.c > index 32a6ffd..57f9c25 100644 > --- a/lib/netdev-dpdk.c > +++ b/lib/netdev-dpdk.c > @@ -4203,6 +4203,35 @@ unlock: > return err; > } > > +int > +netdev_dpdk_rte_flow_destroy(struct netdev *netdev, > + struct rte_flow *rte_flow, > + struct rte_flow_error *error) > +{ > + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); > + int ret; > + > + ovs_mutex_lock(&dev->mutex); > + ret = rte_flow_destroy(dev->port_id, rte_flow, error); > + ovs_mutex_unlock(&dev->mutex); > + return ret; > +} > + > +struct rte_flow * > +netdev_dpdk_rte_flow_create(struct netdev *netdev, > + const struct rte_flow_attr *attr, > + const struct rte_flow_item *items, > + const struct rte_flow_action *actions, > + struct rte_flow_error *error) > +{ > + struct rte_flow *flow; > + struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); > + > + ovs_mutex_lock(&dev->mutex); > + flow = rte_flow_create(dev->port_id, attr, items, actions, error); > + ovs_mutex_unlock(&dev->mutex); > + return flow; > +} > > /* Find rte_flow with @ufid */ > static struct rte_flow * > @@ -4554,7 +4583,6 @@ netdev_dpdk_add_rte_flow_offload(struct netdev *netdev, > size_t actions_len OVS_UNUSED, > const ovs_u128 *ufid, > struct offload_info *info) { > - struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); > const struct rte_flow_attr flow_attr = { > .group = 0, > .priority = 0, > @@ -4759,15 +4787,12 @@ end_proto_check: > mark.id = info->flow_mark; > add_flow_action(&actions, RTE_FLOW_ACTION_TYPE_MARK, &mark); > > - ovs_mutex_lock(&dev->mutex); > > rss = add_flow_rss_action(&actions, netdev); > add_flow_action(&actions, RTE_FLOW_ACTION_TYPE_END, NULL); > > - flow = rte_flow_create(dev->port_id, &flow_attr, patterns.items, > - actions.actions, &error); > - > - ovs_mutex_unlock(&dev->mutex); > + flow = netdev_dpdk_rte_flow_create(netdev, &flow_attr,patterns.items, > + actions.actions, &error); > > free(rss); > if (!flow) { > @@ -4861,13 +4886,9 @@ static int > netdev_dpdk_destroy_rte_flow(struct netdev *netdev, > const ovs_u128 *ufid, > struct rte_flow *rte_flow) { > - struct netdev_dpdk *dev = netdev_dpdk_cast(netdev); > struct rte_flow_error error; > - int ret; > + int ret = netdev_dpdk_rte_flow_destroy(netdev, rte_flow, &error); > > - ovs_mutex_lock(&dev->mutex); > - > - ret = rte_flow_destroy(dev->port_id, rte_flow, &error); > if (ret == 0) { > ufid_to_rte_flow_disassociate(ufid); > VLOG_DBG("%s: removed rte flow %p associated with ufid " UUID_FMT > "\n", > @@ -4878,7 +4899,6 @@ netdev_dpdk_destroy_rte_flow(struct netdev *netdev, > netdev_get_name(netdev), error.type, error.message); > } > > - ovs_mutex_unlock(&dev->mutex); > return ret; > } > > diff --git a/lib/netdev-dpdk.h b/lib/netdev-dpdk.h > index b7d02a7..ab36032 100644 > --- a/lib/netdev-dpdk.h > +++ b/lib/netdev-dpdk.h > @@ -22,11 +22,27 @@ > #include "openvswitch/compiler.h" > > struct dp_packet; > +struct netdev; > +struct rte_flow; > +struct rte_flow_error; > +struct rte_flow_attr; > +struct rte_flow_item; > +struct rte_flow_action;
Maybe 'rte_*' structures should go under 'ifdef' ? You're not defining flow functions for non-DPDK case anyway. > > #ifdef DPDK_NETDEV > > void netdev_dpdk_register(void); > void free_dpdk_buf(struct dp_packet *); > +int > +netdev_dpdk_rte_flow_destroy(struct netdev *netdev, > + struct rte_flow *rte_flow, > + struct rte_flow_error *error); > +struct rte_flow * > +netdev_dpdk_rte_flow_create(struct netdev *netdev, > + const struct rte_flow_attr *attr, > + const struct rte_flow_item *items, > + const struct rte_flow_action *actions, > + struct rte_flow_error *error); > > #else > > _______________________________________________ dev mailing list [email protected] https://mail.openvswitch.org/mailman/listinfo/ovs-dev
