RDMA/mlx5: Access the prio bypass inside the FDB flow table namespace
authorMark Bloch <markb@mellanox.com>
Thu, 28 Mar 2019 13:46:21 +0000 (15:46 +0200)
committerJason Gunthorpe <jgg@mellanox.com>
Mon, 22 Apr 2019 18:24:05 +0000 (15:24 -0300)
Now that we have a specific prio inside the FDB namespace allow retrieving
it from the RDMA side.

Signed-off-by: Mark Bloch <markb@mellanox.com>
Reviewed-by: Maor Gottlieb <maorg@mellanox.com>
Signed-off-by: Leon Romanovsky <leonro@mellanox.com>
Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
drivers/infiniband/hw/mlx5/main.c
drivers/infiniband/hw/mlx5/mlx5_ib.h

index a3248f6..ecd5054 100644 (file)
@@ -3809,11 +3809,16 @@ _get_flow_table(struct mlx5_ib_dev *dev,
                bool mcast)
 {
        struct mlx5_flow_namespace *ns = NULL;
-       struct mlx5_ib_flow_prio *prio;
-       int max_table_size;
+       struct mlx5_ib_flow_prio *prio = NULL;
+       int max_table_size = 0;
        u32 flags = 0;
        int priority;
 
+       if (mcast)
+               priority = MLX5_IB_FLOW_MCAST_PRIO;
+       else
+               priority = ib_prio_to_core_prio(fs_matcher->priority, false);
+
        if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_BYPASS) {
                max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
                                        log_max_ft_size));
@@ -3822,29 +3827,33 @@ _get_flow_table(struct mlx5_ib_dev *dev,
                if (MLX5_CAP_FLOWTABLE_NIC_RX(dev->mdev,
                                              reformat_l3_tunnel_to_l2))
                        flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
-       } else { /* Can only be MLX5_FLOW_NAMESPACE_EGRESS */
-               max_table_size = BIT(MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev,
-                                       log_max_ft_size));
+       } else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_EGRESS) {
+               max_table_size = BIT(
+                       MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev, log_max_ft_size));
                if (MLX5_CAP_FLOWTABLE_NIC_TX(dev->mdev, reformat))
                        flags |= MLX5_FLOW_TABLE_TUNNEL_EN_REFORMAT;
+       } else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB) {
+               max_table_size = BIT(
+                       MLX5_CAP_ESW_FLOWTABLE_FDB(dev->mdev, log_max_ft_size));
+               priority = FDB_BYPASS_PATH;
        }
 
        if (max_table_size < MLX5_FS_MAX_ENTRIES)
                return ERR_PTR(-ENOMEM);
 
-       if (mcast)
-               priority = MLX5_IB_FLOW_MCAST_PRIO;
-       else
-               priority = ib_prio_to_core_prio(fs_matcher->priority, false);
-
        ns = mlx5_get_flow_namespace(dev->mdev, fs_matcher->ns_type);
        if (!ns)
                return ERR_PTR(-ENOTSUPP);
 
        if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_BYPASS)
                prio = &dev->flow_db->prios[priority];
-       else
+       else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_EGRESS)
                prio = &dev->flow_db->egress_prios[priority];
+       else if (fs_matcher->ns_type == MLX5_FLOW_NAMESPACE_FDB)
+               prio = &dev->flow_db->fdb;
+
+       if (!prio)
+               return ERR_PTR(-EINVAL);
 
        if (prio->flow_table)
                return prio;
index f5d572d..55b8bdb 100644 (file)
@@ -194,6 +194,7 @@ struct mlx5_ib_flow_db {
        struct mlx5_ib_flow_prio        egress_prios[MLX5_IB_NUM_FLOW_FT];
        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_flow_table          *lag_demux_ft;
        /* Protect flow steering bypass flow tables
         * when add/del flow rules.