[ovs-dev] [PATCH V4 12/17] netdev-offload-dpdk: Framework for actions offload

Ilya Maximets i.maximets at ovn.org
Mon Dec 16 21:27:34 UTC 2019


On 16.12.2019 16:10, Eli Britstein wrote:
> Currently HW offload is accelerating only the rule matching sequence.
> Introduce a framework for offloading rule actions as a pre-step for
> processing the rule actions in HW. In case of a failure, fallback to the
> legacy partial offload scheme.
> 
> Note: a flow will be fully offloaded only if it can process all its
> actions in HW.
> 
> Signed-off-by: Eli Britstein <elibr at mellanox.com>
> Reviewed-by: Oz Shlomo <ozsh at mellanox.com>
> ---
>  lib/netdev-offload-dpdk.c | 104 ++++++++++++++++++++++++++++++++++++++++------
>  1 file changed, 91 insertions(+), 13 deletions(-)
> 
> diff --git a/lib/netdev-offload-dpdk.c b/lib/netdev-offload-dpdk.c
> index 79a7d33fb..a60d68d2c 100644
> --- a/lib/netdev-offload-dpdk.c
> +++ b/lib/netdev-offload-dpdk.c
> @@ -691,6 +691,89 @@ add_flow_mark_rss_actions(struct flow_actions *actions,
>      add_flow_action(actions, RTE_FLOW_ACTION_TYPE_END, NULL);
>  }
>  
> +static struct rte_flow *
> +netdev_offload_dpdk_mark_rss(struct flow_patterns *patterns,
> +                             struct netdev *netdev,
> +                             uint32_t flow_mark)
> +{
> +    struct flow_actions actions = { .actions = NULL, .cnt = 0 };
> +    const struct rte_flow_attr flow_attr = {
> +        .group = 0,
> +        .priority = 0,
> +        .ingress = 1,
> +        .egress = 0
> +    };
> +    struct rte_flow_error error;
> +    struct rte_flow *flow;
> +
> +    add_flow_mark_rss_actions(&actions, flow_mark, netdev);
> +
> +    flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items,
> +                                           actions.actions, &error);
> +
> +    if (!flow) {
> +        VLOG_ERR("%s: Failed to create flow: %s (%u)\n",
> +                 netdev_get_name(netdev), error.message, error.type);

netdev_offload_dpdk_flow_create() already printed the whole flow and the
error.  Do we need a duplicated message?

> +    }
> +
> +    free_flow_actions(&actions);
> +    return flow;
> +}
> +
> +static int
> +parse_flow_actions(struct netdev *netdev OVS_UNUSED,
> +                   struct flow_actions *actions,
> +                   struct nlattr *nl_actions,
> +                   size_t nl_actions_len,
> +                   struct offload_info *info OVS_UNUSED)
> +{
> +    struct nlattr *nla;
> +    size_t left;
> +
> +    NL_ATTR_FOR_EACH_UNSAFE (nla, left, nl_actions, nl_actions_len) {
> +        VLOG_DBG_RL(&error_rl,
> +                    "Unsupported action type %d", nl_attr_type(nla));
> +        return -1;
> +    }
> +
> +    if (nl_actions_len == 0) {
> +        VLOG_DBG_RL(&error_rl,
> +                    "Unsupported action type drop");
> +        return -1;
> +    }
> +
> +    add_flow_action(actions, RTE_FLOW_ACTION_TYPE_END, NULL);
> +    return 0;
> +}
> +
> +static struct rte_flow *
> +netdev_offload_dpdk_actions(struct netdev *netdev,
> +                            struct flow_patterns *patterns,
> +                            struct nlattr *nl_actions,
> +                            size_t actions_len,
> +                            struct offload_info *info)
> +{
> +    const struct rte_flow_attr flow_attr = { .ingress = 1, .transfer = 1 };
> +    struct flow_actions actions = { .actions = NULL, .cnt = 0 };
> +    struct rte_flow *flow = NULL;
> +    struct rte_flow_error error;
> +    int ret;
> +
> +    ret = parse_flow_actions(netdev, &actions, nl_actions, actions_len, info);
> +    if (ret) {
> +        goto out;
> +    }
> +    flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns->items,
> +                                           actions.actions, &error);
> +    if (!flow) {
> +        VLOG_ERR("%s: Failed to create flow: %s (%u)\n",
> +                 netdev_get_name(netdev), error.message, error.type);

Ditto.

> +    }
> +out:
> +    free_flow_actions(&actions);
> +    return flow;
> +}
> +
>  static int
>  netdev_offload_dpdk_add_flow(struct netdev *netdev,
>                               const struct match *match,
> @@ -699,16 +782,8 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev,
>                               const ovs_u128 *ufid,
>                               struct offload_info *info)
>  {
> -    const struct rte_flow_attr flow_attr = {
> -        .group = 0,
> -        .priority = 0,
> -        .ingress = 1,
> -        .egress = 0
> -    };
>      struct flow_patterns patterns = { .items = NULL, .cnt = 0 };
> -    struct flow_actions actions = { .actions = NULL, .cnt = 0 };
>      struct rte_flow *flow;
> -    struct rte_flow_error error;
>      int ret = 0;
>  
>      ret = parse_flow_match(&patterns, match);
> @@ -716,10 +791,14 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev,
>          goto out;
>      }
>  
> -    add_flow_mark_rss_actions(&actions, info->flow_mark, netdev);
> -
> -    flow = netdev_offload_dpdk_flow_create(netdev, &flow_attr, patterns.items,
> -                                           actions.actions, &error);
> +    flow = netdev_offload_dpdk_actions(netdev, &patterns, nl_actions,
> +                                       actions_len, info);
> +    if (!flow) {
> +        /* if we failed to offload the rule actions fallback to mark rss
> +         * actions.
> +         */

Comment style.

> +        flow = netdev_offload_dpdk_mark_rss(&patterns, netdev, info->flow_mark);
> +    }
>  
>      if (!flow) {
>          ret = -1;
> @@ -731,7 +810,6 @@ netdev_offload_dpdk_add_flow(struct netdev *netdev,
>  
>  out:
>      free_flow_patterns(&patterns);
> -    free_flow_actions(&actions);
>      return ret;
>  }
>  
> 


More information about the dev mailing list