All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] net/mlx5: fix metadata endianness in modify field action
@ 2021-11-29 12:32 Viacheslav Ovsiienko
  2021-12-06  8:56 ` Raslan Darawsheh
  2021-12-07 13:44 ` Ferruh Yigit
  0 siblings, 2 replies; 9+ messages in thread
From: Viacheslav Ovsiienko @ 2021-11-29 12:32 UTC (permalink / raw)
  To: dev; +Cc: matan, rasland, stable

As modify field action immediate source parameter the metadata
should follow the CPU endianness (according to SET_META action
structure format), and mlx5 PMD wrongly handled the immediate
parameter metadata buffer as big-endian, resulting in wrong
metadata set action with incorrect endianness.

Fixes: 40c8fb1fd3b3 ("net/mlx5: update modify field action")
Cc: stable@dpdk.org

Signed-off-by: Viacheslav Ovsiienko <viacheslavo@nvidia.com>
---
 drivers/net/mlx5/mlx5_flow_dv.c | 23 +++++++++++------------
 1 file changed, 11 insertions(+), 12 deletions(-)

diff --git a/drivers/net/mlx5/mlx5_flow_dv.c b/drivers/net/mlx5/mlx5_flow_dv.c
index 4834c752d9..1c6cae8779 100644
--- a/drivers/net/mlx5/mlx5_flow_dv.c
+++ b/drivers/net/mlx5/mlx5_flow_dv.c
@@ -1465,7 +1465,7 @@ static void
 mlx5_flow_field_id_to_modify_info
 		(const struct rte_flow_action_modify_data *data,
 		 struct field_modify_info *info, uint32_t *mask,
-		 uint32_t width, uint32_t *shift, struct rte_eth_dev *dev,
+		 uint32_t width, struct rte_eth_dev *dev,
 		 const struct rte_flow_attr *attr, struct rte_flow_error *error)
 {
 	struct mlx5_priv *priv = dev->data->dev_private;
@@ -1820,16 +1820,11 @@ mlx5_flow_field_id_to_modify_info
 		{
 			uint32_t meta_mask = priv->sh->dv_meta_mask;
 			uint32_t meta_count = __builtin_popcount(meta_mask);
-			uint32_t msk_c0 =
-				rte_cpu_to_be_32(priv->sh->dv_regc0_mask);
-			uint32_t shl_c0 = rte_bsf32(msk_c0);
 			int reg = flow_dv_get_metadata_reg(dev, attr, error);
 			if (reg < 0)
 				return;
 			MLX5_ASSERT(reg != REG_NON);
 			MLX5_ASSERT((unsigned int)reg < RTE_DIM(reg_to_field));
-			if (reg == REG_C_0)
-				*shift = shl_c0;
 			info[idx] = (struct field_modify_info){4, 0,
 						reg_to_field[reg]};
 			if (mask)
@@ -1881,29 +1876,33 @@ flow_dv_convert_action_modify_field
 	struct field_modify_info dcopy[MLX5_ACT_MAX_MOD_FIELDS] = {
 								{0, 0, 0} };
 	uint32_t mask[MLX5_ACT_MAX_MOD_FIELDS] = {0, 0, 0, 0, 0};
-	uint32_t type;
-	uint32_t shift = 0;
+	uint32_t type, meta = 0;
 
 	if (conf->src.field == RTE_FLOW_FIELD_POINTER ||
 	    conf->src.field == RTE_FLOW_FIELD_VALUE) {
 		type = MLX5_MODIFICATION_TYPE_SET;
 		/** For SET fill the destination field (field) first. */
 		mlx5_flow_field_id_to_modify_info(&conf->dst, field, mask,
-						  conf->width, &shift, dev,
+						  conf->width, dev,
 						  attr, error);
 		item.spec = conf->src.field == RTE_FLOW_FIELD_POINTER ?
 					(void *)(uintptr_t)conf->src.pvalue :
 					(void *)(uintptr_t)&conf->src.value;
+		if (conf->dst.field == RTE_FLOW_FIELD_META) {
+			meta = *(const unaligned_uint32_t *)item.spec;
+			meta = rte_cpu_to_be_32(meta);
+			item.spec = &meta;
+		}
 	} else {
 		type = MLX5_MODIFICATION_TYPE_COPY;
 		/** For COPY fill the destination field (dcopy) without mask. */
 		mlx5_flow_field_id_to_modify_info(&conf->dst, dcopy, NULL,
-						  conf->width, &shift, dev,
+						  conf->width, dev,
 						  attr, error);
 		/** Then construct the source field (field) with mask. */
 		mlx5_flow_field_id_to_modify_info(&conf->src, field, mask,
-						  conf->width, &shift,
-						  dev, attr, error);
+						  conf->width, dev,
+						  attr, error);
 	}
 	item.mask = &mask;
 	return flow_dv_convert_modify_action(&item,
-- 
2.18.1


^ permalink raw reply related	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2022-02-09  8:50 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-11-29 12:32 [PATCH] net/mlx5: fix metadata endianness in modify field action Viacheslav Ovsiienko
2021-12-06  8:56 ` Raslan Darawsheh
2021-12-07 13:44 ` Ferruh Yigit
2021-12-16  9:50   ` Slava Ovsiienko
2021-12-17 12:59     ` Ferruh Yigit
2022-02-03  8:46       ` [PATCH v2 1/2] " Viacheslav Ovsiienko
2022-02-03  8:46         ` [PATCH v2 2/2] net/mlx5: remove unused metadata shift parameter Viacheslav Ovsiienko
2022-02-08 10:48           ` Ferruh Yigit
2022-02-09  8:50         ` [PATCH v2 1/2] net/mlx5: fix metadata endianness in modify field action Raslan Darawsheh

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.