You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
5.5 KiB
162 lines
5.5 KiB
4 years ago
|
From d5e6f312b0c92828a91b795274a9fece4b45f953 Mon Sep 17 00:00:00 2001
|
||
|
From: Alaa Hleihel <ahleihel@redhat.com>
|
||
|
Date: Sun, 10 May 2020 14:52:01 -0400
|
||
|
Subject: [PATCH 037/312] [netdrv] net/mlx5: Create bypass and loopback flow
|
||
|
steering namespaces for RDMA RX
|
||
|
|
||
|
Message-id: <20200510145245.10054-39-ahleihel@redhat.com>
|
||
|
Patchwork-id: 306579
|
||
|
Patchwork-instance: patchwork
|
||
|
O-Subject: [RHEL8.3 BZ 1789378 v2 38/82] net/mlx5: Create bypass and loopback flow steering namespaces for RDMA RX
|
||
|
Bugzilla: 1789378
|
||
|
RH-Acked-by: Kamal Heib <kheib@redhat.com>
|
||
|
RH-Acked-by: Jarod Wilson <jarod@redhat.com>
|
||
|
RH-Acked-by: Tony Camuso <tcamuso@redhat.com>
|
||
|
RH-Acked-by: Jonathan Toppins <jtoppins@redhat.com>
|
||
|
|
||
|
Bugzilla: http://bugzilla.redhat.com/1789378
|
||
|
Upstream: v5.4-rc1
|
||
|
|
||
|
commit e6806e9a63a759e445383915bb9d2ec85a90aebf
|
||
|
Author: Mark Zhang <markz@mellanox.com>
|
||
|
Date: Mon Aug 19 14:36:25 2019 +0300
|
||
|
|
||
|
net/mlx5: Create bypass and loopback flow steering namespaces for RDMA RX
|
||
|
|
||
|
Use different namespaces for bypass and switchdev loopback because they
|
||
|
have different priorities and default table miss action requirement:
|
||
|
1. bypass: with multiple priorities support, and
|
||
|
MLX5_FLOW_TABLE_MISS_ACTION_DEF as the default table miss action;
|
||
|
2. switchdev loopback: with single priority support, and
|
||
|
MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN as the default table miss
|
||
|
action.
|
||
|
|
||
|
Signed-off-by: Mark Zhang <markz@mellanox.com>
|
||
|
Reviewed-by: Mark Bloch <markb@mellanox.com>
|
||
|
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
|
||
|
|
||
|
Signed-off-by: Alaa Hleihel <ahleihel@redhat.com>
|
||
|
Signed-off-by: Frantisek Hrbata <fhrbata@redhat.com>
|
||
|
---
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c | 49 ++++++++++++++++++-----
|
||
|
drivers/net/ethernet/mellanox/mlx5/core/rdma.c | 2 +-
|
||
|
include/linux/mlx5/fs.h | 3 ++
|
||
|
3 files changed, 43 insertions(+), 11 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
||
|
index 5ebd74d078f2..495396f42153 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
|
||
|
@@ -182,6 +182,26 @@ static struct init_tree_node egress_root_fs = {
|
||
|
}
|
||
|
};
|
||
|
|
||
|
+#define RDMA_RX_BYPASS_PRIO 0
|
||
|
+#define RDMA_RX_KERNEL_PRIO 1
|
||
|
+static struct init_tree_node rdma_rx_root_fs = {
|
||
|
+ .type = FS_TYPE_NAMESPACE,
|
||
|
+ .ar_size = 2,
|
||
|
+ .children = (struct init_tree_node[]) {
|
||
|
+ [RDMA_RX_BYPASS_PRIO] =
|
||
|
+ ADD_PRIO(0, MLX5_BY_PASS_NUM_REGULAR_PRIOS, 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,
|
||
|
+ FS_CHAINING_CAPS,
|
||
|
+ ADD_NS(MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN,
|
||
|
+ ADD_MULTIPLE_PRIO(1, 1))),
|
||
|
+ }
|
||
|
+};
|
||
|
+
|
||
|
enum fs_i_lock_class {
|
||
|
FS_LOCK_GRANDPARENT,
|
||
|
FS_LOCK_PARENT,
|
||
|
@@ -2071,16 +2091,18 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
|
||
|
if (steering->sniffer_tx_root_ns)
|
||
|
return &steering->sniffer_tx_root_ns->ns;
|
||
|
return NULL;
|
||
|
- case MLX5_FLOW_NAMESPACE_RDMA_RX:
|
||
|
- if (steering->rdma_rx_root_ns)
|
||
|
- return &steering->rdma_rx_root_ns->ns;
|
||
|
- return NULL;
|
||
|
default:
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (type == MLX5_FLOW_NAMESPACE_EGRESS) {
|
||
|
root_ns = steering->egress_root_ns;
|
||
|
+ } else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX) {
|
||
|
+ root_ns = steering->rdma_rx_root_ns;
|
||
|
+ prio = RDMA_RX_BYPASS_PRIO;
|
||
|
+ } else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL) {
|
||
|
+ root_ns = steering->rdma_rx_root_ns;
|
||
|
+ prio = RDMA_RX_KERNEL_PRIO;
|
||
|
} else { /* Must be NIC RX */
|
||
|
root_ns = steering->root_ns;
|
||
|
prio = type;
|
||
|
@@ -2511,18 +2533,25 @@ static int init_sniffer_rx_root_ns(struct mlx5_flow_steering *steering)
|
||
|
|
||
|
static int init_rdma_rx_root_ns(struct mlx5_flow_steering *steering)
|
||
|
{
|
||
|
- struct fs_prio *prio;
|
||
|
+ int err;
|
||
|
|
||
|
steering->rdma_rx_root_ns = create_root_ns(steering, FS_FT_RDMA_RX);
|
||
|
if (!steering->rdma_rx_root_ns)
|
||
|
return -ENOMEM;
|
||
|
|
||
|
- steering->rdma_rx_root_ns->ns.def_miss_action =
|
||
|
- MLX5_FLOW_TABLE_MISS_ACTION_SWITCH_DOMAIN;
|
||
|
+ err = init_root_tree(steering, &rdma_rx_root_fs,
|
||
|
+ &steering->rdma_rx_root_ns->ns.node);
|
||
|
+ if (err)
|
||
|
+ goto out_err;
|
||
|
|
||
|
- /* Create single prio */
|
||
|
- prio = fs_create_prio(&steering->rdma_rx_root_ns->ns, 0, 1);
|
||
|
- return PTR_ERR_OR_ZERO(prio);
|
||
|
+ set_prio_attrs(steering->rdma_rx_root_ns);
|
||
|
+
|
||
|
+ return 0;
|
||
|
+
|
||
|
+out_err:
|
||
|
+ cleanup_root_ns(steering->rdma_rx_root_ns);
|
||
|
+ steering->rdma_rx_root_ns = NULL;
|
||
|
+ return err;
|
||
|
}
|
||
|
static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
|
||
|
{
|
||
|
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/rdma.c b/drivers/net/ethernet/mellanox/mlx5/core/rdma.c
|
||
|
index c43f7dc43cea..0fc7de4aa572 100644
|
||
|
--- a/drivers/net/ethernet/mellanox/mlx5/core/rdma.c
|
||
|
+++ b/drivers/net/ethernet/mellanox/mlx5/core/rdma.c
|
||
|
@@ -48,7 +48,7 @@ static int mlx5_rdma_enable_roce_steering(struct mlx5_core_dev *dev)
|
||
|
return -ENOMEM;
|
||
|
}
|
||
|
|
||
|
- ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_RDMA_RX);
|
||
|
+ ns = mlx5_get_flow_namespace(dev, MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL);
|
||
|
if (!ns) {
|
||
|
mlx5_core_err(dev, "Failed to get RDMA RX namespace");
|
||
|
err = -EOPNOTSUPP;
|
||
|
diff --git a/include/linux/mlx5/fs.h b/include/linux/mlx5/fs.h
|
||
|
index a008e9b63b78..948cba3389ff 100644
|
||
|
--- a/include/linux/mlx5/fs.h
|
||
|
+++ b/include/linux/mlx5/fs.h
|
||
|
@@ -75,6 +75,9 @@ enum mlx5_flow_namespace_type {
|
||
|
MLX5_FLOW_NAMESPACE_SNIFFER_TX,
|
||
|
MLX5_FLOW_NAMESPACE_EGRESS,
|
||
|
MLX5_FLOW_NAMESPACE_RDMA_RX,
|
||
|
+#ifndef __GENKSYMS__
|
||
|
+ MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL,
|
||
|
+#endif
|
||
|
};
|
||
|
|
||
|
enum {
|
||
|
--
|
||
|
2.13.6
|
||
|
|