]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
net/mlx5: Add priorities for counters in RDMA namespaces
authorAharon Landau <aharonl@nvidia.com>
Fri, 8 Oct 2021 12:24:28 +0000 (15:24 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 1 Feb 2025 17:22:27 +0000 (18:22 +0100)
[ Upstream commit b8dfed636fc6239396c3a2ae5f812505906cf215 ]

Add additional flow steering priorities in the RDMA namespace.
This allows adding flow counters to count filtered RDMA traffic and then
continue processing in the regular RDMA steering flow.

Signed-off-by: Aharon Landau <aharonl@nvidia.com>
Reviewed-by: Maor Gottlieb <maorg@nvidia.com>
Signed-off-by: Mark Zhang <markzhang@nvidia.com>
Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
Stable-dep-of: c08d3e62b2e7 ("net/mlx5: Fix RDMA TX steering prio")
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
include/linux/mlx5/device.h
include/linux/mlx5/fs.h

index c1a0d4e616b4b337b6eb6b7210dae023dd6391c7..3f49eff271cf2f502fea8d50052d7da3096b54ba 100644 (file)
@@ -98,6 +98,9 @@
 #define LEFTOVERS_NUM_LEVELS 1
 #define LEFTOVERS_NUM_PRIOS 1
 
+#define RDMA_RX_COUNTERS_PRIO_NUM_LEVELS 1
+#define RDMA_TX_COUNTERS_PRIO_NUM_LEVELS 1
+
 #define BY_PASS_PRIO_NUM_LEVELS 1
 #define BY_PASS_MIN_LEVEL (ETHTOOL_MIN_LEVEL + MLX5_BY_PASS_NUM_PRIOS +\
                           LEFTOVERS_NUM_PRIOS)
@@ -205,34 +208,63 @@ static struct init_tree_node egress_root_fs = {
        }
 };
 
-#define RDMA_RX_BYPASS_PRIO 0
-#define RDMA_RX_KERNEL_PRIO 1
+enum {
+       RDMA_RX_COUNTERS_PRIO,
+       RDMA_RX_BYPASS_PRIO,
+       RDMA_RX_KERNEL_PRIO,
+};
+
+#define RDMA_RX_BYPASS_MIN_LEVEL MLX5_BY_PASS_NUM_REGULAR_PRIOS
+#define RDMA_RX_KERNEL_MIN_LEVEL (RDMA_RX_BYPASS_MIN_LEVEL + 1)
+#define RDMA_RX_COUNTERS_MIN_LEVEL (RDMA_RX_KERNEL_MIN_LEVEL + 2)
+
 static struct init_tree_node rdma_rx_root_fs = {
        .type = FS_TYPE_NAMESPACE,
-       .ar_size = 2,
+       .ar_size = 3,
        .children = (struct init_tree_node[]) {
+               [RDMA_RX_COUNTERS_PRIO] =
+               ADD_PRIO(0, RDMA_RX_COUNTERS_MIN_LEVEL, 0,
+                        FS_CHAINING_CAPS,
+                        ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                               ADD_MULTIPLE_PRIO(MLX5_RDMA_RX_NUM_COUNTERS_PRIOS,
+                                                 RDMA_RX_COUNTERS_PRIO_NUM_LEVELS))),
                [RDMA_RX_BYPASS_PRIO] =
-               ADD_PRIO(0, MLX5_BY_PASS_NUM_REGULAR_PRIOS, 0,
+               ADD_PRIO(0, RDMA_RX_BYPASS_MIN_LEVEL, 0,
                         FS_CHAINING_CAPS,
                         ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
                                ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_REGULAR_PRIOS,
                                                  BY_PASS_PRIO_NUM_LEVELS))),
                [RDMA_RX_KERNEL_PRIO] =
-               ADD_PRIO(0, MLX5_BY_PASS_NUM_REGULAR_PRIOS + 1, 0,
+               ADD_PRIO(0, RDMA_RX_KERNEL_MIN_LEVEL, 0,
                         FS_CHAINING_CAPS,
                         ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN,
                                ADD_MULTIPLE_PRIO(1, 1))),
        }
 };
 
+enum {
+       RDMA_TX_COUNTERS_PRIO,
+       RDMA_TX_BYPASS_PRIO,
+};
+
+#define RDMA_TX_BYPASS_MIN_LEVEL MLX5_BY_PASS_NUM_PRIOS
+#define RDMA_TX_COUNTERS_MIN_LEVEL (RDMA_TX_BYPASS_MIN_LEVEL + 1)
+
 static struct init_tree_node rdma_tx_root_fs = {
        .type = FS_TYPE_NAMESPACE,
-       .ar_size = 1,
+       .ar_size = 2,
        .children = (struct init_tree_node[]) {
-               ADD_PRIO(0, MLX5_BY_PASS_NUM_PRIOS, 0,
+               [RDMA_TX_COUNTERS_PRIO] =
+               ADD_PRIO(0, RDMA_TX_COUNTERS_MIN_LEVEL, 0,
+                        FS_CHAINING_CAPS,
+                        ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
+                               ADD_MULTIPLE_PRIO(MLX5_RDMA_TX_NUM_COUNTERS_PRIOS,
+                                                 RDMA_TX_COUNTERS_PRIO_NUM_LEVELS))),
+               [RDMA_TX_BYPASS_PRIO] =
+               ADD_PRIO(0, RDMA_TX_BYPASS_MIN_LEVEL, 0,
                         FS_CHAINING_CAPS_RDMA_TX,
                         ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_DEF,
-                               ADD_MULTIPLE_PRIO(MLX5_BY_PASS_NUM_PRIOS,
+                               ADD_MULTIPLE_PRIO(RDMA_TX_BYPASS_MIN_LEVEL,
                                                  BY_PASS_PRIO_NUM_LEVELS))),
        }
 };
@@ -2311,6 +2343,12 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
                prio = RDMA_RX_KERNEL_PRIO;
        } else if (type == MLX5_FLOW_NAMESPACE_RDMA_TX) {
                root_ns = steering->rdma_tx_root_ns;
+       } else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS) {
+               root_ns = steering->rdma_rx_root_ns;
+               prio = RDMA_RX_COUNTERS_PRIO;
+       } else if (type == MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS) {
+               root_ns = steering->rdma_tx_root_ns;
+               prio = RDMA_TX_COUNTERS_PRIO;
        } else { /* Must be NIC RX */
                root_ns = steering->root_ns;
                prio = type;
index cf824366a7d1bec48e08dc1aa22b6c06862638bb..969ac95e2edecd7f3685250f80ca3333cc47a958 100644 (file)
@@ -1418,6 +1418,8 @@ static inline u16 mlx5_to_sw_pkey_sz(int pkey_sz)
        return MLX5_MIN_PKEY_TABLE_SIZE << pkey_sz;
 }
 
+#define MLX5_RDMA_RX_NUM_COUNTERS_PRIOS 2
+#define MLX5_RDMA_TX_NUM_COUNTERS_PRIOS 1
 #define MLX5_BY_PASS_NUM_REGULAR_PRIOS 16
 #define MLX5_BY_PASS_NUM_DONT_TRAP_PRIOS 16
 #define MLX5_BY_PASS_NUM_MULTICAST_PRIOS 1
index 846d94ad04bcc37f5d3d407976da4be982a404e9..3f0e67ee602436c1b3292c1e15bf22f21e4b0164 100644 (file)
@@ -80,6 +80,8 @@ enum mlx5_flow_namespace_type {
        MLX5_FLOW_NAMESPACE_RDMA_RX,
        MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL,
        MLX5_FLOW_NAMESPACE_RDMA_TX,
+       MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS,
+       MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS,
 };
 
 enum {