@@ -2206,6 +2206,22 @@ struct mlx5_flow_namespace *mlx5_get_fdb_sub_ns(struct mlx5_core_dev *dev,
22062206}
22072207EXPORT_SYMBOL (mlx5_get_fdb_sub_ns );
22082208
2209+ static bool is_nic_rx_ns (enum mlx5_flow_namespace_type type )
2210+ {
2211+ switch (type ) {
2212+ case MLX5_FLOW_NAMESPACE_BYPASS :
2213+ case MLX5_FLOW_NAMESPACE_LAG :
2214+ case MLX5_FLOW_NAMESPACE_OFFLOADS :
2215+ case MLX5_FLOW_NAMESPACE_ETHTOOL :
2216+ case MLX5_FLOW_NAMESPACE_KERNEL :
2217+ case MLX5_FLOW_NAMESPACE_LEFTOVERS :
2218+ case MLX5_FLOW_NAMESPACE_ANCHOR :
2219+ return true;
2220+ default :
2221+ return false;
2222+ }
2223+ }
2224+
22092225struct mlx5_flow_namespace * mlx5_get_flow_namespace (struct mlx5_core_dev * dev ,
22102226 enum mlx5_flow_namespace_type type )
22112227{
@@ -2235,31 +2251,39 @@ struct mlx5_flow_namespace *mlx5_get_flow_namespace(struct mlx5_core_dev *dev,
22352251 if (steering -> sniffer_tx_root_ns )
22362252 return & steering -> sniffer_tx_root_ns -> ns ;
22372253 return NULL ;
2238- default :
2254+ case MLX5_FLOW_NAMESPACE_FDB_BYPASS :
2255+ root_ns = steering -> fdb_root_ns ;
2256+ prio = FDB_BYPASS_PATH ;
22392257 break ;
2240- }
2241-
2242- if (type == MLX5_FLOW_NAMESPACE_EGRESS ||
2243- type == MLX5_FLOW_NAMESPACE_EGRESS_KERNEL ) {
2258+ case MLX5_FLOW_NAMESPACE_EGRESS :
2259+ case MLX5_FLOW_NAMESPACE_EGRESS_KERNEL :
22442260 root_ns = steering -> egress_root_ns ;
22452261 prio = type - MLX5_FLOW_NAMESPACE_EGRESS ;
2246- } else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX ) {
2262+ break ;
2263+ case MLX5_FLOW_NAMESPACE_RDMA_RX :
22472264 root_ns = steering -> rdma_rx_root_ns ;
22482265 prio = RDMA_RX_BYPASS_PRIO ;
2249- } else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL ) {
2266+ break ;
2267+ case MLX5_FLOW_NAMESPACE_RDMA_RX_KERNEL :
22502268 root_ns = steering -> rdma_rx_root_ns ;
22512269 prio = RDMA_RX_KERNEL_PRIO ;
2252- } else if (type == MLX5_FLOW_NAMESPACE_RDMA_TX ) {
2270+ break ;
2271+ case MLX5_FLOW_NAMESPACE_RDMA_TX :
22532272 root_ns = steering -> rdma_tx_root_ns ;
2254- } else if (type == MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS ) {
2273+ break ;
2274+ case MLX5_FLOW_NAMESPACE_RDMA_RX_COUNTERS :
22552275 root_ns = steering -> rdma_rx_root_ns ;
22562276 prio = RDMA_RX_COUNTERS_PRIO ;
2257- } else if (type == MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS ) {
2277+ break ;
2278+ case MLX5_FLOW_NAMESPACE_RDMA_TX_COUNTERS :
22582279 root_ns = steering -> rdma_tx_root_ns ;
22592280 prio = RDMA_TX_COUNTERS_PRIO ;
2260- } else { /* Must be NIC RX */
2281+ break ;
2282+ default : /* Must be NIC RX */
2283+ WARN_ON (!is_nic_rx_ns (type ));
22612284 root_ns = steering -> root_ns ;
22622285 prio = type ;
2286+ break ;
22632287 }
22642288
22652289 if (!root_ns )
@@ -2822,6 +2846,28 @@ static int create_fdb_fast_path(struct mlx5_flow_steering *steering)
28222846 return 0 ;
28232847}
28242848
2849+ static int create_fdb_bypass (struct mlx5_flow_steering * steering )
2850+ {
2851+ struct mlx5_flow_namespace * ns ;
2852+ struct fs_prio * prio ;
2853+ int i ;
2854+
2855+ prio = fs_create_prio (& steering -> fdb_root_ns -> ns , FDB_BYPASS_PATH , 0 );
2856+ if (IS_ERR (prio ))
2857+ return PTR_ERR (prio );
2858+
2859+ ns = fs_create_namespace (prio , MLX5_FLOW_TABLE_MISS_ACTION_DEF );
2860+ if (IS_ERR (ns ))
2861+ return PTR_ERR (ns );
2862+
2863+ for (i = 0 ; i < MLX5_BY_PASS_NUM_REGULAR_PRIOS ; i ++ ) {
2864+ prio = fs_create_prio (ns , i , 1 );
2865+ if (IS_ERR (prio ))
2866+ return PTR_ERR (prio );
2867+ }
2868+ return 0 ;
2869+ }
2870+
28252871static int init_fdb_root_ns (struct mlx5_flow_steering * steering )
28262872{
28272873 struct fs_prio * maj_prio ;
@@ -2831,12 +2877,10 @@ static int init_fdb_root_ns(struct mlx5_flow_steering *steering)
28312877 if (!steering -> fdb_root_ns )
28322878 return - ENOMEM ;
28332879
2834- maj_prio = fs_create_prio (& steering -> fdb_root_ns -> ns , FDB_BYPASS_PATH ,
2835- 1 );
2836- if (IS_ERR (maj_prio )) {
2837- err = PTR_ERR (maj_prio );
2880+ err = create_fdb_bypass (steering );
2881+ if (err )
28382882 goto out_err ;
2839- }
2883+
28402884 err = create_fdb_fast_path (steering );
28412885 if (err )
28422886 goto out_err ;
0 commit comments