@@ -1456,7 +1456,7 @@ mlx5_create_auto_grouped_flow_table(struct mlx5_flow_namespace *ns,
14561456 struct mlx5_flow_table * ft ;
14571457 int autogroups_max_fte ;
14581458
1459- ft = mlx5_create_flow_table (ns , ft_attr );
1459+ ft = mlx5_create_vport_flow_table (ns , ft_attr , ft_attr -> vport );
14601460 if (IS_ERR (ft ))
14611461 return ft ;
14621462
@@ -2764,9 +2764,9 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
27642764}
27652765EXPORT_SYMBOL (mlx5_get_flow_namespace );
27662766
2767- struct mlx5_flow_namespace * mlx5_get_flow_vport_acl_namespace ( struct mlx5_core_dev * dev ,
2768- enum mlx5_flow_namespace_type type ,
2769- int vport )
2767+ struct mlx5_flow_namespace *
2768+ mlx5_get_flow_vport_namespace ( struct mlx5_core_dev * dev ,
2769+ enum mlx5_flow_namespace_type type , int vport_idx )
27702770{
27712771 struct mlx5_flow_steering * steering = dev -> priv .steering ;
27722772
@@ -2775,25 +2775,43 @@ struct mlx5_flow_namespace *mlx5_get_flow_vport_acl_namespace(struct mlx5_core_d
27752775
27762776 switch (type ) {
27772777 case MLX5_FLOW_NAMESPACE_ESW_EGRESS :
2778- if (vport >= steering -> esw_egress_acl_vports )
2778+ if (vport_idx >= steering -> esw_egress_acl_vports )
27792779 return NULL ;
27802780 if (steering -> esw_egress_root_ns &&
2781- steering -> esw_egress_root_ns [vport ])
2782- return & steering -> esw_egress_root_ns [vport ]-> ns ;
2781+ steering -> esw_egress_root_ns [vport_idx ])
2782+ return & steering -> esw_egress_root_ns [vport_idx ]-> ns ;
27832783 else
27842784 return NULL ;
27852785 case MLX5_FLOW_NAMESPACE_ESW_INGRESS :
2786- if (vport >= steering -> esw_ingress_acl_vports )
2786+ if (vport_idx >= steering -> esw_ingress_acl_vports )
27872787 return NULL ;
27882788 if (steering -> esw_ingress_root_ns &&
2789- steering -> esw_ingress_root_ns [vport ])
2790- return & steering -> esw_ingress_root_ns [vport ]-> ns ;
2789+ steering -> esw_ingress_root_ns [vport_idx ])
2790+ return & steering -> esw_ingress_root_ns [vport_idx ]-> ns ;
2791+ else
2792+ return NULL ;
2793+ case MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX :
2794+ if (vport_idx >= steering -> rdma_transport_rx_vports )
2795+ return NULL ;
2796+ if (steering -> rdma_transport_rx_root_ns &&
2797+ steering -> rdma_transport_rx_root_ns [vport_idx ])
2798+ return & steering -> rdma_transport_rx_root_ns [vport_idx ]-> ns ;
2799+ else
2800+ return NULL ;
2801+ case MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX :
2802+ if (vport_idx >= steering -> rdma_transport_tx_vports )
2803+ return NULL ;
2804+
2805+ if (steering -> rdma_transport_tx_root_ns &&
2806+ steering -> rdma_transport_tx_root_ns [vport_idx ])
2807+ return & steering -> rdma_transport_tx_root_ns [vport_idx ]-> ns ;
27912808 else
27922809 return NULL ;
27932810 default :
27942811 return NULL ;
27952812 }
27962813}
2814+ EXPORT_SYMBOL (mlx5_get_flow_vport_namespace );
27972815
27982816static struct fs_prio * _fs_create_prio (struct mlx5_flow_namespace * ns ,
27992817 unsigned int prio ,
@@ -3199,6 +3217,127 @@ static int init_rdma_tx_root_ns(struct mlx5_flow_steering *steering)
31993217 return err ;
32003218}
32013219
3220+ static int
3221+ init_rdma_transport_rx_root_ns_one (struct mlx5_flow_steering * steering ,
3222+ int vport_idx )
3223+ {
3224+ struct fs_prio * prio ;
3225+
3226+ steering -> rdma_transport_rx_root_ns [vport_idx ] =
3227+ create_root_ns (steering , FS_FT_RDMA_TRANSPORT_RX );
3228+ if (!steering -> rdma_transport_rx_root_ns [vport_idx ])
3229+ return - ENOMEM ;
3230+
3231+ /* create 1 prio*/
3232+ prio = fs_create_prio (& steering -> rdma_transport_rx_root_ns [vport_idx ]-> ns ,
3233+ MLX5_RDMA_TRANSPORT_BYPASS_PRIO , 1 );
3234+ return PTR_ERR_OR_ZERO (prio );
3235+ }
3236+
3237+ static int
3238+ init_rdma_transport_tx_root_ns_one (struct mlx5_flow_steering * steering ,
3239+ int vport_idx )
3240+ {
3241+ struct fs_prio * prio ;
3242+
3243+ steering -> rdma_transport_tx_root_ns [vport_idx ] =
3244+ create_root_ns (steering , FS_FT_RDMA_TRANSPORT_TX );
3245+ if (!steering -> rdma_transport_tx_root_ns [vport_idx ])
3246+ return - ENOMEM ;
3247+
3248+ /* create 1 prio*/
3249+ prio = fs_create_prio (& steering -> rdma_transport_tx_root_ns [vport_idx ]-> ns ,
3250+ MLX5_RDMA_TRANSPORT_BYPASS_PRIO , 1 );
3251+ return PTR_ERR_OR_ZERO (prio );
3252+ }
3253+
3254+ static int init_rdma_transport_rx_root_ns (struct mlx5_flow_steering * steering )
3255+ {
3256+ struct mlx5_core_dev * dev = steering -> dev ;
3257+ int total_vports ;
3258+ int err ;
3259+ int i ;
3260+
3261+ /* In case eswitch not supported and working in legacy mode */
3262+ total_vports = mlx5_eswitch_get_total_vports (dev ) ?: 1 ;
3263+
3264+ steering -> rdma_transport_rx_root_ns =
3265+ kcalloc (total_vports ,
3266+ sizeof (* steering -> rdma_transport_rx_root_ns ),
3267+ GFP_KERNEL );
3268+ if (!steering -> rdma_transport_rx_root_ns )
3269+ return - ENOMEM ;
3270+
3271+ for (i = 0 ; i < total_vports ; i ++ ) {
3272+ err = init_rdma_transport_rx_root_ns_one (steering , i );
3273+ if (err )
3274+ goto cleanup_root_ns ;
3275+ }
3276+ steering -> rdma_transport_rx_vports = total_vports ;
3277+ return 0 ;
3278+
3279+ cleanup_root_ns :
3280+ while (i -- )
3281+ cleanup_root_ns (steering -> rdma_transport_rx_root_ns [i ]);
3282+ kfree (steering -> rdma_transport_rx_root_ns );
3283+ steering -> rdma_transport_rx_root_ns = NULL ;
3284+ return err ;
3285+ }
3286+
3287+ static int init_rdma_transport_tx_root_ns (struct mlx5_flow_steering * steering )
3288+ {
3289+ struct mlx5_core_dev * dev = steering -> dev ;
3290+ int total_vports ;
3291+ int err ;
3292+ int i ;
3293+
3294+ /* In case eswitch not supported and working in legacy mode */
3295+ total_vports = mlx5_eswitch_get_total_vports (dev ) ?: 1 ;
3296+
3297+ steering -> rdma_transport_tx_root_ns =
3298+ kcalloc (total_vports ,
3299+ sizeof (* steering -> rdma_transport_tx_root_ns ),
3300+ GFP_KERNEL );
3301+ if (!steering -> rdma_transport_tx_root_ns )
3302+ return - ENOMEM ;
3303+
3304+ for (i = 0 ; i < total_vports ; i ++ ) {
3305+ err = init_rdma_transport_tx_root_ns_one (steering , i );
3306+ if (err )
3307+ goto cleanup_root_ns ;
3308+ }
3309+ steering -> rdma_transport_tx_vports = total_vports ;
3310+ return 0 ;
3311+
3312+ cleanup_root_ns :
3313+ while (i -- )
3314+ cleanup_root_ns (steering -> rdma_transport_tx_root_ns [i ]);
3315+ kfree (steering -> rdma_transport_tx_root_ns );
3316+ steering -> rdma_transport_tx_root_ns = NULL ;
3317+ return err ;
3318+ }
3319+
3320+ static void cleanup_rdma_transport_roots_ns (struct mlx5_flow_steering * steering )
3321+ {
3322+ int i ;
3323+
3324+ if (steering -> rdma_transport_rx_root_ns ) {
3325+ for (i = 0 ; i < steering -> rdma_transport_rx_vports ; i ++ )
3326+ cleanup_root_ns (steering -> rdma_transport_rx_root_ns [i ]);
3327+
3328+ kfree (steering -> rdma_transport_rx_root_ns );
3329+ steering -> rdma_transport_rx_root_ns = NULL ;
3330+ }
3331+
3332+ if (steering -> rdma_transport_tx_root_ns ) {
3333+ for (i = 0 ; i < steering -> rdma_transport_tx_vports ; i ++ )
3334+ cleanup_root_ns (steering -> rdma_transport_tx_root_ns [i ]);
3335+
3336+ kfree (steering -> rdma_transport_tx_root_ns );
3337+ steering -> rdma_transport_tx_root_ns = NULL ;
3338+ }
3339+ }
3340+
32023341/* FT and tc chains are stored in the same array so we can re-use the
32033342 * mlx5_get_fdb_sub_ns() and tc api for FT chains.
32043343 * When creating a new ns for each chain store it in the first available slot.
@@ -3631,6 +3770,7 @@ void mlx5_fs_core_cleanup(struct mlx5_core_dev *dev)
36313770 cleanup_root_ns (steering -> rdma_rx_root_ns );
36323771 cleanup_root_ns (steering -> rdma_tx_root_ns );
36333772 cleanup_root_ns (steering -> egress_root_ns );
3773+ cleanup_rdma_transport_roots_ns (steering );
36343774
36353775 devl_params_unregister (priv_to_devlink (dev ), mlx5_fs_params ,
36363776 ARRAY_SIZE (mlx5_fs_params ));
@@ -3700,6 +3840,18 @@ int mlx5_fs_core_init(struct mlx5_core_dev *dev)
37003840 goto err ;
37013841 }
37023842
3843+ if (MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_RX (dev , ft_support )) {
3844+ err = init_rdma_transport_rx_root_ns (steering );
3845+ if (err )
3846+ goto err ;
3847+ }
3848+
3849+ if (MLX5_CAP_FLOWTABLE_RDMA_TRANSPORT_TX (dev , ft_support )) {
3850+ err = init_rdma_transport_tx_root_ns (steering );
3851+ if (err )
3852+ goto err ;
3853+ }
3854+
37033855 return 0 ;
37043856
37053857err :
@@ -3850,8 +4002,10 @@ mlx5_get_root_namespace(struct mlx5_core_dev *dev, enum mlx5_flow_namespace_type
38504002 struct mlx5_flow_namespace * ns ;
38514003
38524004 if (ns_type == MLX5_FLOW_NAMESPACE_ESW_EGRESS ||
3853- ns_type == MLX5_FLOW_NAMESPACE_ESW_INGRESS )
3854- ns = mlx5_get_flow_vport_acl_namespace (dev , ns_type , 0 );
4005+ ns_type == MLX5_FLOW_NAMESPACE_ESW_INGRESS ||
4006+ ns_type == MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_TX ||
4007+ ns_type == MLX5_FLOW_NAMESPACE_RDMA_TRANSPORT_RX )
4008+ ns = mlx5_get_flow_vport_namespace (dev , ns_type , 0 );
38554009 else
38564010 ns = mlx5_get_flow_namespace (dev , ns_type );
38574011 if (!ns )
0 commit comments