net/mlx5: fix Tx meta width for modify field flow rule
authorAlexander Kozyrev <akozyrev@nvidia.com>
Tue, 26 Oct 2021 15:13:57 +0000 (18:13 +0300)
committerRaslan Darawsheh <rasland@nvidia.com>
Sun, 31 Oct 2021 12:31:12 +0000 (13:31 +0100)
Register C is used for the metadata within NIC Rx domain.
And its width can vary from 0 to 32 bits depending on
its kernel usage. But it is not the case within NIC Tx domain,
register A is always 32 bits there. Fix metadata width detection
for the modify_field flow API within NIC Tx domain.

Fixes: 6d5735c1cba2 ("net/mlx5: fix meta register conversion for extensive mode")
Cc: stable@dpdk.org
Signed-off-by: Alexander Kozyrev <akozyrev@nvidia.com>
Acked-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
drivers/net/mlx5/mlx5_flow_dv.c

index a5ced50..ce69c57 100644 (file)
@@ -1383,9 +1383,13 @@ flow_dv_convert_action_modify_ipv6_dscp
 }
 
 static int
-mlx5_flow_item_field_width(struct mlx5_priv *priv,
-                          enum rte_flow_field_id field, int inherit)
+mlx5_flow_item_field_width(struct rte_eth_dev *dev,
+                          enum rte_flow_field_id field, int inherit,
+                          const struct rte_flow_attr *attr,
+                          struct rte_flow_error *error)
 {
+       struct mlx5_priv *priv = dev->data->dev_private;
+
        switch (field) {
        case RTE_FLOW_FIELD_START:
                return 32;
@@ -1432,7 +1436,8 @@ mlx5_flow_item_field_width(struct mlx5_priv *priv,
        case RTE_FLOW_FIELD_MARK:
                return __builtin_popcount(priv->sh->dv_mark_mask);
        case RTE_FLOW_FIELD_META:
-               return __builtin_popcount(priv->sh->dv_meta_mask);
+               return (flow_dv_get_metadata_reg(dev, attr, error) == REG_C_0) ?
+                       __builtin_popcount(priv->sh->dv_meta_mask) : 32;
        case RTE_FLOW_FIELD_POINTER:
        case RTE_FLOW_FIELD_VALUE:
                return inherit < 0 ? 0 : inherit;
@@ -4808,10 +4813,12 @@ flow_dv_validate_action_modify_field(struct rte_eth_dev *dev,
        struct mlx5_dev_config *config = &priv->config;
        const struct rte_flow_action_modify_field *action_modify_field =
                action->conf;
-       uint32_t dst_width = mlx5_flow_item_field_width(priv,
-                               action_modify_field->dst.field, -1);
-       uint32_t src_width = mlx5_flow_item_field_width(priv,
-                               action_modify_field->src.field, dst_width);
+       uint32_t dst_width = mlx5_flow_item_field_width(dev,
+                               action_modify_field->dst.field,
+                               -1, attr, error);
+       uint32_t src_width = mlx5_flow_item_field_width(dev,
+                               action_modify_field->src.field,
+                               dst_width, attr, error);
 
        ret = flow_dv_validate_action_modify_hdr(action_flags, action, error);
        if (ret)