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 v2 23/34] net/mlx5: set modify header as shared action
Date: Mon, 3 Jun 2024 11:16:37 +0300 [thread overview]
Message-ID: <20240603081640.3609-2-mkashani@nvidia.com> (raw)
In-Reply-To: <20240603081640.3609-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>
---
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.25.1
next prev parent reply other threads:[~2024-06-03 8:17 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 ` Maayan Kashani [this message]
2024-06-03 8:16 ` [PATCH v2 24/34] net/mlx5: set encap as shared action 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 ` [PATCH v4 2/4] net/mlx5: set modify header as shared action Maayan Kashani
2024-06-06 10:06 ` [PATCH v4 3/4] net/mlx5: set encap " 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=20240603081640.3609-2-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).