[PATCH v2 23/34] net/mlx5: set modify header as shared action
Maayan Kashani
mkashani at nvidia.com
Mon Jun 3 10:16:37 CEST 2024
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 at 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
More information about the dev
mailing list