DPDK patches and discussions
 help / color / mirror / Atom feed
From: Maayan Kashani <mkashani@nvidia.com>
To: <dev@dpdk.org>
Cc: <mkashani@nvidia.com>, <dsosnowski@nvidia.com>,
	<rasland@nvidia.com>,
	Viacheslav Ovsiienko <viacheslavo@nvidia.com>,
	Ori Kam <orika@nvidia.com>, Suanming Mou <suanmingm@nvidia.com>,
	Matan Azrad <matan@nvidia.com>
Subject: [PATCH v4 2/4] net/mlx5: set modify header as shared action
Date: Thu, 6 Jun 2024 13:06:13 +0300	[thread overview]
Message-ID: <20240606100615.171695-3-mkashani@nvidia.com> (raw)
In-Reply-To: <20240606100615.171695-1-mkashani@nvidia.com>

In current implementation, in non template mode,
modify header action is not set as always shared.
Align to HWS implementation, setting modify header action as always shared.
Optimize mask initialization.

Signed-off-by: Maayan Kashani <mkashani@nvidia.com>
Acked-by: Dariusz Sosnowski <dsosnowski@nvidia.com>
---
 drivers/net/mlx5/mlx5_flow.h    |  3 --
 drivers/net/mlx5/mlx5_flow_dv.c | 10 ++--
 drivers/net/mlx5/mlx5_flow_hw.c | 91 +++++++++++++++++++--------------
 3 files changed, 59 insertions(+), 45 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
index 5a3f047968..f5bb01616e 100644
--- a/drivers/net/mlx5/mlx5_flow.h
+++ b/drivers/net/mlx5/mlx5_flow.h
@@ -669,9 +669,6 @@ struct mlx5_flow_dv_modify_hdr_resource {
 	struct mlx5_list_entry entry;
 	void *action; /**< Modify header action object. */
 	uint32_t idx;
-#ifdef HAVE_MLX5_HWS_SUPPORT
-	void *mh_dr_pattern; /**< Modify header DR pattern(HWS only). */
-#endif
 	uint64_t flags; /**< Flags for RDMA API(HWS only). */
 	/* Key area for hash list matching: */
 	uint8_t ft_type; /**< Flow table type, Rx or Tx. */
diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 3611ffa4a1..94af391894 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -6219,9 +6219,7 @@ flow_modify_create_cb(void *tool_ctx, void *cb_ctx)
 	uint32_t data_len = ref->actions_num * sizeof(ref->actions[0]);
 	uint32_t key_len = sizeof(*ref) - offsetof(typeof(*ref), ft_type);
 	uint32_t idx;
-	struct mlx5_tbl_multi_pattern_ctx *mpctx;
 
-	typeof(mpctx->mh) *mh_dr_pattern = ref->mh_dr_pattern;
 	if (unlikely(!ipool)) {
 		rte_flow_error_set(ctx->error, ENOMEM,
 				   RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
@@ -6240,9 +6238,13 @@ flow_modify_create_cb(void *tool_ctx, void *cb_ctx)
 			key_len + data_len);
 	if (sh->config.dv_flow_en == 2) {
 #ifdef HAVE_MLX5_HWS_SUPPORT
+		struct mlx5dr_action_mh_pattern pattern = {
+			.sz = data_len,
+			.data = (__be64 *)ref->actions
+		};
 		entry->action = mlx5dr_action_create_modify_header(ctx->data2,
-			mh_dr_pattern->elements_num,
-			mh_dr_pattern->pattern, 0, ref->flags);
+			1,
+			&pattern, 0, ref->flags);
 		if (!entry->action)
 			ret = -1;
 #else
diff --git a/drivers/net/mlx5/mlx5_flow_hw.c b/drivers/net/mlx5/mlx5_flow_hw.c
index 43bcaab592..134a035f41 100644
--- a/drivers/net/mlx5/mlx5_flow_hw.c
+++ b/drivers/net/mlx5/mlx5_flow_hw.c
@@ -1439,13 +1439,11 @@ flow_hw_converted_mhdr_cmds_append(struct mlx5_hw_modify_header_action *mhdr,
 
 static __rte_always_inline void
 flow_hw_modify_field_init(struct mlx5_hw_modify_header_action *mhdr,
-			  struct rte_flow_actions_template *at,
-			  bool nt_mode)
+			  struct rte_flow_actions_template *at)
 {
 	memset(mhdr, 0, sizeof(*mhdr));
 	/* Modify header action without any commands is shared by default. */
-	if (!(nt_mode))
-		mhdr->shared = true;
+	mhdr->shared = true;
 	mhdr->pos = at->mhdr_off;
 }
 
@@ -2212,10 +2210,6 @@ mlx5_tbl_translate_modify_header(struct rte_eth_dev *dev,
 				 struct mlx5_hw_modify_header_action *mhdr,
 				 struct rte_flow_error *error)
 {
-	struct mlx5_priv *priv = dev->data->dev_private;
-	const struct rte_flow_template_table_attr *table_attr = &cfg->attr;
-	const struct rte_flow_attr *attr = &table_attr->flow_attr;
-	enum mlx5dr_table_type tbl_type = get_mlx5dr_table_type(attr);
 	uint16_t mhdr_ix = mhdr->pos;
 	struct mlx5dr_action_mh_pattern pattern = {
 		.sz = sizeof(struct mlx5_modification_cmd) * mhdr->mhdr_cmds_num
@@ -2232,20 +2226,8 @@ mlx5_tbl_translate_modify_header(struct rte_eth_dev *dev,
 					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
 					  NULL, "translate modify_header: no memory for modify header context");
 	rte_memcpy(acts->mhdr, mhdr, sizeof(*mhdr));
-	pattern.data = (__be64 *)acts->mhdr->mhdr_cmds;
-	if (mhdr->shared) {
-		uint32_t flags = mlx5_hw_act_flag[!!attr->group][tbl_type] |
-				 MLX5DR_ACTION_FLAG_SHARED;
-
-		acts->mhdr->action = mlx5dr_action_create_modify_header
-						(priv->dr_ctx, 1, &pattern, 0,
-						 flags);
-		if (!acts->mhdr->action)
-			return rte_flow_error_set(error, rte_errno,
-						  RTE_FLOW_ERROR_TYPE_UNSPECIFIED,
-						  NULL, "translate modify_header: failed to create DR action");
-		acts->rule_acts[mhdr_ix].action = acts->mhdr->action;
-	} else {
+	if (!mhdr->shared) {
+		pattern.data = (__be64 *)acts->mhdr->mhdr_cmds;
 		typeof(mp_ctx->mh) *mh = &mp_ctx->mh;
 		uint32_t idx = mh->elements_num;
 		mh->pattern[mh->elements_num++] = pattern;
@@ -2256,6 +2238,32 @@ mlx5_tbl_translate_modify_header(struct rte_eth_dev *dev,
 	return 0;
 }
 
+static int
+mlx5_tbl_ensure_shared_modify_header(struct rte_eth_dev *dev,
+				     const struct mlx5_flow_template_table_cfg *cfg,
+				     struct mlx5_hw_actions *acts,
+				     struct rte_flow_error *error)
+{
+	struct mlx5_priv *priv = dev->data->dev_private;
+	const struct rte_flow_template_table_attr *table_attr = &cfg->attr;
+	const struct rte_flow_attr *attr = &table_attr->flow_attr;
+	enum mlx5dr_table_type tbl_type = get_mlx5dr_table_type(attr);
+	struct mlx5dr_action_mh_pattern pattern = {
+		.sz = sizeof(struct mlx5_modification_cmd) * acts->mhdr->mhdr_cmds_num
+	};
+	uint16_t mhdr_ix = acts->mhdr->pos;
+	uint32_t flags = mlx5_hw_act_flag[!!attr->group][tbl_type] | MLX5DR_ACTION_FLAG_SHARED;
+
+	pattern.data = (__be64 *)acts->mhdr->mhdr_cmds;
+	acts->mhdr->action = mlx5dr_action_create_modify_header(priv->dr_ctx, 1,
+								&pattern, 0, flags);
+	if (!acts->mhdr->action)
+		return rte_flow_error_set(error, rte_errno,
+					  RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,
+					  "translate modify_header: failed to create DR action");
+	acts->rule_acts[mhdr_ix].action = acts->mhdr->action;
+	return 0;
+}
 
 static int
 mlx5_create_ipv6_ext_reformat(struct rte_eth_dev *dev,
@@ -2393,7 +2401,7 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
 	uint32_t target_grp = 0;
 	int table_type;
 
-	flow_hw_modify_field_init(&mhdr, at, nt_mode);
+	flow_hw_modify_field_init(&mhdr, at);
 	if (attr->transfer)
 		type = MLX5DR_TABLE_TYPE_FDB;
 	else if (attr->egress)
@@ -2780,10 +2788,14 @@ __flow_hw_translate_actions_template(struct rte_eth_dev *dev,
 		}
 	}
 	if (mhdr.pos != UINT16_MAX) {
-		ret = mlx5_tbl_translate_modify_header(dev, cfg, acts, mp_ctx,
-						       &mhdr, error);
+		ret = mlx5_tbl_translate_modify_header(dev, cfg, acts, mp_ctx, &mhdr, error);
 		if (ret)
 			goto err;
+		if (!nt_mode && mhdr.shared) {
+			ret = mlx5_tbl_ensure_shared_modify_header(dev, cfg, acts, error);
+			if (ret)
+				goto err;
+		}
 	}
 	if (reformat_used) {
 		ret = mlx5_tbl_translate_reformat(priv, table_attr, acts, at,
@@ -12348,8 +12360,8 @@ static int flow_hw_prepare(struct rte_eth_dev *dev,
 	/*TODO: consider if other allocation is needed for actions translate. */
 	return 0;
 }
-#define FLOW_HW_SET_DV_FIELDS(flow_attr, root, flags)						\
-{												\
+
+#define FLOW_HW_SET_DV_FIELDS(flow_attr, root, flags, dv_resource) {				\
 	typeof(flow_attr) _flow_attr = (flow_attr);						\
 	if (_flow_attr->transfer)								\
 		dv_resource.ft_type = MLX5DV_FLOW_TABLE_TYPE_FDB;				\
@@ -12370,28 +12382,31 @@ flow_hw_modify_hdr_resource_register
 {
 	struct rte_flow_attr *attr = &table->cfg.attr.flow_attr;
 	struct mlx5_flow_dv_modify_hdr_resource *dv_resource_ptr = NULL;
-	struct mlx5_flow_dv_modify_hdr_resource dv_resource;
-	struct mlx5_tbl_multi_pattern_ctx *mpctx = &table->mpctx;
+	union {
+		struct mlx5_flow_dv_modify_hdr_resource dv_resource;
+		uint8_t data[sizeof(struct mlx5_flow_dv_modify_hdr_resource) +
+			     sizeof(struct mlx5_modification_cmd) * MLX5_MHDR_MAX_CMD];
+	} dummy;
 	int ret;
 
 	if (hw_acts->mhdr) {
-		dv_resource.actions_num = hw_acts->mhdr->mhdr_cmds_num;
-		memcpy(dv_resource.actions, hw_acts->mhdr->mhdr_cmds,
-			sizeof(struct mlx5_modification_cmd) * dv_resource.actions_num);
+		dummy.dv_resource.actions_num = hw_acts->mhdr->mhdr_cmds_num;
+		memcpy(dummy.dv_resource.actions, hw_acts->mhdr->mhdr_cmds,
+			sizeof(struct mlx5_modification_cmd) * dummy.dv_resource.actions_num);
 	} else {
 		return 0;
 	}
-	FLOW_HW_SET_DV_FIELDS(attr, dv_resource.root, dv_resource.flags);
-	/* Save a pointer to the pattern needed for DR layer created on actions translate. */
-	dv_resource.mh_dr_pattern = &table->mpctx.mh;
-	ret = __flow_modify_hdr_resource_register(dev, &dv_resource,
+	FLOW_HW_SET_DV_FIELDS(attr, dummy.dv_resource.root, dummy.dv_resource.flags,
+			      dummy.dv_resource);
+	dummy.dv_resource.flags |= MLX5DR_ACTION_FLAG_SHARED;
+	ret = __flow_modify_hdr_resource_register(dev, &dummy.dv_resource,
 		&dv_resource_ptr, error);
 	if (ret)
 		return ret;
 	MLX5_ASSERT(dv_resource_ptr);
 	dev_flow->nt2hws->modify_hdr = dv_resource_ptr;
 	/* keep action for the rule construction. */
-	mpctx->segments[0].mhdr_action = dv_resource_ptr->action;
+	hw_acts->rule_acts[hw_acts->mhdr->pos].action = dv_resource_ptr->action;
 	/* Bulk size is 1, so index is 1. */
 	dev_flow->res_idx = 1;
 	return 0;
@@ -12426,7 +12441,7 @@ flow_hw_encap_decap_resource_register
 		return rte_flow_error_set(error, EINVAL, RTE_FLOW_ERROR_TYPE_ACTION,
 				   NULL, "No reformat action exist in the table.");
 	dv_resource.size = reformat->reformat_hdr->sz;
-	FLOW_HW_SET_DV_FIELDS(attr, is_root, dv_resource.flags);
+	FLOW_HW_SET_DV_FIELDS(attr, is_root, dv_resource.flags, dv_resource);
 	MLX5_ASSERT(dv_resource.size <= MLX5_ENCAP_MAX_LEN);
 	memcpy(dv_resource.buf, reformat->reformat_hdr->data, dv_resource.size);
 	ret = __flow_encap_decap_resource_register(dev, &dv_resource, is_root,
-- 
2.21.0


  parent reply	other threads:[~2024-06-06 10:07 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-06-02 10:29 [PATCH 1/4] net/mlx5: reorganize main structures Maayan Kashani
2024-06-03  8:16 ` [PATCH v2 22/34] " Maayan Kashani
2024-06-03  8:16   ` [PATCH v2 23/34] net/mlx5: set modify header as shared action Maayan Kashani
2024-06-03  8:16   ` [PATCH v2 24/34] net/mlx5: set encap " Maayan Kashani
2024-06-03  8:16   ` [PATCH v2 25/34] net/mlx5: clean up TODO comments Maayan Kashani
2024-06-03 10:54 ` [PATCH v3 1/4] net/mlx5: reorganize main structures Maayan Kashani
2024-06-03 10:54   ` [PATCH v3 2/4] net/mlx5: set modify header as shared action Maayan Kashani
2024-06-03 10:54   ` [PATCH v3 3/4] net/mlx5: set encap " Maayan Kashani
2024-06-03 10:54   ` [PATCH v3 4/4] net/mlx5: clean up TODO comments Maayan Kashani
2024-06-06 10:06   ` [PATCH v4 0/4] non template pmd code changes Maayan Kashani
2024-06-06 10:06     ` [PATCH v4 1/4] net/mlx5: reorganize main structures Maayan Kashani
2024-06-06 10:06     ` Maayan Kashani [this message]
2024-06-06 10:06     ` [PATCH v4 3/4] net/mlx5: set encap as shared action Maayan Kashani
2024-06-06 10:06     ` [PATCH v4 4/4] net/mlx5: clean up TODO comments Maayan Kashani
2024-06-11 11:16     ` [PATCH v4 0/4] non template pmd code changes Raslan Darawsheh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240606100615.171695-3-mkashani@nvidia.com \
    --to=mkashani@nvidia.com \
    --cc=dev@dpdk.org \
    --cc=dsosnowski@nvidia.com \
    --cc=matan@nvidia.com \
    --cc=orika@nvidia.com \
    --cc=rasland@nvidia.com \
    --cc=suanmingm@nvidia.com \
    --cc=viacheslavo@nvidia.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).