RDMA/mlx5: RDMA_RX flow type support for user applications
authorMark Zhang <markz@mellanox.com>
Mon, 19 Aug 2019 11:36:26 +0000 (14:36 +0300)
committerDoug Ledford <dledford@redhat.com>
Mon, 26 Aug 2019 14:30:00 +0000 (10:30 -0400)
Currently user applications can only steer TCP/IP(NIC RX/RX) traffic.
This patch adds RDMA_RX as a new flow type to allow the user to insert
steering rules to control RDMA traffic.
Two destinations are supported(but not set at the same time): devx
flow table object and QP.

Signed-off-by: Mark Zhang <markz@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Link: https://lore.kernel.org/r/20190819113626.20284-4-leon@kernel.org
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/hw/mlx5/flow.c
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h
include/uapi/rdma/mlx5_user_ioctl_verbs.h

index b8841355fcd51182e93adab1829108e5804b73a6..571bb8539cdb0b1b14f5dc68df4b36e9e555fb7b 100644 (file)
@@ -32,6 +32,9 @@ mlx5_ib_ft_type_to_namespace(enum mlx5_ib_uapi_flow_table_type table_type,
        case MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB:
                *namespace = MLX5_FLOW_NAMESPACE_FDB;
                break;
+       case MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_RX:
+               *namespace = MLX5_FLOW_NAMESPACE_RDMA_RX;
+               break;
        default:
                return -EINVAL;
        }
@@ -101,6 +104,11 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
        if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB && !dest_devx)
                return -EINVAL;
 
+       /* Allow only DEVX object or QP as dest when inserting to RDMA_RX */
+       if ((fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX) &&
+           ((!dest_devx && !dest_qp) || (dest_devx && dest_qp)))
+               return -EINVAL;
+
        if (dest_devx) {
                devx_obj = uverbs_attr_get_obj(
                        attrs, MLX5_IB_ATTR_CREATE_FLOW_DEST_DEVX);
@@ -112,8 +120,9 @@ static int UVERBS_HANDLER(MLX5_IB_METHOD_CREATE_FLOW)(
                 */
                if (!mlx5_ib_devx_is_flow_dest(devx_obj, &dest_id, &dest_type))
                        return -EINVAL;
-               /* Allow only flow table as dest when inserting to FDB */
-               if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB &&
+               /* Allow only flow table as dest when inserting to FDB or RDMA_RX */
+               if ((fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB ||
+                    fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX) &&
                    dest_type != MLX5_FLOW_DESTINATION_TYPE_FLOW_TABLE)
                        return -EINVAL;
        } else if (dest_qp) {
index 1ec0e667110ee6d7c0aa0ec33ecdd88f25d1fc8f..07aecba16019f3067e198280456abdd55d4c2402 100644 (file)
@@ -3963,6 +3963,11 @@ _get_flow_table(struct mlx5_ib_dev *dev,
                    esw_encap)
                        flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
                priority = FDB_BYPASS_PATH;
+       } else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX) {
+               max_table_size =
+                       BIT(MLX5_CAP_FLOWTABLE_RDMA_RX(dev->mdev,
+                                                      log_max_ft_size));
+               priority = fs_matcher->priority;
        }
 
        max_table_size = min_t(int, max_table_size, MLX5_FS_MAX_ENTRIES);
@@ -3977,6 +3982,8 @@ _get_flow_table(struct mlx5_ib_dev *dev,
                prio = &dev->flow_db->egress_prios[priority];
        else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB)
                prio = &dev->flow_db->fdb;
+       else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_RDMA_RX)
+               prio = &dev->flow_db->rdma_rx[priority];
 
        if (!prio)
                return ERR_PTR(-EINVAL);
index cb41a7e6255a2f7e5b22cd7136b0624164da60f1..6abfbf3a69b7b0a989237e7dbe87eb54d0e7ca45 100644 (file)
@@ -200,6 +200,7 @@ struct mlx5_ib_flow_db {
        struct mlx5_ib_flow_prio        sniffer[MLX5_IB_NUM_SNIFFER_FTS];
        struct mlx5_ib_flow_prio        egress[MLX5_IB_NUM_EGRESS_FTS];
        struct mlx5_ib_flow_prio        fdb;
+       struct mlx5_ib_flow_prio        rdma_rx[MLX5_IB_NUM_FLOW_FT];
        struct mlx5_flow_table          *lag_demux_ft;
        /* Protect flow steering bypass flow tables
         * when add/del flow rules.
index 7e9900b0e7461f961bdf7a6aeaa4e389ed121a13..88b6ca70c2fe3618324933fdb48c86014ff28f85 100644 (file)
@@ -43,6 +43,7 @@ enum mlx5_ib_uapi_flow_table_type {
        MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_RX     = 0x0,
        MLX5_IB_UAPI_FLOW_TABLE_TYPE_NIC_TX     = 0x1,
        MLX5_IB_UAPI_FLOW_TABLE_TYPE_FDB        = 0x2,
+       MLX5_IB_UAPI_FLOW_TABLE_TYPE_RDMA_RX    = 0x3,
 };
 
 enum mlx5_ib_uapi_flow_action_packet_reformat_type {