Skip to content

Commit a88780a

Browse files
roidayanSaeed Mahameed
authored andcommitted
net/mlx5e: Split TC add rule path for nic vs e-switch
Move to have clear separation on the code path to add nic vs e-switch flows. While here we break the code that deals with adding offloaded TC tool to few smaller stages, each on helper function. Besides getting us simpler and readable code, these are pre-steps for being able to have two HW flows serving one SW TC flow for some e-switch use cases. Signed-off-by: Roi Dayan <[email protected]> Reviewed-by: Or Gerlitz <[email protected]> Signed-off-by: Saeed Mahameed <[email protected]>
1 parent c83954a commit a88780a

File tree

1 file changed

+138
-47
lines changed
  • drivers/net/ethernet/mellanox/mlx5/core

1 file changed

+138
-47
lines changed

drivers/net/ethernet/mellanox/mlx5/core/en_tc.c

Lines changed: 138 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2907,34 +2907,15 @@ static struct rhashtable *get_tc_ht(struct mlx5e_priv *priv)
29072907
return &priv->fs.tc.ht;
29082908
}
29092909

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)
29122915
{
2913-
struct netlink_ext_ack *extack = f->common.extack;
2914-
struct mlx5_eswitch *esw = priv->mdev->priv.eswitch;
29152916
struct mlx5e_tc_flow_parse_attr *parse_attr;
2916-
struct rhashtable *tc_ht = get_tc_ht(priv);
29172917
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;
29382919

29392920
flow = kzalloc(sizeof(*flow) + attr_size, GFP_KERNEL);
29402921
parse_attr = kvzalloc(sizeof(*parse_attr), GFP_KERNEL);
@@ -2948,45 +2929,155 @@ int mlx5e_configure_flower(struct mlx5e_priv *priv,
29482929
flow->priv = priv;
29492930

29502931
err = parse_cls_flower(priv, flow, &parse_attr->spec, f);
2951-
if (err < 0)
2932+
if (err)
29522933
goto err_free;
29532934

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;
29672939

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);
29682969
if (err && err != -EAGAIN)
29692970
goto err_free;
29702971

2971-
if (err != -EAGAIN)
2972+
if (!err)
29722973
flow->flags |= MLX5E_TC_FLOW_OFFLOADED;
29732974

2974-
if (!(flow->flags & MLX5E_TC_FLOW_ESWITCH) ||
2975-
!(flow->esw_attr->action &
2975+
if (!(flow->esw_attr->action &
29762976
MLX5_FLOW_CONTEXT_ACTION_PACKET_REFORMAT))
29772977
kvfree(parse_attr);
29782978

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;
29842980

2981+
return 0;
2982+
2983+
err_free:
2984+
kfree(flow);
2985+
kvfree(parse_attr);
2986+
out:
29852987
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;
29863021

29873022
err_free:
3023+
kfree(flow);
29883024
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);
29893079
kfree(flow);
3080+
out:
29903081
return err;
29913082
}
29923083

0 commit comments

Comments
 (0)