[v2,53/62] net/cnxk: support for rss in rte_flow

Message ID 20210607175943.31690-54-ndabilpuram@marvell.com (mailing list archive)
State Changes Requested, archived
Delegated to: Jerin Jacob
Headers
Series Marvell CNXK Ethdev Driver |

Checks

Context Check Description
ci/checkpatch success coding style OK

Commit Message

Nithin Dabilpuram June 7, 2021, 5:59 p.m. UTC
  From: Satheesh Paul <psatheesh@marvell.com>

Added support for rss action in rte_flow code based on ROC.

Signed-off-by: Satheesh Paul <psatheesh@marvell.com>
---
 drivers/net/cnxk/cnxk_rte_flow.c | 72 +++++++++++++++++++++++++++++++++++-----
 1 file changed, 64 insertions(+), 8 deletions(-)
  

Comments

Jerin Jacob June 15, 2021, 2:38 p.m. UTC | #1
On Mon, Jun 7, 2021 at 11:39 PM Nithin Dabilpuram
<ndabilpuram@marvell.com> wrote:
>
> From: Satheesh Paul <psatheesh@marvell.com>
>
> Added support for rss action in rte_flow code based on ROC.
>
> Signed-off-by: Satheesh Paul <psatheesh@marvell.com>
> ---
>  drivers/net/cnxk/cnxk_rte_flow.c | 72 +++++++++++++++++++++++++++++++++++-----

Looks like we missed updating doc/guides/nics/features/cnxk.ini for
this rss action.


>  1 file changed, 64 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/net/cnxk/cnxk_rte_flow.c b/drivers/net/cnxk/cnxk_rte_flow.c
> index d0e7bdc..8486e9e 100644
> --- a/drivers/net/cnxk/cnxk_rte_flow.c
> +++ b/drivers/net/cnxk/cnxk_rte_flow.c
> @@ -4,15 +4,64 @@
>  #include <cnxk_rte_flow.h>
>
>  static int
> -cnxk_map_actions(struct rte_eth_dev *dev,
> +npc_rss_action_validate(struct rte_eth_dev *dev,
> +                       const struct rte_flow_attr *attr,
> +                       const struct rte_flow_action *act)
> +{
> +       const struct rte_flow_action_rss *rss;
> +
> +       rss = (const struct rte_flow_action_rss *)act->conf;
> +
> +       if (attr->egress) {
> +               plt_err("No support of RSS in egress");
> +               return -EINVAL;
> +       }
> +
> +       if (dev->data->dev_conf.rxmode.mq_mode != ETH_MQ_RX_RSS) {
> +               plt_err("multi-queue mode is disabled");
> +               return -ENOTSUP;
> +       }
> +
> +       if (!rss || !rss->queue_num) {
> +               plt_err("no valid queues");
> +               return -EINVAL;
> +       }
> +
> +       if (rss->func != RTE_ETH_HASH_FUNCTION_DEFAULT) {
> +               plt_err("non-default RSS hash functions are not supported");
> +               return -ENOTSUP;
> +       }
> +
> +       if (rss->key_len && rss->key_len > ROC_NIX_RSS_KEY_LEN) {
> +               plt_err("RSS hash key too large");
> +               return -ENOTSUP;
> +       }
> +
> +       return 0;
> +}
> +
> +static void
> +npc_rss_flowkey_get(struct cnxk_eth_dev *dev,
> +                   const struct roc_npc_action *rss_action,
> +                   uint32_t *flowkey_cfg)
> +{
> +       const struct roc_npc_action_rss *rss;
> +
> +       rss = (const struct roc_npc_action_rss *)rss_action->conf;
> +
> +       *flowkey_cfg = cnxk_rss_ethdev_to_nix(dev, rss->types, rss->level);
> +}
> +
> +static int
> +cnxk_map_actions(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
>                  const struct rte_flow_action actions[],
> -                struct roc_npc_action in_actions[])
> +                struct roc_npc_action in_actions[], uint32_t *flowkey_cfg)
>  {
>         struct cnxk_eth_dev *hw = dev->data->dev_private;
>         const struct rte_flow_action_count *act_count;
>         const struct rte_flow_action_queue *act_q;
> +       int i = 0, rc = 0;
>         int rq;
> -       int i = 0;
>
>         RTE_SET_USED(hw);
>
> @@ -68,7 +117,12 @@ cnxk_map_actions(struct rte_eth_dev *dev,
>                         break;
>
>                 case RTE_FLOW_ACTION_TYPE_RSS:
> +                       rc = npc_rss_action_validate(dev, attr, actions);
> +                       if (rc)
> +                               goto err_exit;
>                         in_actions[i].type = ROC_NPC_ACTION_TYPE_RSS;
> +                       in_actions[i].conf = actions->conf;
> +                       npc_rss_flowkey_get(hw, &in_actions[i], flowkey_cfg);
>                         break;
>
>                 case RTE_FLOW_ACTION_TYPE_SECURITY:
> @@ -94,7 +148,7 @@ cnxk_map_flow_data(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
>                    const struct rte_flow_action actions[],
>                    struct roc_npc_attr *in_attr,
>                    struct roc_npc_item_info in_pattern[],
> -                  struct roc_npc_action in_actions[])
> +                  struct roc_npc_action in_actions[], uint32_t *flowkey_cfg)
>  {
>         int i = 0;
>
> @@ -113,7 +167,7 @@ cnxk_map_flow_data(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
>         }
>         in_pattern[i].type = ROC_NPC_ITEM_TYPE_END;
>
> -       return cnxk_map_actions(dev, actions, in_actions);
> +       return cnxk_map_actions(dev, attr, actions, in_actions, flowkey_cfg);
>  }
>
>  static int
> @@ -128,12 +182,13 @@ cnxk_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
>         struct roc_npc *npc = &hw->npc;
>         struct roc_npc_attr in_attr;
>         struct roc_npc_flow flow;
> +       uint32_t flowkey_cfg = 0;
>         int rc;
>
>         memset(&flow, 0, sizeof(flow));
>
>         rc = cnxk_map_flow_data(dev, attr, pattern, actions, &in_attr,
> -                               in_pattern, in_actions);
> +                               in_pattern, in_actions, &flowkey_cfg);
>         if (rc) {
>                 rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_NUM,
>                                    NULL, "Failed to map flow data");
> @@ -155,11 +210,12 @@ cnxk_flow_create(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
>         struct roc_npc *npc = &hw->npc;
>         struct roc_npc_attr in_attr;
>         struct roc_npc_flow *flow;
> -       int errcode;
> +       int errcode = 0;
>         int rc;
>
>         rc = cnxk_map_flow_data(dev, attr, pattern, actions, &in_attr,
> -                               in_pattern, in_actions);
> +                               in_pattern, in_actions,
> +                               &npc->flowkey_cfg_state);
>         if (rc) {
>                 rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_NUM,
>                                    NULL, "Failed to map flow data");
> --
> 2.8.4
>
  

Patch

diff --git a/drivers/net/cnxk/cnxk_rte_flow.c b/drivers/net/cnxk/cnxk_rte_flow.c
index d0e7bdc..8486e9e 100644
--- a/drivers/net/cnxk/cnxk_rte_flow.c
+++ b/drivers/net/cnxk/cnxk_rte_flow.c
@@ -4,15 +4,64 @@ 
 #include <cnxk_rte_flow.h>
 
 static int
-cnxk_map_actions(struct rte_eth_dev *dev,
+npc_rss_action_validate(struct rte_eth_dev *dev,
+			const struct rte_flow_attr *attr,
+			const struct rte_flow_action *act)
+{
+	const struct rte_flow_action_rss *rss;
+
+	rss = (const struct rte_flow_action_rss *)act->conf;
+
+	if (attr->egress) {
+		plt_err("No support of RSS in egress");
+		return -EINVAL;
+	}
+
+	if (dev->data->dev_conf.rxmode.mq_mode != ETH_MQ_RX_RSS) {
+		plt_err("multi-queue mode is disabled");
+		return -ENOTSUP;
+	}
+
+	if (!rss || !rss->queue_num) {
+		plt_err("no valid queues");
+		return -EINVAL;
+	}
+
+	if (rss->func != RTE_ETH_HASH_FUNCTION_DEFAULT) {
+		plt_err("non-default RSS hash functions are not supported");
+		return -ENOTSUP;
+	}
+
+	if (rss->key_len && rss->key_len > ROC_NIX_RSS_KEY_LEN) {
+		plt_err("RSS hash key too large");
+		return -ENOTSUP;
+	}
+
+	return 0;
+}
+
+static void
+npc_rss_flowkey_get(struct cnxk_eth_dev *dev,
+		    const struct roc_npc_action *rss_action,
+		    uint32_t *flowkey_cfg)
+{
+	const struct roc_npc_action_rss *rss;
+
+	rss = (const struct roc_npc_action_rss *)rss_action->conf;
+
+	*flowkey_cfg = cnxk_rss_ethdev_to_nix(dev, rss->types, rss->level);
+}
+
+static int
+cnxk_map_actions(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
 		 const struct rte_flow_action actions[],
-		 struct roc_npc_action in_actions[])
+		 struct roc_npc_action in_actions[], uint32_t *flowkey_cfg)
 {
 	struct cnxk_eth_dev *hw = dev->data->dev_private;
 	const struct rte_flow_action_count *act_count;
 	const struct rte_flow_action_queue *act_q;
+	int i = 0, rc = 0;
 	int rq;
-	int i = 0;
 
 	RTE_SET_USED(hw);
 
@@ -68,7 +117,12 @@  cnxk_map_actions(struct rte_eth_dev *dev,
 			break;
 
 		case RTE_FLOW_ACTION_TYPE_RSS:
+			rc = npc_rss_action_validate(dev, attr, actions);
+			if (rc)
+				goto err_exit;
 			in_actions[i].type = ROC_NPC_ACTION_TYPE_RSS;
+			in_actions[i].conf = actions->conf;
+			npc_rss_flowkey_get(hw, &in_actions[i], flowkey_cfg);
 			break;
 
 		case RTE_FLOW_ACTION_TYPE_SECURITY:
@@ -94,7 +148,7 @@  cnxk_map_flow_data(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
 		   const struct rte_flow_action actions[],
 		   struct roc_npc_attr *in_attr,
 		   struct roc_npc_item_info in_pattern[],
-		   struct roc_npc_action in_actions[])
+		   struct roc_npc_action in_actions[], uint32_t *flowkey_cfg)
 {
 	int i = 0;
 
@@ -113,7 +167,7 @@  cnxk_map_flow_data(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
 	}
 	in_pattern[i].type = ROC_NPC_ITEM_TYPE_END;
 
-	return cnxk_map_actions(dev, actions, in_actions);
+	return cnxk_map_actions(dev, attr, actions, in_actions, flowkey_cfg);
 }
 
 static int
@@ -128,12 +182,13 @@  cnxk_flow_validate(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
 	struct roc_npc *npc = &hw->npc;
 	struct roc_npc_attr in_attr;
 	struct roc_npc_flow flow;
+	uint32_t flowkey_cfg = 0;
 	int rc;
 
 	memset(&flow, 0, sizeof(flow));
 
 	rc = cnxk_map_flow_data(dev, attr, pattern, actions, &in_attr,
-				in_pattern, in_actions);
+				in_pattern, in_actions, &flowkey_cfg);
 	if (rc) {
 		rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_NUM,
 				   NULL, "Failed to map flow data");
@@ -155,11 +210,12 @@  cnxk_flow_create(struct rte_eth_dev *dev, const struct rte_flow_attr *attr,
 	struct roc_npc *npc = &hw->npc;
 	struct roc_npc_attr in_attr;
 	struct roc_npc_flow *flow;
-	int errcode;
+	int errcode = 0;
 	int rc;
 
 	rc = cnxk_map_flow_data(dev, attr, pattern, actions, &in_attr,
-				in_pattern, in_actions);
+				in_pattern, in_actions,
+				&npc->flowkey_cfg_state);
 	if (rc) {
 		rte_flow_error_set(error, 0, RTE_FLOW_ERROR_TYPE_ACTION_NUM,
 				   NULL, "Failed to map flow data");