Merge branch 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox...
authorJakub Kicinski <kuba@kernel.org>
Wed, 15 Jun 2022 02:09:39 +0000 (19:09 -0700)
committerJakub Kicinski <kuba@kernel.org>
Wed, 15 Jun 2022 02:09:39 +0000 (19:09 -0700)
Saeed Mahameed says:

====================
mlx5-next: updates 2022-06-14

1) Updated HW bits and definitions for upcoming features
 1.1) vport debug counters
 1.2) flow meter
 1.3) Execute ASO action for flow entry
 1.4) enhanced CQE compression

2) Add ICM header-modify-pattern RDMA API

Leon Says
=========

SW steering manipulates packet's header using "modifying header" actions.
Many of these actions do the same operation, but use different data each time.
Currently we create and keep every one of these actions, which use expensive
and limited resources.

Now we introduce a new mechanism - pattern and argument, which splits
a modifying action into two parts:
1. action pattern: contains the operations to be applied on packet's header,
mainly set/add/copy of fields in the packet
2. action data/argument: contains the data to be used by each operation
in the pattern.

This way we reuse same patterns with different arguments to create new
modifying actions, and since many actions share the same operations, we end
up creating a small number of patterns that we keep in a dedicated cache.

These modify header patterns are implemented as new type of ICM memory,
so the following kernel patch series add the support for this new ICM type.
==========

* 'mlx5-next' of git://git.kernel.org/pub/scm/linux/kernel/git/mellanox/linux:
  net/mlx5: Add bits and fields to support enhanced CQE compression
  net/mlx5: Remove not used MLX5_CAP_BITS_RW_MASK
  net/mlx5: group fdb cleanup to single function
  net/mlx5: Add support EXECUTE_ASO action for flow entry
  net/mlx5: Add HW definitions of vport debug counters
  net/mlx5: Add IFC bits and enums for flow meter
  RDMA/mlx5: Support handling of modify-header pattern ICM area
  net/mlx5: Manage ICM of type modify-header pattern
  net/mlx5: Introduce header-modify-pattern ICM properties
====================

Link: https://lore.kernel.org/r/20220614184028.51548-1-saeed@kernel.org
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
1  2 
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c

@@@ -1574,22 -1574,9 +1574,22 @@@ static struct mlx5_flow_rule *find_flow
        return NULL;
  }
  
 -static bool check_conflicting_actions(u32 action1, u32 action2)
 +static bool check_conflicting_actions_vlan(const struct mlx5_fs_vlan *vlan0,
 +                                         const struct mlx5_fs_vlan *vlan1)
  {
 -      u32 xored_actions = action1 ^ action2;
 +      return vlan0->ethtype != vlan1->ethtype ||
 +             vlan0->vid != vlan1->vid ||
 +             vlan0->prio != vlan1->prio;
 +}
 +
 +static bool check_conflicting_actions(const struct mlx5_flow_act *act1,
 +                                    const struct mlx5_flow_act *act2)
 +{
 +      u32 action1 = act1->action;
 +      u32 action2 = act2->action;
 +      u32 xored_actions;
 +
 +      xored_actions = action1 ^ action2;
  
        /* if one rule only wants to count, it's ok */
        if (action1 == MLX5_FLOW_CONTEXT_ACTION_COUNT ||
                             MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH_2))
                return true;
  
 +      if (action1 & MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT &&
 +          act1->pkt_reformat != act2->pkt_reformat)
 +              return true;
 +
 +      if (action1 & MLX5_FLOW_CONTEXT_ACTION_MOD_HDR &&
 +          act1->modify_hdr != act2->modify_hdr)
 +              return true;
 +
 +      if (action1 & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH &&
 +          check_conflicting_actions_vlan(&act1->vlan[0], &act2->vlan[0]))
 +              return true;
 +
 +      if (action1 & MLX5_FLOW_CONTEXT_ACTION_VLAN_PUSH_2 &&
 +          check_conflicting_actions_vlan(&act1->vlan[1], &act2->vlan[1]))
 +              return true;
 +
        return false;
  }
  
@@@ -1629,7 -1600,7 +1629,7 @@@ static int check_conflicting_ftes(struc
                                  const struct mlx5_flow_context *flow_context,
                                  const struct mlx5_flow_act *flow_act)
  {
 -      if (check_conflicting_actions(flow_act->action, fte->action.action)) {
 +      if (check_conflicting_actions(flow_act, &fte->action)) {
                mlx5_core_warn(get_dev(&fte->node),
                               "Found two FTEs with conflicting actions\n");
                return -EEXIST;
@@@ -2895,6 -2866,14 +2895,14 @@@ static int create_fdb_bypass(struct mlx
        return 0;
  }
  
+ static void cleanup_fdb_root_ns(struct mlx5_flow_steering *steering)
+ {
+       cleanup_root_ns(steering->fdb_root_ns);
+       steering->fdb_root_ns = NULL;
+       kfree(steering->fdb_sub_ns);
+       steering->fdb_sub_ns = NULL;
+ }
  static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
  {
        struct fs_prio *maj_prio;
        return 0;
  
  out_err:
-       cleanup_root_ns(steering->fdb_root_ns);
-       kfree(steering->fdb_sub_ns);
-       steering->fdb_sub_ns = NULL;
-       steering->fdb_root_ns = NULL;
+       cleanup_fdb_root_ns(steering);
        return err;
  }
  
@@@ -3108,10 -3084,7 +3113,7 @@@ void mlx5_fs_core_cleanup(struct mlx5_c
        struct mlx5_flow_steering *steering = dev->priv.steering;
  
        cleanup_root_ns(steering->root_ns);
-       cleanup_root_ns(steering->fdb_root_ns);
-       steering->fdb_root_ns = NULL;
-       kfree(steering->fdb_sub_ns);
-       steering->fdb_sub_ns = NULL;
+       cleanup_fdb_root_ns(steering);
        cleanup_root_ns(steering->port_sel_root_ns);
        cleanup_root_ns(steering->sniffer_rx_root_ns);
        cleanup_root_ns(steering->sniffer_tx_root_ns);