@@ -1069,6 +1069,9 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
10691069 void * misc ;
10701070 int err ;
10711071
1072+ if (!MLX5_VPORT_MANAGER (esw -> dev ) && !mlx5_core_is_ecpf_esw_manager (esw -> dev ))
1073+ return 0 ;
1074+
10721075 spec = kvzalloc (sizeof (* spec ), GFP_KERNEL );
10731076 if (!spec )
10741077 return - ENOMEM ;
@@ -1177,11 +1180,14 @@ static int esw_add_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
11771180static void esw_del_fdb_peer_miss_rules (struct mlx5_eswitch * esw ,
11781181 struct mlx5_core_dev * peer_dev )
11791182{
1183+ u16 peer_index = mlx5_get_dev_index (peer_dev );
11801184 struct mlx5_flow_handle * * flows ;
11811185 struct mlx5_vport * vport ;
11821186 unsigned long i ;
11831187
1184- flows = esw -> fdb_table .offloads .peer_miss_rules [mlx5_get_dev_index (peer_dev )];
1188+ flows = esw -> fdb_table .offloads .peer_miss_rules [peer_index ];
1189+ if (!flows )
1190+ return ;
11851191
11861192 if (mlx5_core_ec_sriov_enabled (esw -> dev )) {
11871193 mlx5_esw_for_each_ec_vf_vport (esw , i , vport , mlx5_core_max_ec_vfs (esw -> dev )) {
@@ -1206,7 +1212,9 @@ static void esw_del_fdb_peer_miss_rules(struct mlx5_eswitch *esw,
12061212 vport = mlx5_eswitch_get_vport (esw , MLX5_VPORT_PF );
12071213 mlx5_del_flow_rules (flows [vport -> index ]);
12081214 }
1215+
12091216 kvfree (flows );
1217+ esw -> fdb_table .offloads .peer_miss_rules [peer_index ] = NULL ;
12101218}
12111219
12121220static int esw_add_fdb_miss_rule (struct mlx5_eswitch * esw )
@@ -1896,7 +1904,6 @@ static int esw_create_vport_rx_group(struct mlx5_eswitch *esw)
18961904 if (!flow_group_in )
18971905 return - ENOMEM ;
18981906
1899- /* create vport rx group */
19001907 mlx5_esw_set_flow_group_source_port (esw , flow_group_in , 0 );
19011908
19021909 MLX5_SET (create_flow_group_in , flow_group_in , start_flow_index , 0 );
@@ -2543,13 +2550,13 @@ static int __esw_set_master_egress_rule(struct mlx5_core_dev *master,
25432550 return err ;
25442551}
25452552
2546- static int esw_master_egress_create_resources (struct mlx5_flow_namespace * egress_ns ,
2553+ static int esw_master_egress_create_resources (struct mlx5_eswitch * esw ,
2554+ struct mlx5_flow_namespace * egress_ns ,
25472555 struct mlx5_vport * vport , size_t count )
25482556{
25492557 int inlen = MLX5_ST_SZ_BYTES (create_flow_group_in );
25502558 struct mlx5_flow_table_attr ft_attr = {
25512559 .max_fte = count , .prio = 0 , .level = 0 ,
2552- .flags = MLX5_FLOW_TABLE_OTHER_VPORT ,
25532560 };
25542561 struct mlx5_flow_table * acl ;
25552562 struct mlx5_flow_group * g ;
@@ -2564,6 +2571,9 @@ static int esw_master_egress_create_resources(struct mlx5_flow_namespace *egress
25642571 if (!flow_group_in )
25652572 return - ENOMEM ;
25662573
2574+ if (vport -> vport || mlx5_core_is_ecpf (esw -> dev ))
2575+ ft_attr .flags = MLX5_FLOW_TABLE_OTHER_VPORT ;
2576+
25672577 acl = mlx5_create_vport_flow_table (egress_ns , & ft_attr , vport -> vport );
25682578 if (IS_ERR (acl )) {
25692579 err = PTR_ERR (acl );
@@ -2608,8 +2618,12 @@ static int esw_master_egress_create_resources(struct mlx5_flow_namespace *egress
26082618
26092619static void esw_master_egress_destroy_resources (struct mlx5_vport * vport )
26102620{
2621+ if (!xa_empty (& vport -> egress .offloads .bounce_rules ))
2622+ return ;
26112623 mlx5_destroy_flow_group (vport -> egress .offloads .bounce_grp );
2624+ vport -> egress .offloads .bounce_grp = NULL ;
26122625 mlx5_destroy_flow_table (vport -> egress .acl );
2626+ vport -> egress .acl = NULL ;
26132627}
26142628
26152629static int esw_set_master_egress_rule (struct mlx5_core_dev * master ,
@@ -2634,7 +2648,7 @@ static int esw_set_master_egress_rule(struct mlx5_core_dev *master,
26342648 if (vport -> egress .acl && vport -> egress .type != VPORT_EGRESS_ACL_TYPE_SHARED_FDB )
26352649 return 0 ;
26362650
2637- err = esw_master_egress_create_resources (egress_ns , vport , count );
2651+ err = esw_master_egress_create_resources (esw , egress_ns , vport , count );
26382652 if (err )
26392653 return err ;
26402654
@@ -2799,15 +2813,21 @@ static int mlx5_esw_offloads_devcom_event(int event,
27992813 struct mlx5_eswitch * esw = my_data ;
28002814 struct mlx5_devcom * devcom = esw -> dev -> priv .devcom ;
28012815 struct mlx5_eswitch * peer_esw = event_data ;
2816+ u16 esw_i , peer_esw_i ;
2817+ bool esw_paired ;
28022818 int err ;
28032819
2820+ peer_esw_i = MLX5_CAP_GEN (peer_esw -> dev , vhca_id );
2821+ esw_i = MLX5_CAP_GEN (esw -> dev , vhca_id );
2822+ esw_paired = !!xa_load (& esw -> paired , peer_esw_i );
2823+
28042824 switch (event ) {
28052825 case ESW_OFFLOADS_DEVCOM_PAIR :
28062826 if (mlx5_eswitch_vport_match_metadata_enabled (esw ) !=
28072827 mlx5_eswitch_vport_match_metadata_enabled (peer_esw ))
28082828 break ;
28092829
2810- if (esw -> paired [ mlx5_get_dev_index ( peer_esw -> dev )] )
2830+ if (esw_paired )
28112831 break ;
28122832
28132833 err = mlx5_esw_offloads_set_ns_peer (esw , peer_esw , true);
@@ -2821,23 +2841,29 @@ static int mlx5_esw_offloads_devcom_event(int event,
28212841 if (err )
28222842 goto err_pair ;
28232843
2824- esw -> paired [mlx5_get_dev_index (peer_esw -> dev )] = true;
2825- peer_esw -> paired [mlx5_get_dev_index (esw -> dev )] = true;
2844+ err = xa_insert (& esw -> paired , peer_esw_i , peer_esw , GFP_KERNEL );
2845+ if (err )
2846+ goto err_xa ;
2847+
2848+ err = xa_insert (& peer_esw -> paired , esw_i , esw , GFP_KERNEL );
2849+ if (err )
2850+ goto err_peer_xa ;
2851+
28262852 esw -> num_peers ++ ;
28272853 peer_esw -> num_peers ++ ;
28282854 mlx5_devcom_comp_set_ready (devcom , MLX5_DEVCOM_ESW_OFFLOADS , true);
28292855 break ;
28302856
28312857 case ESW_OFFLOADS_DEVCOM_UNPAIR :
2832- if (!esw -> paired [ mlx5_get_dev_index ( peer_esw -> dev )] )
2858+ if (!esw_paired )
28332859 break ;
28342860
28352861 peer_esw -> num_peers -- ;
28362862 esw -> num_peers -- ;
28372863 if (!esw -> num_peers && !peer_esw -> num_peers )
28382864 mlx5_devcom_comp_set_ready (devcom , MLX5_DEVCOM_ESW_OFFLOADS , false);
2839- esw -> paired [ mlx5_get_dev_index ( peer_esw -> dev )] = false ;
2840- peer_esw -> paired [ mlx5_get_dev_index ( esw -> dev )] = false ;
2865+ xa_erase ( & peer_esw -> paired , esw_i ) ;
2866+ xa_erase ( & esw -> paired , peer_esw_i ) ;
28412867 mlx5_esw_offloads_unpair (peer_esw , esw );
28422868 mlx5_esw_offloads_unpair (esw , peer_esw );
28432869 mlx5_esw_offloads_set_ns_peer (esw , peer_esw , false);
@@ -2846,6 +2872,10 @@ static int mlx5_esw_offloads_devcom_event(int event,
28462872
28472873 return 0 ;
28482874
2875+ err_peer_xa :
2876+ xa_erase (& esw -> paired , peer_esw_i );
2877+ err_xa :
2878+ mlx5_esw_offloads_unpair (peer_esw , esw );
28492879err_pair :
28502880 mlx5_esw_offloads_unpair (esw , peer_esw );
28512881err_peer :
@@ -2868,9 +2898,10 @@ void mlx5_esw_offloads_devcom_init(struct mlx5_eswitch *esw)
28682898 if (!MLX5_CAP_ESW (esw -> dev , merged_eswitch ))
28692899 return ;
28702900
2871- if (!mlx5_is_lag_supported (esw -> dev ))
2901+ if (!mlx5_lag_is_supported (esw -> dev ))
28722902 return ;
28732903
2904+ xa_init (& esw -> paired );
28742905 mlx5_devcom_register_component (devcom ,
28752906 MLX5_DEVCOM_ESW_OFFLOADS ,
28762907 mlx5_esw_offloads_devcom_event ,
@@ -2890,14 +2921,15 @@ void mlx5_esw_offloads_devcom_cleanup(struct mlx5_eswitch *esw)
28902921 if (!MLX5_CAP_ESW (esw -> dev , merged_eswitch ))
28912922 return ;
28922923
2893- if (!mlx5_is_lag_supported (esw -> dev ))
2924+ if (!mlx5_lag_is_supported (esw -> dev ))
28942925 return ;
28952926
28962927 mlx5_devcom_send_event (devcom , MLX5_DEVCOM_ESW_OFFLOADS ,
28972928 ESW_OFFLOADS_DEVCOM_UNPAIR ,
28982929 ESW_OFFLOADS_DEVCOM_UNPAIR , esw );
28992930
29002931 mlx5_devcom_unregister_component (devcom , MLX5_DEVCOM_ESW_OFFLOADS );
2932+ xa_destroy (& esw -> paired );
29012933}
29022934
29032935bool mlx5_esw_vport_match_metadata_supported (const struct mlx5_eswitch * esw )
@@ -3929,9 +3961,6 @@ static int mlx5_esw_query_vport_vhca_id(struct mlx5_eswitch *esw, u16 vport_num,
39293961 int err ;
39303962
39313963 * vhca_id = 0 ;
3932- if (mlx5_esw_is_manager_vport (esw , vport_num ) ||
3933- !MLX5_CAP_GEN (esw -> dev , vhca_resource_manager ))
3934- return - EPERM ;
39353964
39363965 query_ctx = kzalloc (query_out_sz , GFP_KERNEL );
39373966 if (!query_ctx )
0 commit comments