@@ -2907,34 +2907,15 @@ static struct rhashtable *get_tc_ht(struct mlx5e_priv *priv)
2907
2907
return & priv -> fs .tc .ht ;
2908
2908
}
2909
2909
2910
- int mlx5e_configure_flower (struct mlx5e_priv * priv ,
2911
- struct tc_cls_flower_offload * f , int flags )
2910
+ static int
2911
+ mlx5e_alloc_flow (struct mlx5e_priv * priv , int attr_size ,
2912
+ struct tc_cls_flower_offload * f , u8 flow_flags ,
2913
+ struct mlx5e_tc_flow_parse_attr * * __parse_attr ,
2914
+ struct mlx5e_tc_flow * * __flow )
2912
2915
{
2913
- struct netlink_ext_ack * extack = f -> common .extack ;
2914
- struct mlx5_eswitch * esw = priv -> mdev -> priv .eswitch ;
2915
2916
struct mlx5e_tc_flow_parse_attr * parse_attr ;
2916
- struct rhashtable * tc_ht = get_tc_ht (priv );
2917
2917
struct mlx5e_tc_flow * flow ;
2918
- int attr_size , err = 0 ;
2919
- u8 flow_flags = 0 ;
2920
-
2921
- get_flags (flags , & flow_flags );
2922
-
2923
- flow = rhashtable_lookup_fast (tc_ht , & f -> cookie , tc_ht_params );
2924
- if (flow ) {
2925
- NL_SET_ERR_MSG_MOD (extack ,
2926
- "flow cookie already exists, ignoring" );
2927
- netdev_warn_once (priv -> netdev , "flow cookie %lx already exists, ignoring\n" , f -> cookie );
2928
- return 0 ;
2929
- }
2930
-
2931
- if (esw && esw -> mode == SRIOV_OFFLOADS ) {
2932
- flow_flags |= MLX5E_TC_FLOW_ESWITCH ;
2933
- attr_size = sizeof (struct mlx5_esw_flow_attr );
2934
- } else {
2935
- flow_flags |= MLX5E_TC_FLOW_NIC ;
2936
- attr_size = sizeof (struct mlx5_nic_flow_attr );
2937
- }
2918
+ int err ;
2938
2919
2939
2920
flow = kzalloc (sizeof (* flow ) + attr_size , GFP_KERNEL );
2940
2921
parse_attr = kvzalloc (sizeof (* parse_attr ), GFP_KERNEL );
@@ -2948,45 +2929,155 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv,
2948
2929
flow -> priv = priv ;
2949
2930
2950
2931
err = parse_cls_flower (priv , flow , & parse_attr -> spec , f );
2951
- if (err < 0 )
2932
+ if (err )
2952
2933
goto err_free ;
2953
2934
2954
- if (flow -> flags & MLX5E_TC_FLOW_ESWITCH ) {
2955
- err = parse_tc_fdb_actions (priv , f -> exts , parse_attr , flow ,
2956
- extack );
2957
- if (err < 0 )
2958
- goto err_free ;
2959
- err = mlx5e_tc_add_fdb_flow (priv , parse_attr , flow , extack );
2960
- } else {
2961
- err = parse_tc_nic_actions (priv , f -> exts , parse_attr , flow ,
2962
- extack );
2963
- if (err < 0 )
2964
- goto err_free ;
2965
- err = mlx5e_tc_add_nic_flow (priv , parse_attr , flow , extack );
2966
- }
2935
+ * __flow = flow ;
2936
+ * __parse_attr = parse_attr ;
2937
+
2938
+ return 0 ;
2967
2939
2940
+ err_free :
2941
+ kfree (flow );
2942
+ kvfree (parse_attr );
2943
+ return err ;
2944
+ }
2945
+
2946
+ static int
2947
+ mlx5e_add_fdb_flow (struct mlx5e_priv * priv ,
2948
+ struct tc_cls_flower_offload * f ,
2949
+ u8 flow_flags ,
2950
+ struct mlx5e_tc_flow * * __flow )
2951
+ {
2952
+ struct netlink_ext_ack * extack = f -> common .extack ;
2953
+ struct mlx5e_tc_flow_parse_attr * parse_attr ;
2954
+ struct mlx5e_tc_flow * flow ;
2955
+ int attr_size , err ;
2956
+
2957
+ flow_flags |= MLX5E_TC_FLOW_ESWITCH ;
2958
+ attr_size = sizeof (struct mlx5_esw_flow_attr );
2959
+ err = mlx5e_alloc_flow (priv , attr_size , f , flow_flags ,
2960
+ & parse_attr , & flow );
2961
+ if (err )
2962
+ goto out ;
2963
+
2964
+ err = parse_tc_fdb_actions (priv , f -> exts , parse_attr , flow , extack );
2965
+ if (err )
2966
+ goto err_free ;
2967
+
2968
+ err = mlx5e_tc_add_fdb_flow (priv , parse_attr , flow , extack );
2968
2969
if (err && err != - EAGAIN )
2969
2970
goto err_free ;
2970
2971
2971
- if (err != - EAGAIN )
2972
+ if (! err )
2972
2973
flow -> flags |= MLX5E_TC_FLOW_OFFLOADED ;
2973
2974
2974
- if (!(flow -> flags & MLX5E_TC_FLOW_ESWITCH ) ||
2975
- !(flow -> esw_attr -> action &
2975
+ if (!(flow -> esw_attr -> action &
2976
2976
MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT ))
2977
2977
kvfree (parse_attr );
2978
2978
2979
- err = rhashtable_insert_fast (tc_ht , & flow -> node , tc_ht_params );
2980
- if (err ) {
2981
- mlx5e_tc_del_flow (priv , flow );
2982
- kfree (flow );
2983
- }
2979
+ * __flow = flow ;
2984
2980
2981
+ return 0 ;
2982
+
2983
+ err_free :
2984
+ kfree (flow );
2985
+ kvfree (parse_attr );
2986
+ out :
2985
2987
return err ;
2988
+ }
2989
+
2990
+ static int
2991
+ mlx5e_add_nic_flow (struct mlx5e_priv * priv ,
2992
+ struct tc_cls_flower_offload * f ,
2993
+ u8 flow_flags ,
2994
+ struct mlx5e_tc_flow * * __flow )
2995
+ {
2996
+ struct netlink_ext_ack * extack = f -> common .extack ;
2997
+ struct mlx5e_tc_flow_parse_attr * parse_attr ;
2998
+ struct mlx5e_tc_flow * flow ;
2999
+ int attr_size , err ;
3000
+
3001
+ flow_flags |= MLX5E_TC_FLOW_NIC ;
3002
+ attr_size = sizeof (struct mlx5_nic_flow_attr );
3003
+ err = mlx5e_alloc_flow (priv , attr_size , f , flow_flags ,
3004
+ & parse_attr , & flow );
3005
+ if (err )
3006
+ goto out ;
3007
+
3008
+ err = parse_tc_nic_actions (priv , f -> exts , parse_attr , flow , extack );
3009
+ if (err )
3010
+ goto err_free ;
3011
+
3012
+ err = mlx5e_tc_add_nic_flow (priv , parse_attr , flow , extack );
3013
+ if (err )
3014
+ goto err_free ;
3015
+
3016
+ flow -> flags |= MLX5E_TC_FLOW_OFFLOADED ;
3017
+ kvfree (parse_attr );
3018
+ * __flow = flow ;
3019
+
3020
+ return 0 ;
2986
3021
2987
3022
err_free :
3023
+ kfree (flow );
2988
3024
kvfree (parse_attr );
3025
+ out :
3026
+ return err ;
3027
+ }
3028
+
3029
+ static int
3030
+ mlx5e_tc_add_flow (struct mlx5e_priv * priv ,
3031
+ struct tc_cls_flower_offload * f ,
3032
+ int flags ,
3033
+ struct mlx5e_tc_flow * * flow )
3034
+ {
3035
+ struct mlx5_eswitch * esw = priv -> mdev -> priv .eswitch ;
3036
+ u8 flow_flags ;
3037
+ int err ;
3038
+
3039
+ get_flags (flags , & flow_flags );
3040
+
3041
+ if (esw && esw -> mode == SRIOV_OFFLOADS )
3042
+ err = mlx5e_add_fdb_flow (priv , f , flow_flags , flow );
3043
+ else
3044
+ err = mlx5e_add_nic_flow (priv , f , flow_flags , flow );
3045
+
3046
+ return err ;
3047
+ }
3048
+
3049
+ int mlx5e_configure_flower (struct mlx5e_priv * priv ,
3050
+ struct tc_cls_flower_offload * f , int flags )
3051
+ {
3052
+ struct netlink_ext_ack * extack = f -> common .extack ;
3053
+ struct rhashtable * tc_ht = get_tc_ht (priv );
3054
+ struct mlx5e_tc_flow * flow ;
3055
+ int err = 0 ;
3056
+
3057
+ flow = rhashtable_lookup_fast (tc_ht , & f -> cookie , tc_ht_params );
3058
+ if (flow ) {
3059
+ NL_SET_ERR_MSG_MOD (extack ,
3060
+ "flow cookie already exists, ignoring" );
3061
+ netdev_warn_once (priv -> netdev ,
3062
+ "flow cookie %lx already exists, ignoring\n" ,
3063
+ f -> cookie );
3064
+ goto out ;
3065
+ }
3066
+
3067
+ err = mlx5e_tc_add_flow (priv , f , flags , & flow );
3068
+ if (err )
3069
+ goto out ;
3070
+
3071
+ err = rhashtable_insert_fast (tc_ht , & flow -> node , tc_ht_params );
3072
+ if (err )
3073
+ goto err_free ;
3074
+
3075
+ return 0 ;
3076
+
3077
+ err_free :
3078
+ mlx5e_tc_del_flow (priv , flow );
2989
3079
kfree (flow );
3080
+ out :
2990
3081
return err ;
2991
3082
}
2992
3083
0 commit comments