From: Bing Zhao <bingz@nvidia.com>
To: Dariusz Sosnowski <dsosnowski@nvidia.com>,
Slava Ovsiienko <viacheslavo@nvidia.com>,
Ori Kam <orika@nvidia.com>, Suanming Mou <suanmingm@nvidia.com>,
Matan Azrad <matan@nvidia.com>,
Itamar Gozlan <igozlan@nvidia.com>
Cc: "dev@dpdk.org" <dev@dpdk.org>, "stable@dpdk.org" <stable@dpdk.org>
Subject: RE: [PATCH] net/mlx5: fix higher flow tag indexes support on root
Date: Tue, 18 Nov 2025 07:44:37 +0000 [thread overview]
Message-ID: <IA4PR12MB9763D2FCFBED63E2F52C7A2CD0D6A@IA4PR12MB9763.namprd12.prod.outlook.com> (raw)
In-Reply-To: <20251114201720.1639238-1-dsosnowski@nvidia.com>
Hi,
Code LGTM, but I have 1 question. Does the root group really supports so many TAG registers?
If not, do we have a need to translate them and pass to the driver to get the return error code from the driver then?
> -----Original Message-----
> From: Dariusz Sosnowski <dsosnowski@nvidia.com>
> Sent: Saturday, November 15, 2025 4:17 AM
> To: Slava Ovsiienko <viacheslavo@nvidia.com>; Bing Zhao
> <bingz@nvidia.com>; Ori Kam <orika@nvidia.com>; Suanming Mou
> <suanmingm@nvidia.com>; Matan Azrad <matan@nvidia.com>; Itamar Gozlan
> <igozlan@nvidia.com>
> Cc: dev@dpdk.org; stable@dpdk.org
> Subject: [PATCH] net/mlx5: fix higher flow tag indexes support on root
>
> Offending patch introduced support for additional flow tag indexes with HW
> Steering flow engine. New tag indexes will be mapped to HW registers
> REG_C_8 to REG_C_11, depending on HW capabilities.
>
> That patch only handled tables created on group > 0 (non-root table),
> where mlx5 PMD directly configures the HW.
> Tables and flow rules on group 0 (root table) are handled through kernel
> driver, and new registers were not addressed for that case.
>
> Because of that, usage of unsupported tag index in group 0 triggered an
> assertion in flow_dv_match_meta_reg().
>
> This patch adds necessary definitions for REG_C_8 to REG_C_11 to make
> these registers usable for flow tag indexes in root table.
> Validation of flow tag to HW register translation is also amended to
> report invalid cases to the user, instead of relying on assertions.
>
> Fixes: 7e3a14423c1a ("net/mlx5/hws: support 4 additional C registers")
> Cc: igozlan@nvidia.com
> Cc: stable@dpdk.org
>
> Signed-off-by: Dariusz Sosnowski <dsosnowski@nvidia.com>
> ---
> drivers/common/mlx5/mlx5_prm.h | 6 ++++-
> drivers/net/mlx5/mlx5_flow.h | 3 ++-
> drivers/net/mlx5/mlx5_flow_dv.c | 40 ++++++++++++++++++++++++++++-----
> 3 files changed, 41 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/common/mlx5/mlx5_prm.h
> b/drivers/common/mlx5/mlx5_prm.h index 5db8d67cfc..ad3cca5bd6 100644
> --- a/drivers/common/mlx5/mlx5_prm.h
> +++ b/drivers/common/mlx5/mlx5_prm.h
> @@ -1205,7 +1205,11 @@ struct mlx5_ifc_fte_match_set_misc5_bits {
> u8 tunnel_header_1[0x20];
> u8 tunnel_header_2[0x20];
> u8 tunnel_header_3[0x20];
> - u8 reserved[0x100];
> + u8 reserved[0x80];
> + u8 metadata_reg_c_8[0x20];
> + u8 metadata_reg_c_9[0x20];
> + u8 metadata_reg_c_10[0x20];
> + u8 metadata_reg_c_11[0x20];
> };
>
> /* Flow matcher. */
> diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h
> index e8b298dd1d..fa2af91d66 100644
> --- a/drivers/net/mlx5/mlx5_flow.h
> +++ b/drivers/net/mlx5/mlx5_flow.h
> @@ -1833,7 +1833,8 @@ flow_hw_get_reg_id_by_domain(struct rte_eth_dev
> *dev,
> case RTE_FLOW_ITEM_TYPE_TAG:
> if (id == RTE_PMD_MLX5_LINEAR_HASH_TAG_INDEX)
> return REG_C_3;
> - MLX5_ASSERT(id < MLX5_FLOW_HW_TAGS_MAX);
> + if (id >= MLX5_FLOW_HW_TAGS_MAX)
> + return REG_NON;
> return reg->hw_avl_tags[id];
> default:
> return REG_NON;
> diff --git a/drivers/net/mlx5/mlx5_flow_dv.c
> b/drivers/net/mlx5/mlx5_flow_dv.c index 95ca57e8c4..2a8bdd498e 100644
> --- a/drivers/net/mlx5/mlx5_flow_dv.c
> +++ b/drivers/net/mlx5/mlx5_flow_dv.c
> @@ -10560,8 +10560,8 @@ static void
> flow_dv_match_meta_reg(void *key, enum modify_reg reg_type,
> uint32_t data, uint32_t mask)
> {
> - void *misc2_v =
> - MLX5_ADDR_OF(fte_match_param, key, misc_parameters_2);
> + void *misc2_v = MLX5_ADDR_OF(fte_match_param, key,
> misc_parameters_2);
> + void *misc5_v = MLX5_ADDR_OF(fte_match_param, key,
> misc_parameters_5);
> uint32_t temp;
>
> if (!key)
> @@ -10607,6 +10607,18 @@ flow_dv_match_meta_reg(void *key, enum modify_reg
> reg_type,
> case REG_C_7:
> MLX5_SET(fte_match_set_misc2, misc2_v, metadata_reg_c_7,
> data);
> break;
> + case REG_C_8:
> + MLX5_SET(fte_match_set_misc5, misc5_v, metadata_reg_c_8,
> data);
> + break;
> + case REG_C_9:
> + MLX5_SET(fte_match_set_misc5, misc5_v, metadata_reg_c_9,
> data);
> + break;
> + case REG_C_10:
> + MLX5_SET(fte_match_set_misc5, misc5_v, metadata_reg_c_10,
> data);
> + break;
> + case REG_C_11:
> + MLX5_SET(fte_match_set_misc5, misc5_v, metadata_reg_c_11,
> data);
> + break;
> default:
> MLX5_ASSERT(false);
> break;
> @@ -10825,8 +10837,11 @@ flow_dv_translate_mlx5_item_tag(struct
> rte_eth_dev *dev, void *key,
> * Flow pattern to translate.
> * @param[in] key_type
> * Set flow matcher mask or value.
> + *
> + * @return
> + * 0 on success. Negative errno value otherwise.
> */
> -static void
> +static int
> flow_dv_translate_item_tag(struct rte_eth_dev *dev, void *key,
> const struct rte_flow_item *item,
> uint32_t key_type)
> @@ -10838,7 +10853,7 @@ flow_dv_translate_item_tag(struct rte_eth_dev
> *dev, void *key,
> uint32_t index;
>
> if (MLX5_ITEM_VALID(item, key_type))
> - return;
> + return 0;
> MLX5_ITEM_UPDATE(item, key_type, tag_v, tag_m,
> &rte_flow_item_tag_mask);
> /* When set mask, the index should be from spec. */ @@ -10848,8
> +10863,18 @@ flow_dv_translate_item_tag(struct rte_eth_dev *dev, void
> *key,
> reg = mlx5_flow_get_reg_id(dev, MLX5_APP_TAG, index, NULL);
> else
> reg = flow_hw_get_reg_id(dev, RTE_FLOW_ITEM_TYPE_TAG, index);
> - MLX5_ASSERT(reg > 0);
> + if (reg < 0) {
> + DRV_LOG(ERR, "port %u tag index %u does not map to correct
> register",
> + dev->data->port_id, index);
> + return -EINVAL;
> + }
> + if (reg == REG_NON) {
> + DRV_LOG(ERR, "port %u tag index %u maps to unsupported
> register",
> + dev->data->port_id, index);
> + return -ENOTSUP;
> + }
> flow_dv_match_meta_reg(key, (enum modify_reg)reg, tag_v->data,
> tag_m->data);
> + return 0;
> }
>
> /**
> @@ -14408,7 +14433,10 @@ flow_dv_translate_items(struct rte_eth_dev *dev,
> last_item = MLX5_FLOW_LAYER_ICMP6;
> break;
> case RTE_FLOW_ITEM_TYPE_TAG:
> - flow_dv_translate_item_tag(dev, key, items, key_type);
> + ret = flow_dv_translate_item_tag(dev, key, items, key_type);
> + if (ret < 0)
> + return rte_flow_error_set(error, -ret,
> RTE_FLOW_ERROR_TYPE_ITEM, NULL,
> + "invalid flow tag item");
> last_item = MLX5_FLOW_ITEM_TAG;
> break;
> case MLX5_RTE_FLOW_ITEM_TYPE_TAG:
> --
> 2.39.5
next prev parent reply other threads:[~2025-11-18 7:44 UTC|newest]
Thread overview: 4+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-14 20:17 Dariusz Sosnowski
2025-11-18 7:44 ` Bing Zhao [this message]
2025-11-18 9:49 ` Dariusz Sosnowski
2025-11-18 9:51 ` Bing Zhao
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=IA4PR12MB9763D2FCFBED63E2F52C7A2CD0D6A@IA4PR12MB9763.namprd12.prod.outlook.com \
--to=bingz@nvidia.com \
--cc=dev@dpdk.org \
--cc=dsosnowski@nvidia.com \
--cc=igozlan@nvidia.com \
--cc=matan@nvidia.com \
--cc=orika@nvidia.com \
--cc=stable@dpdk.org \
--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).