net/mlx5: Add support in RDMA RX steering
authorMaor Gottlieb <maorg@mellanox.com>
Mon, 29 Apr 2019 18:14:12 +0000 (18:14 +0000)
committerSaeed Mahameed <saeedm@mellanox.com>
Mon, 29 Apr 2019 23:55:05 +0000 (16:55 -0700)
Add new flow steering namespace - MLX5_FLOW_NAMESPACE_RDMA_RX.
Flow steering rules in this namespace are used to filter
RDMA traffic.

Signed-off-by: Maor Gottlieb <maorg@mellanox.com>
Reviewed-by: Mark Bloch <markb@mellanox.com>
Signed-off-by: Saeed Mahameed <saeedm@mellanox.com>
drivers/net/ethernet/mellanox/mlx5/core/fs_cmd.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.c
drivers/net/ethernet/mellanox/mlx5/core/fs_core.h
include/linux/mlx5/device.h
include/linux/mlx5/fs.h
include/linux/mlx5/mlx5_ifc.h

index e89555d..629c5ab 100644 (file)
@@ -854,6 +854,7 @@ const struct mlx5_flow_cmds *mlx5_fs_cmd_get_default(enum fs_flow_table_type typ
        case FS_FT_SNIFFER_RX:
        case FS_FT_SNIFFER_TX:
        case FS_FT_NIC_TX:
+       case FS_FT_RDMA_RX:
                return mlx5_fs_cmd_get_fw_cmds();
        default:
                return mlx5_fs_cmd_get_stub_cmds();
index 6024df8..3c2302a 100644 (file)
@@ -2054,6 +2054,10 @@ 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;
        }
@@ -2450,6 +2454,7 @@ void mlx5_cleanup_fs(struct mlx5_core_dev *dev)
        steering->fdb_sub_ns = NULL;
        cleanup_root_ns(steering->sniffer_rx_root_ns);
        cleanup_root_ns(steering->sniffer_tx_root_ns);
+       cleanup_root_ns(steering->rdma_rx_root_ns);
        cleanup_root_ns(steering->egress_root_ns);
        mlx5_cleanup_fc_stats(dev);
        kmem_cache_destroy(steering->ftes_cache);
@@ -2491,6 +2496,22 @@ static int init_sniffer_rx_root_ns(struct mlx5_flow_steering *steering)
        return 0;
 }
 
+static int init_rdma_rx_root_ns(struct mlx5_flow_steering *steering)
+{
+       struct fs_prio *prio;
+
+       steering->rdma_rx_root_ns = create_root_ns(steering, FS_FT_RDMA_RX);
+       if (!steering->rdma_rx_root_ns)
+               return -ENOMEM;
+
+       /* Create single prio */
+       prio = fs_create_prio(&steering->rdma_rx_root_ns->ns, 0, 1);
+       if (IS_ERR(prio)) {
+               cleanup_root_ns(steering->rdma_rx_root_ns);
+               return PTR_ERR(prio);
+       }
+       return 0;
+}
 static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
 {
        struct mlx5_flow_namespace *ns;
@@ -2727,6 +2748,12 @@ int mlx5_init_fs(struct mlx5_core_dev *dev)
                        goto err;
        }
 
+       if (MLX5_CAP_FLOWTABLE_RDMA_RX(dev, ft_support)) {
+               err = init_rdma_rx_root_ns(steering);
+               if (err)
+                       goto err;
+       }
+
        if (MLX5_IPSEC_DEV(dev) || MLX5_CAP_FLOWTABLE_NIC_TX(dev, ft_support)) {
                err = init_egress_root_ns(steering);
                if (err)
index 87de0e4..e43c6f6 100644 (file)
@@ -67,6 +67,7 @@ enum fs_flow_table_type {
        FS_FT_FDB             = 0X4,
        FS_FT_SNIFFER_RX        = 0X5,
        FS_FT_SNIFFER_TX        = 0X6,
+       FS_FT_RDMA_RX           = 0X7,
        FS_FT_MAX_TYPE = FS_FT_SNIFFER_TX,
 };
 
@@ -90,6 +91,7 @@ struct mlx5_flow_steering {
        struct mlx5_flow_root_namespace **esw_ingress_root_ns;
        struct mlx5_flow_root_namespace *sniffer_tx_root_ns;
        struct mlx5_flow_root_namespace *sniffer_rx_root_ns;
+       struct mlx5_flow_root_namespace *rdma_rx_root_ns;
        struct mlx5_flow_root_namespace *egress_root_ns;
 };
 
index f93a559..28ebb6c 100644 (file)
@@ -1166,6 +1166,12 @@ enum mlx5_qcam_feature_groups {
 #define MLX5_CAP_FLOWTABLE_SNIFFER_TX_MAX(mdev, cap) \
        MLX5_CAP_FLOWTABLE_MAX(mdev, flow_table_properties_nic_transmit_sniffer.cap)
 
+#define MLX5_CAP_FLOWTABLE_RDMA_RX(mdev, cap) \
+       MLX5_CAP_FLOWTABLE(mdev, flow_table_properties_nic_receive_rdma.cap)
+
+#define MLX5_CAP_FLOWTABLE_RDMA_RX_MAX(mdev, cap) \
+       MLX5_CAP_FLOWTABLE_MAX(mdev, flow_table_properties_nic_receive_rdma.cap)
+
 #define MLX5_CAP_ESW_FLOWTABLE(mdev, cap) \
        MLX5_GET(flow_table_eswitch_cap, \
                 mdev->caps.hca_cur[MLX5_CAP_ESWITCH_FLOW_TABLE], cap)
index fd91df3..e690ba0 100644 (file)
@@ -73,6 +73,7 @@ enum mlx5_flow_namespace_type {
        MLX5_FLOW_NAMESPACE_SNIFFER_RX,
        MLX5_FLOW_NAMESPACE_SNIFFER_TX,
        MLX5_FLOW_NAMESPACE_EGRESS,
+       MLX5_FLOW_NAMESPACE_RDMA_RX,
 };
 
 enum {
index eeedf3f..89e7194 100644 (file)
@@ -598,7 +598,7 @@ struct mlx5_ifc_flow_table_nic_cap_bits {
 
        struct mlx5_ifc_flow_table_prop_layout_bits flow_table_properties_nic_receive;
 
-       u8         reserved_at_400[0x200];
+       struct mlx5_ifc_flow_table_prop_layout_bits flow_table_properties_nic_receive_rdma;
 
        struct mlx5_ifc_flow_table_prop_layout_bits flow_table_properties_nic_receive_sniffer;