net/mlx5e: Fix no rewrite fields with the same match
authorEli Britstein <elibr@mellanox.com>
Wed, 10 Apr 2019 19:42:20 +0000 (19:42 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Fri, 17 May 2019 20:16:49 +0000 (13:16 -0700)
With commit 27c11b6b844c ("net/mlx5e: Do not rewrite fields with the
same match") there are no rewrites if the rewrite value is the same as
the matched value. However, if the field is not matched, the rewrite is
also wrongly skipped. Fix it.

Fixes: 27c11b6b844c ("net/mlx5e: Do not rewrite fields with the same match")
Signed-off-by: Eli Britstein <elibr@mellanox.com>
Reviewed-by: Roi Dayan <roid@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

index 542354b5eb4df13a50dc41da1e5c1d70d57767b3..4722ac70f0a949a6eeb70c609181499d93bdcf93 100644 (file)
@@ -1916,6 +1916,19 @@ struct mlx5_fields {
                 offsetof(struct pedit_headers, field) + (off), \
                 MLX5_BYTE_OFF(fte_match_set_lyr_2_4, match_field)}
 
+/* masked values are the same and there are no rewrites that do not have a
+ * match.
+ */
+#define SAME_VAL_MASK(type, valp, maskp, matchvalp, matchmaskp) ({ \
+       type matchmaskx = *(type *)(matchmaskp); \
+       type matchvalx = *(type *)(matchvalp); \
+       type maskx = *(type *)(maskp); \
+       type valx = *(type *)(valp); \
+       \
+       (valx & maskx) == (matchvalx & matchmaskx) && !(maskx & (maskx ^ \
+                                                                matchmaskx)); \
+})
+
 static bool cmp_val_mask(void *valp, void *maskp, void *matchvalp,
                         void *matchmaskp, int size)
 {
@@ -1923,16 +1936,13 @@ static bool cmp_val_mask(void *valp, void *maskp, void *matchvalp,
 
        switch (size) {
        case sizeof(u8):
-               same = ((*(u8 *)valp) & (*(u8 *)maskp)) ==
-                      ((*(u8 *)matchvalp) & (*(u8 *)matchmaskp));
+               same = SAME_VAL_MASK(u8, valp, maskp, matchvalp, matchmaskp);
                break;
        case sizeof(u16):
-               same = ((*(u16 *)valp) & (*(u16 *)maskp)) ==
-                      ((*(u16 *)matchvalp) & (*(u16 *)matchmaskp));
+               same = SAME_VAL_MASK(u16, valp, maskp, matchvalp, matchmaskp);
                break;
        case sizeof(u32):
-               same = ((*(u32 *)valp) & (*(u32 *)maskp)) ==
-                      ((*(u32 *)matchvalp) & (*(u32 *)matchmaskp));
+               same = SAME_VAL_MASK(u32, valp, maskp, matchvalp, matchmaskp);
                break;
        }